66from _pytest .fixtures import FixtureRequest
77from selenium import webdriver
88from selenium .common import WebDriverException
9+ from selenium .webdriver .support .wait import WebDriverWait
10+ from selenium .webdriver .support import expected_conditions as EC
911
1012import requestium
1113
@@ -39,7 +41,9 @@ def _create_chrome_driver(headless: bool) -> webdriver.Chrome:
3941 options .add_argument ("--disable-dev-shm-usage" )
4042 if headless :
4143 options .add_argument ("--headless=new" )
42- return webdriver .Chrome (options = options )
44+ driver = webdriver .Chrome (options = options )
45+ WebDriverWait (driver , 5 ).until (EC .number_of_windows_to_be (1 ))
46+ return driver
4347
4448
4549def _create_firefox_driver (headless : bool ) -> webdriver .Firefox :
@@ -50,7 +54,9 @@ def _create_firefox_driver(headless: bool) -> webdriver.Firefox:
5054 options .set_preference ("network.http.use-cache" , False )
5155 if headless :
5256 options .add_argument ("--headless" )
53- return webdriver .Firefox (options = options )
57+ driver = webdriver .Firefox (options = options )
58+ WebDriverWait (driver , 5 ).until (EC .number_of_windows_to_be (1 ))
59+ return driver
5460
5561
5662@pytest .fixture (
@@ -76,3 +82,19 @@ def session(request: FixtureRequest) -> Generator[requestium.Session, None, None
7682
7783 with contextlib .suppress (WebDriverException , OSError ):
7884 driver .quit ()
85+
86+
87+ @pytest .fixture (autouse = True )
88+ def ensure_valid_session (session : requestium .Session ) -> None :
89+ """Skip test if browser context is discarded."""
90+ try :
91+ _ = session .driver .current_url
92+ _ = session .driver .window_handles
93+ except WebDriverException as e :
94+ if "Browsing context has been discarded" not in str (e ):
95+ raise
96+
97+ try :
98+ session .driver .switch_to .new_window ("tab" )
99+ except WebDriverException :
100+ pytest .skip ("Browser context discarded and cannot be recovered" )
0 commit comments