2323import pytest
2424
2525from selenium import webdriver
26+ from selenium .common .exceptions import WebDriverException
2627from selenium .webdriver .remote .server import Server
2728from test .selenium .webdriver .common .network import get_lan_ip
2829from test .selenium .webdriver .common .webserver import SimpleWebServer
@@ -101,7 +102,6 @@ def pytest_generate_tests(metafunc):
101102 metafunc .parametrize ("driver" , metafunc .config .option .drivers , indirect = True )
102103
103104
104- driver_instance = None
105105selenium_driver = None
106106
107107
@@ -276,7 +276,8 @@ def service(self):
276276
277277 @property
278278 def driver (self ):
279- self ._driver = self ._initialize_driver ()
279+ if self ._driver is None :
280+ self ._driver = self ._initialize_driver ()
280281 return self ._driver
281282
282283 @property
@@ -297,21 +298,15 @@ def _initialize_driver(self):
297298 kwargs ["service" ] = self .service
298299 return getattr (webdriver , self .driver_class )(** kwargs )
299300
300- @property
301301 def stop_driver (self ):
302- def fin ():
303- global driver_instance
304- if self ._driver is not None :
305- self ._driver .quit ()
306- self ._driver = None
307- driver_instance = None
308-
309- return fin
302+ driver_to_stop = self ._driver
303+ self ._driver = None
304+ if driver_to_stop is not None :
305+ driver_to_stop .quit ()
310306
311307
312308@pytest .fixture (scope = "function" )
313309def driver (request ):
314- global driver_instance
315310 global selenium_driver
316311 driver_class = getattr (request , "param" , "Chrome" ).lower ()
317312
@@ -345,38 +340,43 @@ def driver(request):
345340
346341 request .addfinalizer (selenium_driver .stop_driver )
347342
348- if driver_instance is None :
349- driver_instance = selenium_driver .driver
350-
351- yield driver_instance
352343 # Close the browser after BiDi tests. Those make event subscriptions
353344 # and doesn't seems to be stable enough, causing the flakiness of the
354345 # subsequent tests.
355346 # Remove this when BiDi implementation and API is stable.
356- if selenium_driver .bidi :
347+ if selenium_driver is not None and selenium_driver .bidi :
357348 request .addfinalizer (selenium_driver .stop_driver )
358349
350+ yield selenium_driver .driver
351+
359352 if request .node .get_closest_marker ("no_driver_after_test" ):
360- driver_instance = None
353+ if selenium_driver is not None :
354+ try :
355+ selenium_driver .stop_driver ()
356+ except WebDriverException :
357+ pass
358+ except Exception :
359+ raise
360+ selenium_driver = None
361361
362362
363363@pytest .fixture (scope = "session" , autouse = True )
364364def stop_driver (request ):
365365 def fin ():
366- global driver_instance
367- if driver_instance is not None :
368- driver_instance . quit ()
369- driver_instance = None
366+ global selenium_driver
367+ if selenium_driver is not None :
368+ selenium_driver . stop_driver ()
369+ selenium_driver = None
370370
371371 request .addfinalizer (fin )
372372
373373
374374def pytest_exception_interact (node , call , report ):
375375 if report .failed :
376- global driver_instance
377- if driver_instance is not None :
378- driver_instance . quit ()
379- driver_instance = None
376+ global selenium_driver
377+ if selenium_driver is not None :
378+ selenium_driver . stop_driver ()
379+ selenium_driver = None
380380
381381
382382@pytest .fixture
0 commit comments