Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/py/test/selenium/webdriver/common/bidi_storage_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 random
19
import time
20
21
import pytest
22
23
from selenium.webdriver.common.bidi.storage import (
24
BrowsingContextPartitionDescriptor,
25
BytesValue,
26
CookieFilter,
27
PartialCookie,
28
SameSite,
29
StorageKeyPartitionDescriptor,
30
)
31
from selenium.webdriver.common.window import WindowTypes
32
33
34
def generate_unique_key():
35
return f"key_{random.randint(0, 100000)}"
36
37
38
def assert_cookie_is_not_present_with_name(driver, key):
39
assert driver.get_cookie(key) is None
40
document_cookie = get_document_cookie_or_none(driver)
41
if document_cookie is not None:
42
assert key + "=" not in document_cookie
43
44
45
def assert_cookie_is_present_with_name(driver, key):
46
assert driver.get_cookie(key) is not None
47
document_cookie = get_document_cookie_or_none(driver)
48
if document_cookie is not None:
49
assert key + "=" in document_cookie
50
51
52
def assert_cookie_has_value(driver, key, value):
53
assert driver.get_cookie(key)["value"] == value
54
document_cookie = get_document_cookie_or_none(driver)
55
if document_cookie is not None:
56
assert f"{key}={value}" in document_cookie
57
58
59
def assert_no_cookies_are_present(driver):
60
assert len(driver.get_cookies()) == 0
61
document_cookie = get_document_cookie_or_none(driver)
62
if document_cookie is not None:
63
assert document_cookie == ""
64
65
66
def assert_some_cookies_are_present(driver):
67
assert len(driver.get_cookies()) > 0
68
document_cookie = get_document_cookie_or_none(driver)
69
if document_cookie is not None:
70
assert document_cookie != ""
71
72
73
def get_document_cookie_or_none(driver):
74
try:
75
return driver.execute_script("return document.cookie")
76
except Exception:
77
return None
78
79
80
class TestBidiStorage:
81
@pytest.fixture(autouse=True)
82
def setup(self, driver, pages):
83
driver.get(pages.url("simpleTest.html"))
84
driver.delete_all_cookies()
85
86
def test_storage_initialized(self, driver):
87
"""Test that the storage module is initialized properly."""
88
assert driver.storage is not None
89
90
def test_get_cookie_by_name(self, driver, pages, webserver):
91
"""Test getting a cookie by name."""
92
assert_no_cookies_are_present(driver)
93
94
key = generate_unique_key()
95
value = "set"
96
assert_cookie_is_not_present_with_name(driver, key)
97
98
driver.add_cookie({"name": key, "value": value})
99
100
# Test
101
cookie_filter = CookieFilter(name=key, value=BytesValue(BytesValue.TYPE_STRING, "set"))
102
103
result = driver.storage.get_cookies(filter=cookie_filter)
104
105
# Verify
106
assert len(result.cookies) > 0
107
assert result.cookies[0].value.value == value
108
109
@pytest.mark.xfail_chrome
110
@pytest.mark.xfail_edge
111
def test_get_cookie_in_default_user_context(self, driver, pages, webserver):
112
"""Test getting a cookie in the default user context."""
113
assert_no_cookies_are_present(driver)
114
115
window_handle = driver.current_window_handle
116
key = generate_unique_key()
117
value = "set"
118
assert_cookie_is_not_present_with_name(driver, key)
119
120
driver.add_cookie({"name": key, "value": value})
121
122
# Test
123
cookie_filter = CookieFilter(name=key, value=BytesValue(BytesValue.TYPE_STRING, "set"))
124
125
driver.switch_to.new_window(WindowTypes.WINDOW)
126
127
descriptor = BrowsingContextPartitionDescriptor(driver.current_window_handle)
128
129
params = cookie_filter
130
result_after_switching_context = driver.storage.get_cookies(filter=params, partition=descriptor)
131
132
assert len(result_after_switching_context.cookies) > 0
133
assert result_after_switching_context.cookies[0].value.value == value
134
135
driver.switch_to.window(window_handle)
136
137
descriptor = BrowsingContextPartitionDescriptor(driver.current_window_handle)
138
139
result = driver.storage.get_cookies(filter=cookie_filter, partition=descriptor)
140
141
assert len(result.cookies) > 0
142
assert result.cookies[0].value.value == value
143
partition_key = result.partition_key
144
145
assert partition_key.source_origin is not None
146
assert partition_key.user_context is not None
147
assert partition_key.user_context == "default"
148
149
def test_get_cookie_in_a_user_context(self, driver, pages, webserver):
150
"""Test getting a cookie in a user context."""
151
assert_no_cookies_are_present(driver)
152
153
user_context = driver.browser.create_user_context()
154
window_handle = driver.current_window_handle
155
156
key = generate_unique_key()
157
value = "set"
158
159
descriptor = StorageKeyPartitionDescriptor(user_context=user_context)
160
161
parameters = PartialCookie(key, BytesValue(BytesValue.TYPE_STRING, value), webserver.host)
162
163
driver.storage.set_cookie(cookie=parameters, partition=descriptor)
164
165
# Test
166
cookie_filter = CookieFilter(name=key, value=BytesValue(BytesValue.TYPE_STRING, "set"))
167
168
# Create a new window with the user context
169
new_window = driver.browsing_context.create(type=WindowTypes.TAB, user_context=user_context)
170
171
driver.switch_to.window(new_window)
172
173
result = driver.storage.get_cookies(filter=cookie_filter, partition=descriptor)
174
175
assert len(result.cookies) > 0
176
assert result.cookies[0].value.value == value
177
partition_key = result.partition_key
178
179
assert partition_key.user_context is not None
180
assert partition_key.user_context == user_context
181
182
driver.switch_to.window(window_handle)
183
184
browsing_context_partition_descriptor = BrowsingContextPartitionDescriptor(window_handle)
185
186
result1 = driver.storage.get_cookies(filter=cookie_filter, partition=browsing_context_partition_descriptor)
187
188
assert len(result1.cookies) == 0
189
190
# Clean up
191
driver.browsing_context.close(new_window)
192
driver.browser.remove_user_context(user_context)
193
194
def test_add_cookie(self, driver, pages, webserver):
195
"""Test adding a cookie."""
196
assert_no_cookies_are_present(driver)
197
198
key = generate_unique_key()
199
value = "foo"
200
201
parameters = PartialCookie(key, BytesValue(BytesValue.TYPE_STRING, value), webserver.host)
202
assert_cookie_is_not_present_with_name(driver, key)
203
204
# Test
205
driver.storage.set_cookie(cookie=parameters)
206
207
# Verify
208
assert_cookie_has_value(driver, key, value)
209
driver.get(pages.url("simpleTest.html"))
210
assert_cookie_has_value(driver, key, value)
211
212
@pytest.mark.xfail_chrome
213
@pytest.mark.xfail_edge
214
def test_add_and_get_cookie(self, driver, pages, webserver):
215
"""Test adding and getting a cookie with all parameters."""
216
assert_no_cookies_are_present(driver)
217
218
value = BytesValue(BytesValue.TYPE_STRING, "cod")
219
domain = webserver.host
220
221
expiry = int(time.time() + 3600)
222
223
path = "/simpleTest.html"
224
225
cookie = PartialCookie(
226
"fish", value, domain, path=path, http_only=True, secure=False, same_site=SameSite.LAX, expiry=expiry
227
)
228
229
# Test
230
driver.storage.set_cookie(cookie=cookie)
231
232
driver.get(pages.url("simpleTest.html"))
233
234
cookie_filter = CookieFilter(
235
name="fish",
236
value=value,
237
domain=domain,
238
path=path,
239
http_only=True,
240
secure=False,
241
same_site=SameSite.LAX,
242
expiry=expiry,
243
)
244
245
descriptor = BrowsingContextPartitionDescriptor(driver.current_window_handle)
246
247
result = driver.storage.get_cookies(filter=cookie_filter, partition=descriptor)
248
key = result.partition_key
249
250
# Verify
251
assert len(result.cookies) > 0
252
result_cookie = result.cookies[0]
253
254
assert result_cookie.name == "fish"
255
assert result_cookie.value.value == value.value
256
assert result_cookie.domain == domain
257
assert result_cookie.path == path
258
assert result_cookie.http_only is True
259
assert result_cookie.secure is False
260
assert result_cookie.same_site == SameSite.LAX
261
assert result_cookie.expiry == expiry
262
assert key.source_origin is not None
263
assert key.user_context is not None
264
assert key.user_context == "default"
265
266
def test_get_all_cookies(self, driver, pages, webserver):
267
"""Test getting all cookies."""
268
assert_no_cookies_are_present(driver)
269
270
key1 = generate_unique_key()
271
key2 = generate_unique_key()
272
273
assert_cookie_is_not_present_with_name(driver, key1)
274
assert_cookie_is_not_present_with_name(driver, key2)
275
276
# Test
277
params = CookieFilter()
278
result = driver.storage.get_cookies(filter=params)
279
280
count_before = len(result.cookies)
281
282
driver.add_cookie({"name": key1, "value": "value"})
283
driver.add_cookie({"name": key2, "value": "value"})
284
285
driver.get(pages.url("simpleTest.html"))
286
result = driver.storage.get_cookies(filter=params)
287
288
# Verify
289
assert len(result.cookies) == count_before + 2
290
cookie_names = [cookie.name for cookie in result.cookies]
291
assert key1 in cookie_names
292
assert key2 in cookie_names
293
294
def test_delete_all_cookies(self, driver, pages, webserver):
295
"""Test deleting all cookies."""
296
assert_no_cookies_are_present(driver)
297
298
driver.add_cookie({"name": "foo", "value": "set"})
299
assert_some_cookies_are_present(driver)
300
301
# Test
302
driver.storage.delete_cookies(filter=CookieFilter())
303
304
# Verify
305
assert_no_cookies_are_present(driver)
306
307
driver.get(pages.url("simpleTest.html"))
308
assert_no_cookies_are_present(driver)
309
310
def test_delete_cookie_with_name(self, driver, pages, webserver):
311
"""Test deleting a cookie with a specific name."""
312
assert_no_cookies_are_present(driver)
313
314
key1 = generate_unique_key()
315
key2 = generate_unique_key()
316
317
driver.add_cookie({"name": key1, "value": "set"})
318
driver.add_cookie({"name": key2, "value": "set"})
319
320
assert_cookie_is_present_with_name(driver, key1)
321
assert_cookie_is_present_with_name(driver, key2)
322
323
# Test
324
driver.storage.delete_cookies(filter=CookieFilter(name=key1))
325
326
# Verify
327
assert_cookie_is_not_present_with_name(driver, key1)
328
assert_cookie_is_present_with_name(driver, key2)
329
330
driver.get(pages.url("simpleTest.html"))
331
assert_cookie_is_not_present_with_name(driver, key1)
332
assert_cookie_is_present_with_name(driver, key2)
333
334
def test_add_cookies_with_different_paths(self, driver, pages, webserver):
335
"""Test adding cookies with different paths that are related to ours."""
336
assert_no_cookies_are_present(driver)
337
338
cookie1 = PartialCookie(
339
"fish", BytesValue(BytesValue.TYPE_STRING, "cod"), webserver.host, path="/simpleTest.html"
340
)
341
342
cookie2 = PartialCookie("planet", BytesValue(BytesValue.TYPE_STRING, "earth"), webserver.host, path="/")
343
344
# Test
345
driver.storage.set_cookie(cookie=cookie1)
346
driver.storage.set_cookie(cookie=cookie2)
347
348
driver.get(pages.url("simpleTest.html"))
349
350
# Verify
351
assert_cookie_is_present_with_name(driver, "fish")
352
assert_cookie_is_present_with_name(driver, "planet")
353
354
driver.get(pages.url("formPage.html"))
355
assert_cookie_is_not_present_with_name(driver, "fish")
356
357