Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/py/test/selenium/webdriver/common/api_request_context_tests.py
10193 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 json
19
import tempfile
20
from pathlib import Path
21
22
import pytest
23
24
from selenium.webdriver.common.api_request_context import APIRequestContext, APIRequestFailure
25
26
27
@pytest.fixture(autouse=True)
28
def setup(driver, pages):
29
driver.get(pages.url("simpleTest.html"))
30
driver.delete_all_cookies()
31
32
33
def test_request_initialized(driver):
34
assert driver.request is not None
35
36
37
def test_request_returns_same_instance(driver):
38
first = driver.request
39
second = driver.request
40
assert first is second
41
42
43
def test_get_request(driver, pages):
44
response = driver.request.get(pages.url("simpleTest.html"))
45
assert response.status == 200
46
assert response.ok
47
assert "html" in response.text().lower()
48
49
50
def test_get_nonexistent_page(driver, pages):
51
response = driver.request.get(pages.url("nonexistent_page_xyz.html"))
52
assert response.status == 404
53
assert not response.ok
54
55
56
def test_response_status_text(driver, pages):
57
response = driver.request.get(pages.url("simpleTest.html"))
58
assert response.status_text == "OK"
59
response_404 = driver.request.get(pages.url("nonexistent_page_xyz.html"))
60
# The webserver sends a custom reason phrase with send_error(),
61
# so check it's non-empty rather than an exact string.
62
assert response_404.status_text
63
assert "Not Found" in response_404.status_text
64
65
66
def test_head_request(driver, pages):
67
response = driver.request.head(pages.url("simpleTest.html"))
68
assert response.status == 200
69
assert response.body() == b""
70
71
72
def test_post_json(driver, pages):
73
response = driver.request.post(
74
pages.url("echo_body"),
75
json_data={"key": "value"},
76
)
77
assert response.status == 200
78
body = json.loads(response.text())
79
assert body["key"] == "value"
80
81
82
def test_post_form_data(driver, pages):
83
response = driver.request.post(
84
pages.url("echo_body"),
85
data={"field": "value"},
86
)
87
assert response.status == 200
88
assert "field=value" in response.text()
89
90
91
def test_post_form_kwarg(driver, pages):
92
response = driver.request.post(
93
pages.url("echo_body"),
94
form={"username": "testuser", "password": "testpass"},
95
)
96
assert response.status == 200
97
text = response.text()
98
assert "username=testuser" in text
99
assert "password=testpass" in text
100
101
102
def test_browser_cookies_sent_with_request(driver, pages):
103
driver.add_cookie({"name": "test_cookie", "value": "hello123"})
104
response = driver.request.get(pages.url("echo_headers"))
105
assert response.status == 200
106
assert "hello123" in response.text()
107
108
109
def test_response_cookies_synced_to_browser(driver, pages):
110
driver.request.get(pages.url("set_cookie?name=api_cookie&value=synced"))
111
cookie = driver.get_cookie("api_cookie")
112
assert cookie is not None
113
assert cookie["value"] == "synced"
114
115
116
def test_response_json(driver, pages):
117
response = driver.request.get(pages.url("echo_json"))
118
data = response.json()
119
assert isinstance(data, dict)
120
assert data["status"] == "ok"
121
122
123
def test_response_text(driver, pages):
124
response = driver.request.get(pages.url("echo_json"))
125
text = response.text()
126
assert isinstance(text, str)
127
assert "ok" in text
128
129
130
def test_response_body_bytes(driver, pages):
131
response = driver.request.get(pages.url("echo_json"))
132
body = response.body()
133
assert isinstance(body, bytes)
134
assert b"ok" in body
135
136
137
def test_response_dispose(driver, pages):
138
response = driver.request.get(pages.url("echo_json"))
139
assert len(response.body()) > 0
140
response.dispose()
141
assert response.body() == b""
142
143
144
def test_response_headers(driver, pages):
145
response = driver.request.get(pages.url("echo_json"))
146
assert "content-type" in response.headers
147
148
149
def test_custom_headers(driver, pages):
150
response = driver.request.get(
151
pages.url("echo_headers"),
152
headers={"X-Custom-Header": "custom_value_123"},
153
)
154
assert response.status == 200
155
assert "custom_value_123" in response.text()
156
157
158
def test_base_url(driver, pages):
159
ctx = APIRequestContext(driver, base_url=pages.url(""))
160
response = ctx.get("simpleTest.html")
161
assert response.status == 200
162
assert "html" in response.text().lower()
163
ctx.dispose()
164
165
166
def test_isolated_context_no_browser_sync(driver, pages):
167
driver.delete_all_cookies()
168
isolated = driver.request.new_context()
169
isolated.get(pages.url("set_cookie?name=isolated_cookie&value=secret"))
170
assert driver.get_cookie("isolated_cookie") is None
171
isolated.dispose()
172
173
174
def test_storage_state_export(driver):
175
driver.add_cookie({"name": "export_cookie", "value": "export_val"})
176
state = driver.request.get_storage_state()
177
assert "cookies" in state
178
names = [c["name"] for c in state["cookies"]]
179
assert "export_cookie" in names
180
181
182
def test_storage_state_to_file(driver):
183
driver.add_cookie({"name": "file_cookie", "value": "file_val"})
184
with tempfile.NamedTemporaryFile(suffix=".json", delete=False, mode="w") as f:
185
tmp_path = f.name
186
try:
187
driver.request.get_storage_state(path=tmp_path)
188
data = json.loads(Path(tmp_path).read_text())
189
assert "cookies" in data
190
names = [c["name"] for c in data["cookies"]]
191
assert "file_cookie" in names
192
finally:
193
Path(tmp_path).unlink(missing_ok=True)
194
195
196
def test_new_context_with_storage_state(driver):
197
driver.add_cookie({"name": "state_cookie", "value": "state_val"})
198
with tempfile.NamedTemporaryFile(suffix=".json", delete=False, mode="w") as f:
199
tmp_path = f.name
200
try:
201
driver.request.get_storage_state(path=tmp_path)
202
isolated = driver.request.new_context(storage_state=tmp_path)
203
state = isolated.get_storage_state()
204
names = [c["name"] for c in state["cookies"]]
205
assert "state_cookie" in names
206
isolated.dispose()
207
finally:
208
Path(tmp_path).unlink(missing_ok=True)
209
210
211
def test_fetch_with_custom_method(driver, pages):
212
response = driver.request.fetch(pages.url("simpleTest.html"), method="GET")
213
assert response.status == 200
214
assert response.ok
215
216
217
def test_fail_on_status_code_raises_on_404(driver, pages):
218
with pytest.raises(APIRequestFailure) as exc_info:
219
driver.request.get(
220
pages.url("nonexistent_page_xyz.html"),
221
fail_on_status_code=True,
222
)
223
assert exc_info.value.response.status == 404
224
assert not exc_info.value.response.ok
225
assert "404" in str(exc_info.value)
226
assert "Not Found" in str(exc_info.value)
227
228
229
def test_fail_on_status_code_no_raise_on_200(driver, pages):
230
response = driver.request.get(
231
pages.url("simpleTest.html"),
232
fail_on_status_code=True,
233
)
234
assert response.status == 200
235
236
237
def test_fail_on_status_code_instance_default(driver, pages):
238
ctx = APIRequestContext(driver, fail_on_status_code=True)
239
with pytest.raises(APIRequestFailure):
240
ctx.get(pages.url("nonexistent_page_xyz.html"))
241
ctx.dispose()
242
243
244
def test_fail_on_status_code_per_request_overrides_default(driver, pages):
245
ctx = APIRequestContext(driver, fail_on_status_code=True)
246
response = ctx.get(
247
pages.url("nonexistent_page_xyz.html"),
248
fail_on_status_code=False,
249
)
250
assert response.status == 404
251
ctx.dispose()
252
253