Skip to content

Commit fbb2a9c

Browse files
authored
[py]: reuse driver in case of bidi tests (#16597)
1 parent 59cfe04 commit fbb2a9c

File tree

4 files changed

+36
-7
lines changed

4 files changed

+36
-7
lines changed

py/conftest.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -343,12 +343,28 @@ def driver(request):
343343

344344
request.addfinalizer(selenium_driver.stop_driver)
345345

346-
# Close the browser after BiDi tests. Those make event subscriptions
347-
# and doesn't seems to be stable enough, causing the flakiness of the
348-
# subsequent tests.
349-
# Remove this when BiDi implementation and API is stable.
346+
# For BiDi tests, only restart driver when explicitly marked as needing fresh driver.
347+
# Tests marked with @pytest.mark.needs_fresh_driver get full driver restart for test isolation.
348+
# Cleanup after every test is recommended.
350349
if selenium_driver is not None and selenium_driver.bidi:
351-
request.addfinalizer(selenium_driver.stop_driver)
350+
if request.node.get_closest_marker("needs_fresh_driver"):
351+
request.addfinalizer(selenium_driver.stop_driver)
352+
else:
353+
354+
def ensure_valid_window():
355+
try:
356+
driver = selenium_driver._driver
357+
if driver:
358+
try:
359+
# Check if current window is still valid
360+
driver.current_window_handle
361+
except Exception:
362+
# restart driver
363+
selenium_driver.stop_driver()
364+
except Exception:
365+
pass
366+
367+
request.addfinalizer(ensure_valid_window)
352368

353369
yield selenium_driver.driver
354370

py/pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ markers = [
8686
"xfail_safari: Tests expected to fail in Safari",
8787
"xfail_webkitgtk: Tests expected to fail in WebKitGTK",
8888
"xfail_wpewebkit: Tests expected to fail in WPEWebKit",
89-
"no_driver_after_test: If there are no drivers after the test it will create a new one."
89+
"no_driver_after_test: If there are no drivers after the test it will create a new one.",
90+
"needs_fresh_driver: Mark tests that may need a fresh driver instance for proper isolation."
9091
]
9192
python_files = ["test_*.py", "*_test.py", "*_tests.py"]
9293
testpaths = ["test"]

py/test/selenium/webdriver/common/bidi_browsing_context_tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,7 @@ def on_user_prompt_opened(info):
721721
create_alert_page(driver, pages)
722722
driver.find_element(By.ID, "alert").click()
723723
WebDriverWait(driver, 5).until(EC.alert_is_present())
724+
WebDriverWait(driver, 5).until(lambda d: len(events_received) > 0)
724725

725726
assert len(events_received) == 1
726727
assert events_received[0].type == "alert"

py/test/selenium/webdriver/common/bidi_network_tests.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ def test_add_intercept(driver, pages):
3333
result = driver.network._add_intercept()
3434
assert result is not None, "Intercept not added"
3535

36+
# Clean up
37+
driver.network._remove_intercept(result["intercept"])
38+
3639

3740
def test_remove_intercept(driver):
3841
result = driver.network._add_intercept()
@@ -88,6 +91,8 @@ def callback(request: Request):
8891
assert driver.find_element(By.NAME, "login").is_displayed(), "Request not continued"
8992
assert len(exceptions) == 0, "Exception raised when continuing request in handler callback"
9093

94+
driver.network.remove_request_handler("before_request", callback_id)
95+
9196

9297
def test_continue_with_auth(driver):
9398
callback_id = driver.network.add_auth_handler("postman", "password")
@@ -97,6 +102,8 @@ def test_continue_with_auth(driver):
97102
)
98103
assert "authenticated" in driver.page_source, "Authorization failed"
99104

105+
driver.network.remove_auth_handler(callback_id)
106+
100107

101108
def test_remove_auth_handler(driver):
102109
callback_id = driver.network.add_auth_handler("user", "passwd")
@@ -124,6 +131,8 @@ def callback(request: Request):
124131
pages.load("formPage.html")
125132
assert len(exceptions) == 0, "Exception raised in handler callback"
126133

134+
driver.network.remove_request_handler("before_request", callback_id)
135+
127136

128137
@pytest.mark.xfail_chrome(reason="Data URLs in Network requests are not implemented in Chrome yet")
129138
@pytest.mark.xfail_edge(reason="Data URLs in Network requests are not implemented in Edge yet")
@@ -140,10 +149,12 @@ def callback(request: Request):
140149
except WebDriverException as e:
141150
exceptions.append(e)
142151

143-
driver.network.add_request_handler("before_request", callback)
152+
callback_id = driver.network.add_request_handler("before_request", callback)
144153
url = pages.url("data_url.html")
145154
driver.browsing_context.navigate(context=driver.current_window_handle, url=url, wait=ReadinessState.COMPLETE)
146155
time.sleep(1) # give callback time to complete
147156
assert driver.find_element(By.ID, "data-url-image").is_displayed()
148157
assert len(data_requests) > 0, "BiDi event not captured"
149158
assert len(exceptions) == 0, "Exception raised when continuing request in handler callback"
159+
160+
driver.network.remove_request_handler("before_request", callback_id)

0 commit comments

Comments
 (0)