Skip to content

Commit 83ad5f8

Browse files
authored
[py][bidi]: improve tests to use local no-proxy server (SeleniumHQ#16747)
1 parent 59ef15e commit 83ad5f8

File tree

2 files changed

+47
-41
lines changed

2 files changed

+47
-41
lines changed

py/conftest.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,19 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717

18+
import http.server
1819
import os
20+
import socketserver
1921
import sys
22+
import threading
2023
from dataclasses import dataclass
2124
from pathlib import Path
2225

2326
import pytest
2427

2528
from selenium import webdriver
2629
from selenium.common.exceptions import WebDriverException
30+
from selenium.webdriver.common.utils import free_port
2731
from selenium.webdriver.remote.server import Server
2832
from test.selenium.webdriver.common.network import get_lan_ip
2933
from test.selenium.webdriver.common.webserver import SimpleWebServer
@@ -544,3 +548,31 @@ def chromium_options(request):
544548
options = Driver.clean_options("edge", request)
545549

546550
return options
551+
552+
553+
@pytest.fixture
554+
def proxy_server():
555+
"""Creates HTTP proxy servers with custom response content, cleans up after the test."""
556+
servers = []
557+
558+
def create_server(response_content=b"test response"):
559+
port = free_port()
560+
561+
class CustomHandler(http.server.SimpleHTTPRequestHandler):
562+
def do_GET(self):
563+
self.send_response(200)
564+
self.end_headers()
565+
self.wfile.write(response_content)
566+
567+
server = socketserver.TCPServer(("localhost", port), CustomHandler)
568+
thread = threading.Thread(target=server.serve_forever, daemon=True)
569+
thread.start()
570+
571+
servers.append(server)
572+
return {"port": port, "server": server}
573+
574+
yield create_server
575+
576+
for server in servers:
577+
server.shutdown()
578+
server.server_close()

py/test/selenium/webdriver/common/bidi_browser_tests.py

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717

18-
import http.server
1918
import os
20-
import socketserver
21-
import threading
2219

2320
import pytest
2421

@@ -28,26 +25,10 @@
2825
from selenium.webdriver.common.bidi.session import UserPromptHandler, UserPromptHandlerType
2926
from selenium.webdriver.common.by import By
3027
from selenium.webdriver.common.proxy import Proxy, ProxyType
31-
from selenium.webdriver.common.utils import free_port
3228
from selenium.webdriver.common.window import WindowTypes
3329
from selenium.webdriver.support.ui import WebDriverWait
3430

3531

36-
class FakeProxyHandler(http.server.SimpleHTTPRequestHandler):
37-
def do_GET(self):
38-
print(f"[Fake Proxy] Intercepted request to: {self.path}")
39-
self.send_response(200)
40-
self.end_headers()
41-
self.wfile.write(b"proxied response")
42-
43-
44-
def start_fake_proxy(port):
45-
server = socketserver.TCPServer(("localhost", port), FakeProxyHandler)
46-
thread = threading.Thread(target=server.serve_forever, daemon=True)
47-
thread.start()
48-
return server
49-
50-
5132
def test_browser_initialized(driver):
5233
"""Test that the browser module is initialized properly."""
5334
assert driver.browser is not None
@@ -165,21 +146,21 @@ def test_create_user_context_with_direct_proxy(driver):
165146

166147

167148
@pytest.mark.xfail_chrome(reason="Chrome auto upgrades HTTP to HTTPS in untrusted networks like CI environments")
168-
@pytest.mark.xfail_firefox(reason="Firefox proxy settings are different")
169-
@pytest.mark.xfail_remote
170-
def test_create_user_context_with_manual_proxy_all_params(driver):
149+
def test_create_user_context_with_manual_proxy_all_params(driver, proxy_server):
171150
"""Test creating a user context with manual proxy configuration."""
172-
# Start a fake proxy server
173-
port = free_port()
174-
fake_proxy_server = start_fake_proxy(port=port)
151+
create_proxy_server = proxy_server(response_content=b"proxied response")
152+
no_proxy_server = proxy_server(response_content=b"direct connection - not proxied")
153+
154+
proxy_port = create_proxy_server["port"]
155+
no_proxy_port = no_proxy_server["port"]
175156

176157
proxy = Proxy()
177158
proxy.proxy_type = ProxyType.MANUAL
178-
proxy.http_proxy = f"localhost:{port}"
179-
proxy.ssl_proxy = f"localhost:{port}"
180-
proxy.socks_proxy = f"localhost:{port}"
159+
proxy.http_proxy = f"localhost:{proxy_port}"
160+
proxy.ssl_proxy = f"localhost:{proxy_port}"
161+
proxy.socks_proxy = f"localhost:{proxy_port}"
181162
proxy.socks_version = 5
182-
proxy.no_proxy = ["the-internet.herokuapp.com"]
163+
proxy.no_proxy = [f"localhost:{no_proxy_port}"]
183164

184165
user_context = driver.browser.create_user_context(proxy=proxy)
185166

@@ -189,9 +170,9 @@ def test_create_user_context_with_manual_proxy_all_params(driver):
189170

190171
try:
191172
# Visit no proxy site, it should bypass proxy
192-
driver.get("http://the-internet.herokuapp.com/")
173+
driver.get(f"http://localhost:{no_proxy_port}/")
193174
body_text = driver.find_element(By.TAG_NAME, "body").text.lower()
194-
assert "welcome to the-internet" in body_text
175+
assert "direct connection - not proxied" in body_text
195176

196177
# Visit a site that should be proxied
197178
driver.get("http://example.com/")
@@ -201,18 +182,13 @@ def test_create_user_context_with_manual_proxy_all_params(driver):
201182

202183
finally:
203184
driver.browser.remove_user_context(user_context)
204-
fake_proxy_server.shutdown()
205-
fake_proxy_server.server_close()
206185

207186

208187
@pytest.mark.xfail_chrome(reason="Chrome auto upgrades HTTP to HTTPS in untrusted networks like CI environments")
209-
@pytest.mark.xfail_firefox(reason="Firefox proxy settings are different")
210-
@pytest.mark.xfail_remote
211-
def test_create_user_context_with_proxy_and_accept_insecure_certs(driver):
188+
def test_create_user_context_with_proxy_and_accept_insecure_certs(driver, proxy_server):
212189
"""Test creating a user context with both acceptInsecureCerts and proxy parameters."""
213-
# Start fake proxy server
214-
port = free_port()
215-
fake_proxy_server = start_fake_proxy(port=port)
190+
create_proxy_server = proxy_server(response_content=b"proxied response")
191+
port = create_proxy_server["port"]
216192

217193
proxy = Proxy()
218194
proxy.proxy_type = ProxyType.MANUAL
@@ -238,8 +214,6 @@ def test_create_user_context_with_proxy_and_accept_insecure_certs(driver):
238214

239215
finally:
240216
driver.browser.remove_user_context(user_context)
241-
fake_proxy_server.shutdown()
242-
fake_proxy_server.server_close()
243217

244218

245219
def test_create_user_context_with_unhandled_prompt_behavior(driver, pages):

0 commit comments

Comments
 (0)