Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions py/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,12 +343,28 @@ def driver(request):

request.addfinalizer(selenium_driver.stop_driver)

# Close the browser after BiDi tests. Those make event subscriptions
# and doesn't seems to be stable enough, causing the flakiness of the
# subsequent tests.
# Remove this when BiDi implementation and API is stable.
# For BiDi tests, only restart driver when explicitly marked as needing fresh driver.
# Tests marked with @pytest.mark.needs_fresh_driver get full driver restart for test isolation.
# Cleanup after every test is recommended.
if selenium_driver is not None and selenium_driver.bidi:
request.addfinalizer(selenium_driver.stop_driver)
if request.node.get_closest_marker("needs_fresh_driver"):
request.addfinalizer(selenium_driver.stop_driver)
else:

def ensure_valid_window():
try:
driver = selenium_driver._driver
if driver:
try:
# Check if current window is still valid
driver.current_window_handle
except Exception:
# restart driver
selenium_driver.stop_driver()
except Exception:
pass

request.addfinalizer(ensure_valid_window)

yield selenium_driver.driver

Expand Down
3 changes: 2 additions & 1 deletion py/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ markers = [
"xfail_safari: Tests expected to fail in Safari",
"xfail_webkitgtk: Tests expected to fail in WebKitGTK",
"xfail_wpewebkit: Tests expected to fail in WPEWebKit",
"no_driver_after_test: If there are no drivers after the test it will create a new one."
"no_driver_after_test: If there are no drivers after the test it will create a new one.",
"needs_fresh_driver: Mark tests that may need a fresh driver instance for proper isolation."
]
python_files = ["test_*.py", "*_test.py", "*_tests.py"]
testpaths = ["test"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -721,6 +721,7 @@ def on_user_prompt_opened(info):
create_alert_page(driver, pages)
driver.find_element(By.ID, "alert").click()
WebDriverWait(driver, 5).until(EC.alert_is_present())
WebDriverWait(driver, 5).until(lambda d: len(events_received) > 0)

assert len(events_received) == 1
assert events_received[0].type == "alert"
Expand Down
13 changes: 12 additions & 1 deletion py/test/selenium/webdriver/common/bidi_network_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ def test_add_intercept(driver, pages):
result = driver.network._add_intercept()
assert result is not None, "Intercept not added"

# Clean up
driver.network._remove_intercept(result["intercept"])


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

driver.network.remove_request_handler("before_request", callback_id)


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

driver.network.remove_auth_handler(callback_id)


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

driver.network.remove_request_handler("before_request", callback_id)


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

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

driver.network.remove_request_handler("before_request", callback_id)