Skip to content

Commit f663ed3

Browse files
authored
Error when closing browser did prevent cache clearing (robotframework#1383)
Fixes robotframework#1379
1 parent cf13be1 commit f663ed3

File tree

2 files changed

+89
-3
lines changed

2 files changed

+89
-3
lines changed

src/SeleniumLibrary/keywords/webdrivertools.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from robot.utils import ConnectionCache
2121
from selenium import webdriver
22+
from selenium.common.exceptions import WebDriverException
2223

2324
from SeleniumLibrary.utils import is_falsy, is_truthy, is_noney
2425

@@ -220,17 +221,29 @@ def active_drivers(self):
220221
def close(self):
221222
if self.current:
222223
driver = self.current
223-
driver.quit()
224+
error = self._quit(driver, None)
224225
self.current = self._no_current
225226
self._closed.add(driver)
227+
if error:
228+
raise error
226229

227230
def close_all(self):
231+
error = None
228232
for driver in self._connections:
229233
if driver not in self._closed:
230-
driver.quit()
234+
error = self._quit(driver, error)
231235
self.empty_cache()
236+
if error:
237+
raise error
232238
return self.current
233239

240+
def _quit(self, driver, error):
241+
try:
242+
driver.quit()
243+
except WebDriverException as exception:
244+
error = exception
245+
return error
246+
234247
def get_index(self, alias_or_index):
235248
index = self._get_index(alias_or_index)
236249
try:

utest/test/keywords/test_webdrivercache.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
import unittest
22

3-
from mockito import mock, verify
3+
from mockito import mock, verify, when, unstub
4+
from robot.utils.connectioncache import NoConnection
5+
from selenium.common.exceptions import TimeoutException, RemoteDriverServerException
46

57
from SeleniumLibrary.keywords import WebDriverCache
68

79

810
class WebDriverCacheTests(unittest.TestCase):
911

12+
def tearDown(self):
13+
unstub()
14+
1015
def test_no_current_message(self):
1116
cache = WebDriverCache()
1217
try:
@@ -157,3 +162,71 @@ def test_same_alias_new_browser(self):
157162
cache.close()
158163
index = cache.get_index('bar')
159164
self.assertEqual(index, None)
165+
166+
def test_close_all_cache_first_quite_fails(self):
167+
cache = WebDriverCache()
168+
driver = mock()
169+
when(driver).quit().thenRaise(TimeoutException('timeout.'))
170+
cache.register(driver, 'bar')
171+
with self.assertRaises(TimeoutException):
172+
cache.close_all()
173+
self.verify_cache(cache)
174+
175+
def test_close_all_cache_middle_quite_fails(self):
176+
cache = WebDriverCache()
177+
driver0, driver1, driver2 = mock(), mock(), mock()
178+
when(driver0).quit().thenReturn(None)
179+
when(driver1).quit().thenRaise(TimeoutException('timeout.'))
180+
when(driver2).quit().thenReturn(None)
181+
cache.register(driver0, 'bar0')
182+
cache.register(driver1, 'bar1')
183+
cache.register(driver2, 'bar2')
184+
with self.assertRaises(TimeoutException):
185+
cache.close_all()
186+
self.verify_cache(cache)
187+
188+
def test_close_all_cache_all_quite_fails(self):
189+
cache = WebDriverCache()
190+
driver0, driver1, driver2 = mock(), mock(), mock()
191+
when(driver0).quit().thenRaise(RemoteDriverServerException('stuff.'))
192+
when(driver1).quit().thenRaise(RemoteDriverServerException('stuff.'))
193+
when(driver2).quit().thenRaise(TimeoutException('timeout.'))
194+
cache.register(driver0, 'bar0')
195+
cache.register(driver1, 'bar1')
196+
cache.register(driver2, 'bar2')
197+
with self.assertRaises(TimeoutException):
198+
cache.close_all()
199+
self.verify_cache(cache)
200+
201+
def test_close_all_no_error(self):
202+
cache = WebDriverCache()
203+
driver0, driver1, driver2 = mock(), mock(), mock()
204+
when(driver0).quit().thenReturn(None)
205+
when(driver1).quit().thenReturn(None)
206+
when(driver2).quit().thenReturn(None)
207+
cache.close_all()
208+
self.verify_cache(cache)
209+
210+
def test_close_quite_fails(self):
211+
cache = WebDriverCache()
212+
driver = mock()
213+
when(driver).quit().thenRaise(TimeoutException('timeout.'))
214+
cache.register(driver, 'bar')
215+
with self.assertRaises(TimeoutException):
216+
cache.close()
217+
self.assertTrue(isinstance(cache.current, NoConnection))
218+
self.assertTrue(driver in cache._closed)
219+
220+
def test_close_no_error(self):
221+
cache = WebDriverCache()
222+
driver = mock()
223+
when(driver).quit().thenReturn(None)
224+
cache.register(driver, 'bar')
225+
cache.close()
226+
self.assertTrue(isinstance(cache.current, NoConnection))
227+
self.assertTrue(driver in cache._closed)
228+
229+
def verify_cache(self, cache):
230+
self.assertEqual(cache._connections, [])
231+
self.assertEqual(cache._aliases, {})
232+
self.assertTrue(isinstance(cache.current, NoConnection))

0 commit comments

Comments
 (0)