diff --git a/py/conftest.py b/py/conftest.py index e30bc8eadf31f..9845a613a9c59 100644 --- a/py/conftest.py +++ b/py/conftest.py @@ -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 diff --git a/py/pyproject.toml b/py/pyproject.toml index 93d26901003c7..ea00edd068180 100644 --- a/py/pyproject.toml +++ b/py/pyproject.toml @@ -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"] diff --git a/py/test/selenium/webdriver/common/bidi_browsing_context_tests.py b/py/test/selenium/webdriver/common/bidi_browsing_context_tests.py index edb885e7755ed..fb9941582a395 100644 --- a/py/test/selenium/webdriver/common/bidi_browsing_context_tests.py +++ b/py/test/selenium/webdriver/common/bidi_browsing_context_tests.py @@ -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" diff --git a/py/test/selenium/webdriver/common/bidi_network_tests.py b/py/test/selenium/webdriver/common/bidi_network_tests.py index d6daca7b23d3b..a4de1e4d9e04f 100644 --- a/py/test/selenium/webdriver/common/bidi_network_tests.py +++ b/py/test/selenium/webdriver/common/bidi_network_tests.py @@ -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() @@ -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") @@ -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") @@ -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") @@ -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)