Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/py/test/selenium/webdriver/common/bidi_network_tests.py
4091 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 time
19
20
import pytest
21
22
from selenium.common.exceptions import WebDriverException
23
from selenium.webdriver.common.bidi.browsing_context import ReadinessState
24
from selenium.webdriver.common.bidi.network import Request
25
from selenium.webdriver.common.by import By
26
27
28
def test_network_initialized(driver):
29
assert driver.network is not None
30
31
32
def test_add_intercept(driver, pages):
33
result = driver.network._add_intercept()
34
assert result is not None, "Intercept not added"
35
36
# Clean up
37
driver.network._remove_intercept(result["intercept"])
38
39
40
def test_remove_intercept(driver):
41
result = driver.network._add_intercept()
42
driver.network._remove_intercept(result["intercept"])
43
assert driver.network.intercepts == [], "Intercept not removed"
44
45
46
def test_add_and_remove_request_handler(driver, pages):
47
requests = []
48
49
def callback(request: Request):
50
requests.append(request)
51
52
callback_id = driver.network.add_request_handler("before_request", callback)
53
assert callback_id is not None, "Request handler not added"
54
driver.network.remove_request_handler("before_request", callback_id)
55
pages.load("formPage.html")
56
assert not requests, "Requests intercepted"
57
assert driver.find_element(By.NAME, "login").is_displayed(), "Request not continued"
58
59
60
def test_clear_request_handlers(driver, pages):
61
requests = []
62
63
def callback(request: Request):
64
requests.append(request)
65
66
callback_id_1 = driver.network.add_request_handler("before_request", callback)
67
assert callback_id_1 is not None, "Request handler not added"
68
callback_id_2 = driver.network.add_request_handler("before_request", callback)
69
assert callback_id_2 is not None, "Request handler not added"
70
71
driver.network.clear_request_handlers()
72
73
pages.load("formPage.html")
74
assert not requests, "Requests intercepted"
75
assert driver.find_element(By.NAME, "login").is_displayed(), "Request not continued"
76
77
78
def test_continue_request(driver, pages):
79
exceptions = []
80
81
def callback(request: Request):
82
try:
83
request.continue_request()
84
except WebDriverException as e:
85
exceptions.append(e)
86
87
callback_id = driver.network.add_request_handler("before_request", callback)
88
assert callback_id is not None, "Request handler not added"
89
url = pages.url("formPage.html")
90
driver.browsing_context.navigate(context=driver.current_window_handle, url=url, wait=ReadinessState.COMPLETE)
91
assert driver.find_element(By.NAME, "login").is_displayed(), "Request not continued"
92
assert len(exceptions) == 0, "Exception raised when continuing request in handler callback"
93
94
driver.network.remove_request_handler("before_request", callback_id)
95
96
97
def test_continue_with_auth(driver):
98
callback_id = driver.network.add_auth_handler("postman", "password")
99
assert callback_id is not None, "Request handler not added"
100
driver.browsing_context.navigate(
101
context=driver.current_window_handle, url="https://postman-echo.com/basic-auth", wait=ReadinessState.COMPLETE
102
)
103
assert "authenticated" in driver.page_source, "Authorization failed"
104
105
driver.network.remove_auth_handler(callback_id)
106
107
108
def test_remove_auth_handler(driver):
109
callback_id = driver.network.add_auth_handler("user", "passwd")
110
assert callback_id is not None, "Request handler not added"
111
driver.network.remove_auth_handler(callback_id)
112
assert driver.network.intercepts == [], "Intercept not removed"
113
114
115
def test_handler_with_classic_navigation(driver, pages):
116
"""Verify request handlers also work with classic navigation."""
117
browser_name = driver.caps["browserName"]
118
if browser_name.lower() in ("chrome", "microsoftedge"):
119
pytest.skip(reason=f"Request handlers don't yet work in {browser_name} using classic navigation")
120
121
exceptions = []
122
123
def callback(request: Request):
124
try:
125
request.continue_request()
126
except WebDriverException as e:
127
exceptions.append(e)
128
129
callback_id = driver.network.add_request_handler("before_request", callback)
130
assert callback_id is not None, "Request handler not added"
131
pages.load("formPage.html")
132
assert len(exceptions) == 0, "Exception raised in handler callback"
133
134
driver.network.remove_request_handler("before_request", callback_id)
135
136
137
@pytest.mark.xfail_chrome(reason="Data URLs in Network requests are not implemented in Chrome yet")
138
@pytest.mark.xfail_edge(reason="Data URLs in Network requests are not implemented in Edge yet")
139
@pytest.mark.xfail_firefox(reason="Data URLs in Network requests are not implemented in Firefox yet")
140
def test_handler_with_data_url_request(driver, pages):
141
data_requests = []
142
exceptions = []
143
144
def callback(request: Request):
145
if request.url.startswith("data:"):
146
data_requests.append(request)
147
try:
148
request.continue_request()
149
except WebDriverException as e:
150
exceptions.append(e)
151
152
callback_id = driver.network.add_request_handler("before_request", callback)
153
url = pages.url("data_url.html")
154
driver.browsing_context.navigate(context=driver.current_window_handle, url=url, wait=ReadinessState.COMPLETE)
155
time.sleep(1) # give callback time to complete
156
assert driver.find_element(By.ID, "data-url-image").is_displayed()
157
assert len(data_requests) > 0, "BiDi event not captured"
158
assert len(exceptions) == 0, "Exception raised when continuing request in handler callback"
159
160
driver.network.remove_request_handler("before_request", callback_id)
161
162