Path: blob/trunk/py/test/selenium/webdriver/common/bidi_browser_tests.py
1865 views
# Licensed to the Software Freedom Conservancy (SFC) under one1# or more contributor license agreements. See the NOTICE file2# distributed with this work for additional information3# regarding copyright ownership. The SFC licenses this file4# to you under the Apache License, Version 2.0 (the5# "License"); you may not use this file except in compliance6# with the License. You may obtain a copy of the License at7#8# http://www.apache.org/licenses/LICENSE-2.09#10# Unless required by applicable law or agreed to in writing,11# software distributed under the License is distributed on an12# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY13# KIND, either express or implied. See the License for the14# specific language governing permissions and limitations15# under the License.1617import http.server18import socketserver19import threading2021import pytest2223from selenium.webdriver.common.bidi.browser import ClientWindowInfo, ClientWindowState24from selenium.webdriver.common.bidi.session import UserPromptHandler, UserPromptHandlerType25from selenium.webdriver.common.by import By26from selenium.webdriver.common.proxy import Proxy, ProxyType27from selenium.webdriver.common.utils import free_port28from selenium.webdriver.common.window import WindowTypes293031class FakeProxyHandler(http.server.SimpleHTTPRequestHandler):32def do_GET(self):33print(f"[Fake Proxy] Intercepted request to: {self.path}")34self.send_response(200)35self.end_headers()36self.wfile.write(b"proxied response")373839def start_fake_proxy(port):40server = socketserver.TCPServer(("localhost", port), FakeProxyHandler)41thread = threading.Thread(target=server.serve_forever, daemon=True)42thread.start()43return server444546def test_browser_initialized(driver):47"""Test that the browser module is initialized properly."""48assert driver.browser is not None495051def test_create_user_context(driver):52"""Test creating a user context."""53user_context = driver.browser.create_user_context()54assert user_context is not None5556# Clean up57driver.browser.remove_user_context(user_context)585960def test_get_user_contexts(driver):61"""Test getting user contexts."""62user_context1 = driver.browser.create_user_context()63user_context2 = driver.browser.create_user_context()6465user_contexts = driver.browser.get_user_contexts()66# it should be 3 since there is a default user context present, therefore >= 267assert len(user_contexts) >= 26869# Clean up70driver.browser.remove_user_context(user_context1)71driver.browser.remove_user_context(user_context2)727374def test_remove_user_context(driver):75"""Test removing a user context."""76user_context1 = driver.browser.create_user_context()77user_context2 = driver.browser.create_user_context()7879user_contexts = driver.browser.get_user_contexts()80assert len(user_contexts) >= 28182driver.browser.remove_user_context(user_context2)8384updated_user_contexts = driver.browser.get_user_contexts()85assert user_context1 in updated_user_contexts86assert user_context2 not in updated_user_contexts8788# Clean up89driver.browser.remove_user_context(user_context1)909192def test_get_client_windows(driver):93"""Test getting client windows."""94client_windows = driver.browser.get_client_windows()9596assert client_windows is not None97assert len(client_windows) > 09899window_info = client_windows[0]100assert isinstance(window_info, ClientWindowInfo)101assert window_info.get_client_window() is not None102assert window_info.get_state() is not None103assert isinstance(window_info.get_state(), str)104assert window_info.get_width() > 0105assert window_info.get_height() > 0106assert isinstance(window_info.is_active(), bool)107assert window_info.get_x() >= 0108assert window_info.get_y() >= 0109110111def test_raises_exception_when_removing_default_user_context(driver):112with pytest.raises(Exception):113driver.browser.remove_user_context("default")114115116def test_client_window_state_constants(driver):117assert ClientWindowState.FULLSCREEN == "fullscreen"118assert ClientWindowState.MAXIMIZED == "maximized"119assert ClientWindowState.MINIMIZED == "minimized"120assert ClientWindowState.NORMAL == "normal"121122123def test_create_user_context_with_accept_insecure_certs(driver):124"""Test creating a user context with accept_insecure_certs parameter."""125INSECURE_TEST_SITE = "https://self-signed.badssl.com/"126user_context = driver.browser.create_user_context(accept_insecure_certs=True)127128bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)129driver.switch_to.window(bc)130assert user_context is not None131assert bc is not None132133driver.get(INSECURE_TEST_SITE)134135h1 = driver.find_element(By.TAG_NAME, "h1")136assert h1.text.strip() == "self-signed.\nbadssl.com"137138# Clean up139driver.browser.remove_user_context(user_context)140141142def test_create_user_context_with_direct_proxy(driver):143"""Test creating a user context with direct proxy configuration."""144proxy = Proxy()145proxy.proxy_type = ProxyType.DIRECT146147user_context = driver.browser.create_user_context(proxy=proxy)148assert user_context is not None149150bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)151driver.switch_to.window(bc)152153# Visiting a site should load directly without proxy154driver.get("http://example.com/")155body_text = driver.find_element(By.TAG_NAME, "body").text.lower()156assert "example domain" in body_text157158# Clean up159driver.browser.remove_user_context(user_context)160161162@pytest.mark.xfail_chrome(reason="Chrome auto upgrades HTTP to HTTPS in untrusted networks like CI environments")163@pytest.mark.xfail_firefox(reason="Firefox proxy settings are different")164@pytest.mark.xfail_remote165def test_create_user_context_with_manual_proxy_all_params(driver):166"""Test creating a user context with manual proxy configuration."""167# Start a fake proxy server168port = free_port()169fake_proxy_server = start_fake_proxy(port=port)170171proxy = Proxy()172proxy.proxy_type = ProxyType.MANUAL173proxy.http_proxy = f"localhost:{port}"174proxy.ssl_proxy = f"localhost:{port}"175proxy.socks_proxy = f"localhost:{port}"176proxy.socks_version = 5177proxy.no_proxy = ["the-internet.herokuapp.com"]178179user_context = driver.browser.create_user_context(proxy=proxy)180181# Create and switch to a new browsing context using this proxy182bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)183driver.switch_to.window(bc)184185try:186# Visit no proxy site, it should bypass proxy187driver.get("http://the-internet.herokuapp.com/")188body_text = driver.find_element(By.TAG_NAME, "body").text.lower()189assert "welcome to the-internet" in body_text190191# Visit a site that should be proxied192driver.get("http://example.com/")193194body_text = driver.find_element("tag name", "body").text195assert "proxied response" in body_text.lower()196197finally:198driver.browser.remove_user_context(user_context)199fake_proxy_server.shutdown()200fake_proxy_server.server_close()201202203@pytest.mark.xfail_chrome(reason="Chrome auto upgrades HTTP to HTTPS in untrusted networks like CI environments")204@pytest.mark.xfail_firefox(reason="Firefox proxy settings are different")205@pytest.mark.xfail_remote206def test_create_user_context_with_proxy_and_accept_insecure_certs(driver):207"""Test creating a user context with both acceptInsecureCerts and proxy parameters."""208# Start fake proxy server209port = free_port()210fake_proxy_server = start_fake_proxy(port=port)211212proxy = Proxy()213proxy.proxy_type = ProxyType.MANUAL214proxy.http_proxy = f"localhost:{port}"215proxy.ssl_proxy = f"localhost:{port}"216proxy.no_proxy = ["self-signed.badssl.com"]217218user_context = driver.browser.create_user_context(accept_insecure_certs=True, proxy=proxy)219220bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)221driver.switch_to.window(bc)222223try:224# Visit a site with an invalid certificate225driver.get("https://self-signed.badssl.com/")226h1 = driver.find_element(By.TAG_NAME, "h1")227assert "badssl.com" in h1.text.lower()228229# Visit a site that should go through the fake proxy230driver.get("http://example.com/")231body_text = driver.find_element(By.TAG_NAME, "body").text232assert "proxied response" in body_text.lower()233234finally:235driver.browser.remove_user_context(user_context)236fake_proxy_server.shutdown()237fake_proxy_server.server_close()238239240def test_create_user_context_with_unhandled_prompt_behavior(driver, pages):241"""Test creating a user context with unhandled prompt behavior configuration."""242prompt_handler = UserPromptHandler(243alert=UserPromptHandlerType.DISMISS, default=UserPromptHandlerType.DISMISS, prompt=UserPromptHandlerType.DISMISS244)245246user_context = driver.browser.create_user_context(unhandled_prompt_behavior=prompt_handler)247assert user_context is not None248249# create a new browsing context with the user context250bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)251assert bc is not None252253driver.switch_to.window(bc)254pages.load("alerts.html")255256# TODO: trigger an alert and test that it is dismissed automatically, currently not working,257# conftest.py unhandled_prompt_behavior set to IGNORE, see if it is related258# driver.find_element(By.ID, "alert").click()259# # accessing title should be possible since alert is auto handled260# assert driver.title == "Testing Alerts"261262# Clean up263driver.browser.remove_user_context(user_context)264265266