Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/py/test/selenium/webdriver/common/bidi_browser_tests.py
1865 views
1
# Licensed to the Software Freedom Conservancy (SFC) under one
2
# or more contributor license agreements. See the NOTICE file
3
# distributed with this work for additional information
4
# regarding copyright ownership. The SFC licenses this file
5
# to you under the Apache License, Version 2.0 (the
6
# "License"); you may not use this file except in compliance
7
# with the License. You may obtain a copy of the License at
8
#
9
# http://www.apache.org/licenses/LICENSE-2.0
10
#
11
# Unless required by applicable law or agreed to in writing,
12
# software distributed under the License is distributed on an
13
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
# KIND, either express or implied. See the License for the
15
# specific language governing permissions and limitations
16
# under the License.
17
18
import http.server
19
import socketserver
20
import threading
21
22
import pytest
23
24
from selenium.webdriver.common.bidi.browser import ClientWindowInfo, ClientWindowState
25
from selenium.webdriver.common.bidi.session import UserPromptHandler, UserPromptHandlerType
26
from selenium.webdriver.common.by import By
27
from selenium.webdriver.common.proxy import Proxy, ProxyType
28
from selenium.webdriver.common.utils import free_port
29
from selenium.webdriver.common.window import WindowTypes
30
31
32
class FakeProxyHandler(http.server.SimpleHTTPRequestHandler):
33
def do_GET(self):
34
print(f"[Fake Proxy] Intercepted request to: {self.path}")
35
self.send_response(200)
36
self.end_headers()
37
self.wfile.write(b"proxied response")
38
39
40
def start_fake_proxy(port):
41
server = socketserver.TCPServer(("localhost", port), FakeProxyHandler)
42
thread = threading.Thread(target=server.serve_forever, daemon=True)
43
thread.start()
44
return server
45
46
47
def test_browser_initialized(driver):
48
"""Test that the browser module is initialized properly."""
49
assert driver.browser is not None
50
51
52
def test_create_user_context(driver):
53
"""Test creating a user context."""
54
user_context = driver.browser.create_user_context()
55
assert user_context is not None
56
57
# Clean up
58
driver.browser.remove_user_context(user_context)
59
60
61
def test_get_user_contexts(driver):
62
"""Test getting user contexts."""
63
user_context1 = driver.browser.create_user_context()
64
user_context2 = driver.browser.create_user_context()
65
66
user_contexts = driver.browser.get_user_contexts()
67
# it should be 3 since there is a default user context present, therefore >= 2
68
assert len(user_contexts) >= 2
69
70
# Clean up
71
driver.browser.remove_user_context(user_context1)
72
driver.browser.remove_user_context(user_context2)
73
74
75
def test_remove_user_context(driver):
76
"""Test removing a user context."""
77
user_context1 = driver.browser.create_user_context()
78
user_context2 = driver.browser.create_user_context()
79
80
user_contexts = driver.browser.get_user_contexts()
81
assert len(user_contexts) >= 2
82
83
driver.browser.remove_user_context(user_context2)
84
85
updated_user_contexts = driver.browser.get_user_contexts()
86
assert user_context1 in updated_user_contexts
87
assert user_context2 not in updated_user_contexts
88
89
# Clean up
90
driver.browser.remove_user_context(user_context1)
91
92
93
def test_get_client_windows(driver):
94
"""Test getting client windows."""
95
client_windows = driver.browser.get_client_windows()
96
97
assert client_windows is not None
98
assert len(client_windows) > 0
99
100
window_info = client_windows[0]
101
assert isinstance(window_info, ClientWindowInfo)
102
assert window_info.get_client_window() is not None
103
assert window_info.get_state() is not None
104
assert isinstance(window_info.get_state(), str)
105
assert window_info.get_width() > 0
106
assert window_info.get_height() > 0
107
assert isinstance(window_info.is_active(), bool)
108
assert window_info.get_x() >= 0
109
assert window_info.get_y() >= 0
110
111
112
def test_raises_exception_when_removing_default_user_context(driver):
113
with pytest.raises(Exception):
114
driver.browser.remove_user_context("default")
115
116
117
def test_client_window_state_constants(driver):
118
assert ClientWindowState.FULLSCREEN == "fullscreen"
119
assert ClientWindowState.MAXIMIZED == "maximized"
120
assert ClientWindowState.MINIMIZED == "minimized"
121
assert ClientWindowState.NORMAL == "normal"
122
123
124
def test_create_user_context_with_accept_insecure_certs(driver):
125
"""Test creating a user context with accept_insecure_certs parameter."""
126
INSECURE_TEST_SITE = "https://self-signed.badssl.com/"
127
user_context = driver.browser.create_user_context(accept_insecure_certs=True)
128
129
bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)
130
driver.switch_to.window(bc)
131
assert user_context is not None
132
assert bc is not None
133
134
driver.get(INSECURE_TEST_SITE)
135
136
h1 = driver.find_element(By.TAG_NAME, "h1")
137
assert h1.text.strip() == "self-signed.\nbadssl.com"
138
139
# Clean up
140
driver.browser.remove_user_context(user_context)
141
142
143
def test_create_user_context_with_direct_proxy(driver):
144
"""Test creating a user context with direct proxy configuration."""
145
proxy = Proxy()
146
proxy.proxy_type = ProxyType.DIRECT
147
148
user_context = driver.browser.create_user_context(proxy=proxy)
149
assert user_context is not None
150
151
bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)
152
driver.switch_to.window(bc)
153
154
# Visiting a site should load directly without proxy
155
driver.get("http://example.com/")
156
body_text = driver.find_element(By.TAG_NAME, "body").text.lower()
157
assert "example domain" in body_text
158
159
# Clean up
160
driver.browser.remove_user_context(user_context)
161
162
163
@pytest.mark.xfail_chrome(reason="Chrome auto upgrades HTTP to HTTPS in untrusted networks like CI environments")
164
@pytest.mark.xfail_firefox(reason="Firefox proxy settings are different")
165
@pytest.mark.xfail_remote
166
def test_create_user_context_with_manual_proxy_all_params(driver):
167
"""Test creating a user context with manual proxy configuration."""
168
# Start a fake proxy server
169
port = free_port()
170
fake_proxy_server = start_fake_proxy(port=port)
171
172
proxy = Proxy()
173
proxy.proxy_type = ProxyType.MANUAL
174
proxy.http_proxy = f"localhost:{port}"
175
proxy.ssl_proxy = f"localhost:{port}"
176
proxy.socks_proxy = f"localhost:{port}"
177
proxy.socks_version = 5
178
proxy.no_proxy = ["the-internet.herokuapp.com"]
179
180
user_context = driver.browser.create_user_context(proxy=proxy)
181
182
# Create and switch to a new browsing context using this proxy
183
bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)
184
driver.switch_to.window(bc)
185
186
try:
187
# Visit no proxy site, it should bypass proxy
188
driver.get("http://the-internet.herokuapp.com/")
189
body_text = driver.find_element(By.TAG_NAME, "body").text.lower()
190
assert "welcome to the-internet" in body_text
191
192
# Visit a site that should be proxied
193
driver.get("http://example.com/")
194
195
body_text = driver.find_element("tag name", "body").text
196
assert "proxied response" in body_text.lower()
197
198
finally:
199
driver.browser.remove_user_context(user_context)
200
fake_proxy_server.shutdown()
201
fake_proxy_server.server_close()
202
203
204
@pytest.mark.xfail_chrome(reason="Chrome auto upgrades HTTP to HTTPS in untrusted networks like CI environments")
205
@pytest.mark.xfail_firefox(reason="Firefox proxy settings are different")
206
@pytest.mark.xfail_remote
207
def test_create_user_context_with_proxy_and_accept_insecure_certs(driver):
208
"""Test creating a user context with both acceptInsecureCerts and proxy parameters."""
209
# Start fake proxy server
210
port = free_port()
211
fake_proxy_server = start_fake_proxy(port=port)
212
213
proxy = Proxy()
214
proxy.proxy_type = ProxyType.MANUAL
215
proxy.http_proxy = f"localhost:{port}"
216
proxy.ssl_proxy = f"localhost:{port}"
217
proxy.no_proxy = ["self-signed.badssl.com"]
218
219
user_context = driver.browser.create_user_context(accept_insecure_certs=True, proxy=proxy)
220
221
bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)
222
driver.switch_to.window(bc)
223
224
try:
225
# Visit a site with an invalid certificate
226
driver.get("https://self-signed.badssl.com/")
227
h1 = driver.find_element(By.TAG_NAME, "h1")
228
assert "badssl.com" in h1.text.lower()
229
230
# Visit a site that should go through the fake proxy
231
driver.get("http://example.com/")
232
body_text = driver.find_element(By.TAG_NAME, "body").text
233
assert "proxied response" in body_text.lower()
234
235
finally:
236
driver.browser.remove_user_context(user_context)
237
fake_proxy_server.shutdown()
238
fake_proxy_server.server_close()
239
240
241
def test_create_user_context_with_unhandled_prompt_behavior(driver, pages):
242
"""Test creating a user context with unhandled prompt behavior configuration."""
243
prompt_handler = UserPromptHandler(
244
alert=UserPromptHandlerType.DISMISS, default=UserPromptHandlerType.DISMISS, prompt=UserPromptHandlerType.DISMISS
245
)
246
247
user_context = driver.browser.create_user_context(unhandled_prompt_behavior=prompt_handler)
248
assert user_context is not None
249
250
# create a new browsing context with the user context
251
bc = driver.browsing_context.create(type=WindowTypes.WINDOW, user_context=user_context)
252
assert bc is not None
253
254
driver.switch_to.window(bc)
255
pages.load("alerts.html")
256
257
# TODO: trigger an alert and test that it is dismissed automatically, currently not working,
258
# conftest.py unhandled_prompt_behavior set to IGNORE, see if it is related
259
# driver.find_element(By.ID, "alert").click()
260
# # accessing title should be possible since alert is auto handled
261
# assert driver.title == "Testing Alerts"
262
263
# Clean up
264
driver.browser.remove_user_context(user_context)
265
266