seleniumbase 4.34.11__py3-none-any.whl → 4.35.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- seleniumbase/__version__.py +1 -1
- seleniumbase/core/browser_launcher.py +68 -37
- seleniumbase/core/proxy_helper.py +8 -6
- seleniumbase/core/sb_cdp.py +193 -69
- seleniumbase/core/sb_driver.py +7 -0
- seleniumbase/extensions/ad_block.zip +0 -0
- seleniumbase/extensions/disable_csp.zip +0 -0
- seleniumbase/fixtures/base_case.py +38 -11
- seleniumbase/fixtures/js_utils.py +31 -9
- seleniumbase/plugins/base_plugin.py +12 -15
- seleniumbase/plugins/selenium_plugin.py +1 -0
- seleniumbase/undetected/__init__.py +16 -10
- seleniumbase/undetected/cdp_driver/browser.py +2 -0
- seleniumbase/undetected/cdp_driver/cdp_util.py +104 -2
- seleniumbase/undetected/cdp_driver/config.py +10 -0
- seleniumbase/undetected/webelement.py +3 -2
- {seleniumbase-4.34.11.dist-info → seleniumbase-4.35.0.dist-info}/METADATA +10 -10
- {seleniumbase-4.34.11.dist-info → seleniumbase-4.35.0.dist-info}/RECORD +22 -22
- {seleniumbase-4.34.11.dist-info → seleniumbase-4.35.0.dist-info}/LICENSE +0 -0
- {seleniumbase-4.34.11.dist-info → seleniumbase-4.35.0.dist-info}/WHEEL +0 -0
- {seleniumbase-4.34.11.dist-info → seleniumbase-4.35.0.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.34.11.dist-info → seleniumbase-4.35.0.dist-info}/top_level.txt +0 -0
@@ -585,52 +585,60 @@ def highlight_with_jquery(driver, selector, loops=4, o_bs=""):
|
|
585
585
|
'0px 0px 6px 6px rgba(128, 128, 128, 0.5)');"""
|
586
586
|
% selector
|
587
587
|
)
|
588
|
-
|
588
|
+
with suppress(Exception):
|
589
|
+
safe_execute_script(driver, script)
|
589
590
|
for n in range(loops):
|
590
591
|
script = (
|
591
592
|
"""jQuery('%s').css('box-shadow',
|
592
593
|
'0px 0px 6px 6px rgba(255, 0, 0, 1)');"""
|
593
594
|
% selector
|
594
595
|
)
|
595
|
-
|
596
|
+
with suppress(Exception):
|
597
|
+
execute_script(driver, script)
|
596
598
|
time.sleep(0.0181)
|
597
599
|
script = (
|
598
600
|
"""jQuery('%s').css('box-shadow',
|
599
601
|
'0px 0px 6px 6px rgba(128, 0, 128, 1)');"""
|
600
602
|
% selector
|
601
603
|
)
|
602
|
-
|
604
|
+
with suppress(Exception):
|
605
|
+
execute_script(driver, script)
|
603
606
|
time.sleep(0.0181)
|
604
607
|
script = (
|
605
608
|
"""jQuery('%s').css('box-shadow',
|
606
609
|
'0px 0px 6px 6px rgba(0, 0, 255, 1)');"""
|
607
610
|
% selector
|
608
611
|
)
|
609
|
-
|
612
|
+
with suppress(Exception):
|
613
|
+
execute_script(driver, script)
|
610
614
|
time.sleep(0.0181)
|
611
615
|
script = (
|
612
616
|
"""jQuery('%s').css('box-shadow',
|
613
617
|
'0px 0px 6px 6px rgba(0, 255, 0, 1)');"""
|
614
618
|
% selector
|
615
619
|
)
|
616
|
-
|
620
|
+
with suppress(Exception):
|
621
|
+
execute_script(driver, script)
|
617
622
|
time.sleep(0.0181)
|
618
623
|
script = (
|
619
624
|
"""jQuery('%s').css('box-shadow',
|
620
625
|
'0px 0px 6px 6px rgba(128, 128, 0, 1)');"""
|
621
626
|
% selector
|
622
627
|
)
|
623
|
-
|
628
|
+
with suppress(Exception):
|
629
|
+
execute_script(driver, script)
|
624
630
|
time.sleep(0.0181)
|
625
631
|
script = (
|
626
632
|
"""jQuery('%s').css('box-shadow',
|
627
633
|
'0px 0px 6px 6px rgba(128, 0, 128, 1)');"""
|
628
634
|
% selector
|
629
635
|
)
|
630
|
-
|
636
|
+
with suppress(Exception):
|
637
|
+
execute_script(driver, script)
|
631
638
|
time.sleep(0.0181)
|
632
639
|
script = """jQuery('%s').css('box-shadow', '%s');""" % (selector, o_bs)
|
633
|
-
|
640
|
+
with suppress(Exception):
|
641
|
+
execute_script(driver, script)
|
634
642
|
|
635
643
|
|
636
644
|
def add_css_link(driver, css_link):
|
@@ -924,9 +932,20 @@ def post_message(driver, message, msg_dur=None, style="info"):
|
|
924
932
|
"""hideAfter: %s, hideOnNavigate: true});"""
|
925
933
|
% (message, style, msg_dur)
|
926
934
|
)
|
935
|
+
retry = False
|
927
936
|
try:
|
928
937
|
execute_script(driver, messenger_script)
|
938
|
+
except TypeError as e:
|
939
|
+
if (
|
940
|
+
shared_utils.is_cdp_swap_needed(driver)
|
941
|
+
and "cannot unpack non-iterable" in str(e)
|
942
|
+
):
|
943
|
+
pass
|
944
|
+
else:
|
945
|
+
retry = True
|
929
946
|
except Exception:
|
947
|
+
retry = True
|
948
|
+
if retry:
|
930
949
|
activate_messenger(driver)
|
931
950
|
set_messenger_theme(driver)
|
932
951
|
try:
|
@@ -1273,7 +1292,10 @@ def slow_scroll_to_element(driver, element, *args, **kwargs):
|
|
1273
1292
|
scroll_position = execute_script(driver, "return window.scrollY;")
|
1274
1293
|
element_location_y = None
|
1275
1294
|
try:
|
1276
|
-
|
1295
|
+
if shared_utils.is_cdp_swap_needed(driver):
|
1296
|
+
element.get_position().y
|
1297
|
+
else:
|
1298
|
+
element_location_y = element.location["y"]
|
1277
1299
|
except Exception:
|
1278
1300
|
element.location_once_scrolled_into_view
|
1279
1301
|
return
|
@@ -208,7 +208,6 @@ class Base(Plugin):
|
|
208
208
|
self.duration = float(0)
|
209
209
|
self.page_results_list = []
|
210
210
|
self.test_count = 0
|
211
|
-
self.import_error = False
|
212
211
|
log_path = constants.Logs.LATEST + "/"
|
213
212
|
archive_logs = options.archive_logs
|
214
213
|
log_helper.log_folder_setup(log_path, archive_logs)
|
@@ -238,6 +237,7 @@ class Base(Plugin):
|
|
238
237
|
)
|
239
238
|
else:
|
240
239
|
variables = {}
|
240
|
+
test.test.test_id = test.id()
|
241
241
|
test.test.is_nosetest = True
|
242
242
|
test.test.environment = self.options.environment
|
243
243
|
test.test.env = self.options.environment # Add a shortened version
|
@@ -263,17 +263,16 @@ class Base(Plugin):
|
|
263
263
|
)
|
264
264
|
log_helper.clear_empty_logs()
|
265
265
|
if self.report_on:
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
)
|
266
|
+
report_helper.add_bad_page_log_file(self.page_results_list)
|
267
|
+
report_log_path = report_helper.archive_new_report_logs()
|
268
|
+
report_helper.build_report(
|
269
|
+
report_log_path,
|
270
|
+
self.page_results_list,
|
271
|
+
self.successes,
|
272
|
+
self.failures,
|
273
|
+
self.options.browser,
|
274
|
+
self.show_report,
|
275
|
+
)
|
277
276
|
|
278
277
|
def addSuccess(self, test, capt):
|
279
278
|
if self.report_on:
|
@@ -293,9 +292,6 @@ class Base(Plugin):
|
|
293
292
|
"%.2fs" % (float(time.time()) - float(self.start_time))
|
294
293
|
)
|
295
294
|
if test.id() == "nose.failure.Failure.runTest":
|
296
|
-
print(">>> ERROR: Could not locate tests to run!")
|
297
|
-
print(">>> The Test Report WILL NOT be generated!")
|
298
|
-
self.import_error = True
|
299
295
|
return
|
300
296
|
self.failures.append(test.id())
|
301
297
|
self.page_results_list.append(
|
@@ -314,6 +310,7 @@ class Base(Plugin):
|
|
314
310
|
test._log_fail_data()
|
315
311
|
sb_config._excinfo_tb = err
|
316
312
|
log_path = None
|
313
|
+
source = None
|
317
314
|
if hasattr(sb_config, "_test_logpath"):
|
318
315
|
log_path = sb_config._test_logpath
|
319
316
|
if hasattr(sb_config, "_last_page_source"):
|
@@ -1309,6 +1309,7 @@ class SeleniumBrowser(Plugin):
|
|
1309
1309
|
test.test.dashboard = False
|
1310
1310
|
test.test._multithreaded = False
|
1311
1311
|
test.test._reuse_session = False
|
1312
|
+
sb_config.recorder_mode = test.test.recorder_mode
|
1312
1313
|
sb_config.no_screenshot = test.test.no_screenshot_after_test
|
1313
1314
|
if test.test.servername != "localhost":
|
1314
1315
|
# Using Selenium Grid
|
@@ -454,17 +454,20 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
454
454
|
self.start_session()
|
455
455
|
time.sleep(0.0075)
|
456
456
|
with suppress(Exception):
|
457
|
-
for
|
458
|
-
|
457
|
+
for window_handle in self.window_handles:
|
458
|
+
self.switch_to.window(window_handle)
|
459
|
+
if self.current_url.startswith(
|
460
|
+
"chrome-extension://"
|
461
|
+
):
|
459
462
|
self.close()
|
460
463
|
if self.service.is_connectable():
|
461
464
|
self.stop_client()
|
462
465
|
self.service.stop()
|
463
466
|
self.service.start()
|
464
467
|
self.start_session()
|
465
|
-
time.sleep(0.
|
466
|
-
|
467
|
-
|
468
|
+
time.sleep(0.003)
|
469
|
+
with suppress(Exception):
|
470
|
+
self.switch_to.window(self.window_handles[-1])
|
468
471
|
self._is_connected = True
|
469
472
|
|
470
473
|
def disconnect(self):
|
@@ -487,17 +490,20 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
487
490
|
self.start_session()
|
488
491
|
time.sleep(0.0075)
|
489
492
|
with suppress(Exception):
|
490
|
-
for
|
491
|
-
|
493
|
+
for window_handle in self.window_handles:
|
494
|
+
self.switch_to.window(window_handle)
|
495
|
+
if self.current_url.startswith(
|
496
|
+
"chrome-extension://"
|
497
|
+
):
|
492
498
|
self.close()
|
493
499
|
if self.service.is_connectable():
|
494
500
|
self.stop_client()
|
495
501
|
self.service.stop()
|
496
502
|
self.service.start()
|
497
503
|
self.start_session()
|
498
|
-
time.sleep(0.
|
499
|
-
|
500
|
-
|
504
|
+
time.sleep(0.003)
|
505
|
+
with suppress(Exception):
|
506
|
+
self.switch_to.window(self.window_handles[-1])
|
501
507
|
self._is_connected = True
|
502
508
|
|
503
509
|
def start_session(self, capabilities=None):
|
@@ -265,6 +265,8 @@ class Browser:
|
|
265
265
|
:param new_window: Open new window
|
266
266
|
:return: Page
|
267
267
|
"""
|
268
|
+
if url and ":" not in url:
|
269
|
+
url = "https://" + url
|
268
270
|
if new_tab or new_window:
|
269
271
|
# Create new target using the browser session.
|
270
272
|
target_id = await self.connection.send(
|
@@ -4,6 +4,7 @@ import asyncio
|
|
4
4
|
import fasteners
|
5
5
|
import logging
|
6
6
|
import os
|
7
|
+
import sys
|
7
8
|
import time
|
8
9
|
import types
|
9
10
|
import typing
|
@@ -11,6 +12,7 @@ from contextlib import suppress
|
|
11
12
|
from seleniumbase import config as sb_config
|
12
13
|
from seleniumbase.config import settings
|
13
14
|
from seleniumbase.core import detect_b_ver
|
15
|
+
from seleniumbase.core import proxy_helper
|
14
16
|
from seleniumbase.fixtures import constants
|
15
17
|
from seleniumbase.fixtures import shared_utils
|
16
18
|
from typing import Optional, List, Union, Callable
|
@@ -23,6 +25,7 @@ import mycdp as cdp
|
|
23
25
|
|
24
26
|
logger = logging.getLogger(__name__)
|
25
27
|
IS_LINUX = shared_utils.is_linux()
|
28
|
+
PROXY_DIR_LOCK = proxy_helper.PROXY_DIR_LOCK
|
26
29
|
T = typing.TypeVar("T")
|
27
30
|
|
28
31
|
|
@@ -139,6 +142,85 @@ def __activate_virtual_display_as_needed(
|
|
139
142
|
__activate_standard_virtual_display()
|
140
143
|
|
141
144
|
|
145
|
+
def __set_proxy_filenames():
|
146
|
+
DOWNLOADS_DIR = constants.Files.DOWNLOADS_FOLDER
|
147
|
+
for num in range(1000):
|
148
|
+
PROXY_DIR_PATH = os.path.join(DOWNLOADS_DIR, "proxy_ext_dir_%s" % num)
|
149
|
+
if os.path.exists(PROXY_DIR_PATH):
|
150
|
+
continue
|
151
|
+
proxy_helper.PROXY_DIR_PATH = PROXY_DIR_PATH
|
152
|
+
return
|
153
|
+
# Exceeded upper bound. Use Defaults:
|
154
|
+
PROXY_DIR_PATH = os.path.join(DOWNLOADS_DIR, "proxy_ext_dir")
|
155
|
+
proxy_helper.PROXY_DIR_PATH = PROXY_DIR_PATH
|
156
|
+
|
157
|
+
|
158
|
+
def __add_chrome_ext_dir(extension_dir, dir_path):
|
159
|
+
# Add dir_path to the existing extension_dir
|
160
|
+
option_exists = False
|
161
|
+
if extension_dir:
|
162
|
+
option_exists = True
|
163
|
+
extension_dir = "%s,%s" % (
|
164
|
+
extension_dir, os.path.realpath(dir_path)
|
165
|
+
)
|
166
|
+
if not option_exists:
|
167
|
+
extension_dir = os.path.realpath(dir_path)
|
168
|
+
return extension_dir
|
169
|
+
|
170
|
+
|
171
|
+
def __add_chrome_proxy_extension(
|
172
|
+
extension_dir,
|
173
|
+
proxy_string,
|
174
|
+
proxy_user,
|
175
|
+
proxy_pass,
|
176
|
+
proxy_bypass_list=None,
|
177
|
+
multi_proxy=False,
|
178
|
+
):
|
179
|
+
"""Implementation of https://stackoverflow.com/a/35293284/7058266
|
180
|
+
for https://stackoverflow.com/q/12848327/7058266
|
181
|
+
(Run Selenium on a proxy server that requires authentication.)"""
|
182
|
+
args = " ".join(sys.argv)
|
183
|
+
bypass_list = proxy_bypass_list
|
184
|
+
if (
|
185
|
+
not ("-n" in sys.argv or " -n=" in args or args == "-c")
|
186
|
+
and not multi_proxy
|
187
|
+
):
|
188
|
+
# Single-threaded
|
189
|
+
proxy_dir_lock = fasteners.InterProcessLock(PROXY_DIR_LOCK)
|
190
|
+
with proxy_dir_lock:
|
191
|
+
proxy_helper.create_proxy_ext(
|
192
|
+
proxy_string,
|
193
|
+
proxy_user,
|
194
|
+
proxy_pass,
|
195
|
+
bypass_list,
|
196
|
+
zip_it=False,
|
197
|
+
)
|
198
|
+
proxy_dir_path = proxy_helper.PROXY_DIR_PATH
|
199
|
+
extension_dir = __add_chrome_ext_dir(
|
200
|
+
extension_dir, proxy_dir_path
|
201
|
+
)
|
202
|
+
else:
|
203
|
+
# Multi-threaded
|
204
|
+
proxy_dir_lock = fasteners.InterProcessLock(PROXY_DIR_LOCK)
|
205
|
+
with proxy_dir_lock:
|
206
|
+
with suppress(Exception):
|
207
|
+
shared_utils.make_writable(PROXY_DIR_LOCK)
|
208
|
+
if multi_proxy:
|
209
|
+
__set_proxy_filenames()
|
210
|
+
if not os.path.exists(proxy_helper.PROXY_DIR_PATH):
|
211
|
+
proxy_helper.create_proxy_ext(
|
212
|
+
proxy_string,
|
213
|
+
proxy_user,
|
214
|
+
proxy_pass,
|
215
|
+
bypass_list,
|
216
|
+
zip_it=False,
|
217
|
+
)
|
218
|
+
extension_dir = __add_chrome_ext_dir(
|
219
|
+
extension_dir, proxy_helper.PROXY_DIR_PATH
|
220
|
+
)
|
221
|
+
return extension_dir
|
222
|
+
|
223
|
+
|
142
224
|
async def start(
|
143
225
|
config: Optional[Config] = None,
|
144
226
|
*,
|
@@ -156,6 +238,8 @@ async def start(
|
|
156
238
|
xvfb: Optional[int] = None, # Use a special virtual display on Linux
|
157
239
|
headed: Optional[bool] = None, # Override default Xvfb mode on Linux
|
158
240
|
expert: Optional[bool] = None, # Open up closed Shadow-root elements
|
241
|
+
proxy: Optional[str] = None, # "host:port" or "user:pass@host:port"
|
242
|
+
extension_dir: Optional[str] = None, # Chrome extension directory
|
159
243
|
**kwargs: Optional[dict],
|
160
244
|
) -> Browser:
|
161
245
|
"""
|
@@ -200,6 +284,18 @@ async def start(
|
|
200
284
|
if IS_LINUX and not headless and not headed and not xvfb:
|
201
285
|
xvfb = True # The default setting on Linux
|
202
286
|
__activate_virtual_display_as_needed(headless, headed, xvfb, xvfb_metrics)
|
287
|
+
if proxy and "@" in str(proxy):
|
288
|
+
user_with_pass = proxy.split("@")[0]
|
289
|
+
if ":" in user_with_pass:
|
290
|
+
proxy_user = user_with_pass.split(":")[0]
|
291
|
+
proxy_pass = user_with_pass.split(":")[1]
|
292
|
+
proxy_string = proxy.split("@")[1]
|
293
|
+
extension_dir = __add_chrome_proxy_extension(
|
294
|
+
extension_dir,
|
295
|
+
proxy_string,
|
296
|
+
proxy_user,
|
297
|
+
proxy_pass,
|
298
|
+
)
|
203
299
|
if not config:
|
204
300
|
config = Config(
|
205
301
|
user_data_dir,
|
@@ -213,13 +309,19 @@ async def start(
|
|
213
309
|
host=host,
|
214
310
|
port=port,
|
215
311
|
expert=expert,
|
312
|
+
proxy=proxy,
|
313
|
+
extension_dir=extension_dir,
|
216
314
|
**kwargs,
|
217
315
|
)
|
316
|
+
driver = None
|
218
317
|
try:
|
219
|
-
|
318
|
+
driver = await Browser.create(config)
|
220
319
|
except Exception:
|
221
320
|
time.sleep(0.15)
|
222
|
-
|
321
|
+
driver = await Browser.create(config)
|
322
|
+
if proxy and "@" in str(proxy):
|
323
|
+
time.sleep(0.11)
|
324
|
+
return driver
|
223
325
|
|
224
326
|
|
225
327
|
async def start_async(*args, **kwargs) -> Browser:
|
@@ -40,6 +40,8 @@ class Config:
|
|
40
40
|
host: str = AUTO,
|
41
41
|
port: int = AUTO,
|
42
42
|
expert: bool = AUTO,
|
43
|
+
proxy: Optional[str] = None,
|
44
|
+
extension_dir: Optional[str] = None,
|
43
45
|
**kwargs: dict,
|
44
46
|
):
|
45
47
|
"""
|
@@ -91,6 +93,8 @@ class Config:
|
|
91
93
|
self.host = host
|
92
94
|
self.port = port
|
93
95
|
self.expert = expert
|
96
|
+
self.proxy = proxy
|
97
|
+
self.extension_dir = extension_dir
|
94
98
|
self._extensions = []
|
95
99
|
# When using posix-ish operating system and running as root,
|
96
100
|
# you must use no_sandbox=True
|
@@ -195,6 +199,12 @@ class Config:
|
|
195
199
|
"--disable-web-security",
|
196
200
|
"--disable-site-isolation-trials",
|
197
201
|
]
|
202
|
+
if self.proxy:
|
203
|
+
args.append("--proxy-server=%s" % self.proxy.split("@")[-1])
|
204
|
+
args.append("--ignore-certificate-errors")
|
205
|
+
args.append("--ignore-ssl-errors=yes")
|
206
|
+
if self.extension_dir:
|
207
|
+
args.append("--load-extension=%s" % self.extension_dir)
|
198
208
|
if self._browser_args:
|
199
209
|
args.extend([arg for arg in self._browser_args if arg not in args])
|
200
210
|
if self.headless:
|
@@ -26,10 +26,11 @@ class WebElement(selenium.webdriver.remote.webelement.WebElement):
|
|
26
26
|
driver.js_click(selector, by=by, timeout=1)
|
27
27
|
else:
|
28
28
|
super().click()
|
29
|
+
driver = self._parent
|
29
30
|
if not reconnect_time:
|
30
|
-
|
31
|
+
driver.reconnect(0.5)
|
31
32
|
else:
|
32
|
-
|
33
|
+
driver.reconnect(reconnect_time)
|
33
34
|
|
34
35
|
def uc_reconnect(self, reconnect_time=None):
|
35
36
|
if not reconnect_time:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.
|
3
|
+
Version: 4.35.0
|
4
4
|
Summary: A complete web automation framework for end-to-end testing.
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
6
6
|
Author: Michael Mintz
|
@@ -59,7 +59,7 @@ Classifier: Topic :: Utilities
|
|
59
59
|
Requires-Python: >=3.8
|
60
60
|
Description-Content-Type: text/markdown
|
61
61
|
License-File: LICENSE
|
62
|
-
Requires-Dist: pip>=25.0
|
62
|
+
Requires-Dist: pip>=25.0.1
|
63
63
|
Requires-Dist: packaging>=24.2
|
64
64
|
Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
65
65
|
Requires-Dist: setuptools>=75.8.0; python_version >= "3.10"
|
@@ -68,12 +68,12 @@ Requires-Dist: attrs>=25.1.0
|
|
68
68
|
Requires-Dist: certifi>=2025.1.31
|
69
69
|
Requires-Dist: exceptiongroup>=1.2.2
|
70
70
|
Requires-Dist: websockets~=13.1; python_version < "3.9"
|
71
|
-
Requires-Dist: websockets>=
|
71
|
+
Requires-Dist: websockets>=15.0; python_version >= "3.9"
|
72
72
|
Requires-Dist: filelock~=3.16.1; python_version < "3.9"
|
73
73
|
Requires-Dist: filelock>=3.17.0; python_version >= "3.9"
|
74
74
|
Requires-Dist: fasteners>=0.19
|
75
75
|
Requires-Dist: mycdp>=1.1.0
|
76
|
-
Requires-Dist: pynose>=1.5.
|
76
|
+
Requires-Dist: pynose>=1.5.4
|
77
77
|
Requires-Dist: platformdirs>=4.3.6
|
78
78
|
Requires-Dist: typing-extensions>=4.12.2
|
79
79
|
Requires-Dist: sbvirtualdisplay>=1.4.0
|
@@ -99,12 +99,12 @@ Requires-Dist: sniffio==1.3.1
|
|
99
99
|
Requires-Dist: h11==0.14.0
|
100
100
|
Requires-Dist: outcome==1.3.0.post0
|
101
101
|
Requires-Dist: trio==0.27.0; python_version < "3.9"
|
102
|
-
Requires-Dist: trio==0.
|
103
|
-
Requires-Dist: trio-websocket==0.
|
102
|
+
Requires-Dist: trio==0.29.0; python_version >= "3.9"
|
103
|
+
Requires-Dist: trio-websocket==0.12.1
|
104
104
|
Requires-Dist: wsproto==1.2.0
|
105
105
|
Requires-Dist: websocket-client==1.8.0
|
106
106
|
Requires-Dist: selenium==4.27.1; python_version < "3.9"
|
107
|
-
Requires-Dist: selenium==4.
|
107
|
+
Requires-Dist: selenium==4.29.0; python_version >= "3.9"
|
108
108
|
Requires-Dist: cssselect==1.2.0
|
109
109
|
Requires-Dist: sortedcontainers==2.4.0
|
110
110
|
Requires-Dist: execnet==2.1.1
|
@@ -132,12 +132,12 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
|
|
132
132
|
Requires-Dist: allure-behave>=2.13.5; extra == "allure"
|
133
133
|
Provides-Extra: coverage
|
134
134
|
Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
|
135
|
-
Requires-Dist: coverage>=7.6.
|
135
|
+
Requires-Dist: coverage>=7.6.12; python_version >= "3.9" and extra == "coverage"
|
136
136
|
Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
|
137
137
|
Requires-Dist: pytest-cov>=6.0.0; python_version >= "3.9" and extra == "coverage"
|
138
138
|
Provides-Extra: flake8
|
139
139
|
Requires-Dist: flake8==5.0.4; python_version < "3.9" and extra == "flake8"
|
140
|
-
Requires-Dist: flake8==7.1.
|
140
|
+
Requires-Dist: flake8==7.1.2; python_version >= "3.9" and extra == "flake8"
|
141
141
|
Requires-Dist: mccabe==0.7.0; extra == "flake8"
|
142
142
|
Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
|
143
143
|
Requires-Dist: pyflakes==3.2.0; python_version >= "3.9" and extra == "flake8"
|
@@ -151,7 +151,7 @@ Requires-Dist: mss==9.0.2; extra == "mss"
|
|
151
151
|
Provides-Extra: pdfminer
|
152
152
|
Requires-Dist: pdfminer.six==20240706; extra == "pdfminer"
|
153
153
|
Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
|
154
|
-
Requires-Dist: cryptography==44.0.
|
154
|
+
Requires-Dist: cryptography==44.0.1; python_version >= "3.9" and extra == "pdfminer"
|
155
155
|
Requires-Dist: cffi==1.17.1; extra == "pdfminer"
|
156
156
|
Requires-Dist: pycparser==2.22; extra == "pdfminer"
|
157
157
|
Provides-Extra: pillow
|
@@ -3,7 +3,7 @@ sbase/__main__.py,sha256=G0bVB1-DM4PGwQ1KyOupaWCs4ePbChZNNWuX2htim5U,647
|
|
3
3
|
sbase/steps.py,sha256=_WvAjydKqZfTdnZW9LPKkRty-g-lfdUPmLqnZj6ulcs,43013
|
4
4
|
seleniumbase/__init__.py,sha256=OtJh8nGKL4xtZpw8KPqmn7Q6R-86t4cWUDyVF5MbMTo,2398
|
5
5
|
seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
|
6
|
-
seleniumbase/__version__.py,sha256=
|
6
|
+
seleniumbase/__version__.py,sha256=9RgXYgvnicdq4_gy9e8NFDceDM5_JZE-7snSYmzYXAs,46
|
7
7
|
seleniumbase/behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
8
|
seleniumbase/behave/behave_helper.py,sha256=elkl8P9eLulRAioLstE9baYNM9N_PHBmAOcajX-pH_Y,24198
|
9
9
|
seleniumbase/behave/behave_sb.py,sha256=qQF85LoohJBfrPK5ZcPi50v-pWtOrC9qcN1B3Ki_3tY,59401
|
@@ -36,7 +36,7 @@ seleniumbase/console_scripts/sb_print.py,sha256=tNy-bMDgwHJO3bZxMpmo9weSE8uhbH0C
|
|
36
36
|
seleniumbase/console_scripts/sb_recorder.py,sha256=fnHb5-kh11Hit-E9Ha-e4QXzqLcZvtij6mb5qNd4B1Q,11032
|
37
37
|
seleniumbase/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
38
38
|
seleniumbase/core/application_manager.py,sha256=e_0sjtI8cjY5BNyZj1QBR0j6_oCScxGmSXYEpcYwuZE,576
|
39
|
-
seleniumbase/core/browser_launcher.py,sha256=
|
39
|
+
seleniumbase/core/browser_launcher.py,sha256=jUDL2RlOXnSDUwhQuZekgGisY11hhmMU-ftFVyM-afs,236519
|
40
40
|
seleniumbase/core/capabilities_parser.py,sha256=meIS2uHapTCq2ldfNAToC7r0cKmZDRXuYNKExM1GHDY,6038
|
41
41
|
seleniumbase/core/colored_traceback.py,sha256=DrRWfg7XEnKcgY59Xj7Jdk09H-XqHYBSUpB-DiZt6iY,2020
|
42
42
|
seleniumbase/core/create_db_tables.sql,sha256=VWPtrdiW_HQ6yETHjqTu-VIrTwvd8I8o1NfBeaVSHpU,972
|
@@ -46,12 +46,12 @@ seleniumbase/core/encoded_images.py,sha256=rDKJ4cNJSuKiRcFViYU7bjyTS9_moI57gUPRX
|
|
46
46
|
seleniumbase/core/jqc_helper.py,sha256=2DDQr9Q2jSSZqFzX588jLlUM9oJvyrRWq2aORSIPUdI,10322
|
47
47
|
seleniumbase/core/log_helper.py,sha256=SW8wx2f2HfU3ERbANjxEC-jDbjy_IzaNYRKPlayfRRI,23442
|
48
48
|
seleniumbase/core/mysql.py,sha256=8Fzj3p5dhtDWfMpFqFYxpSwa9s1UltiHsWJ56_aPOqk,3993
|
49
|
-
seleniumbase/core/proxy_helper.py,sha256=
|
49
|
+
seleniumbase/core/proxy_helper.py,sha256=4VkpMwavz0fx8wcOqJ_jyBT0HIXwcxmAcpd1gjJizdc,8332
|
50
50
|
seleniumbase/core/recorder_helper.py,sha256=fNGjbapXmEsht54x1o6Igk198QdnPxDDnjUOzQxNhNQ,25055
|
51
51
|
seleniumbase/core/report_helper.py,sha256=AIl6Qava2yW1uSzbLpJBlPlYDz0KE-rVhogh8hsGWBo,12201
|
52
52
|
seleniumbase/core/s3_manager.py,sha256=bkeI8I4y19ebWuQG1oEZV5qJbotC6eN8vin31OCNWJk,3521
|
53
|
-
seleniumbase/core/sb_cdp.py,sha256=
|
54
|
-
seleniumbase/core/sb_driver.py,sha256=
|
53
|
+
seleniumbase/core/sb_cdp.py,sha256=vxgI2BLs-MyYOPsdgytBVBrMD1Outo0GvxfwbkWt4xQ,81129
|
54
|
+
seleniumbase/core/sb_driver.py,sha256=yvTDRblBzG6bDX7XcLiAA6QcBelSJj_HHL_04lcfeeE,13760
|
55
55
|
seleniumbase/core/session_helper.py,sha256=s9zD3PVZEWVzG2h81cCUskbNWLfdjC_LwwQjKptHCak,558
|
56
56
|
seleniumbase/core/settings_parser.py,sha256=gqVohHVlE_5L5Cqe2L24uYrRzvoK-saX8E_Df7_-_3I,7609
|
57
57
|
seleniumbase/core/style_sheet.py,sha256=QsfTBtgedfM3uTqgxtd53bhq202p9fwLMbFl9mPZgVg,11892
|
@@ -60,16 +60,16 @@ seleniumbase/core/tour_helper.py,sha256=kj2cz-DGKlw9SX3tWnVp-snpk6Flvqj81-xmKdKD
|
|
60
60
|
seleniumbase/core/visual_helper.py,sha256=Dj5iJKw-bT_3e6KDqMf0sJi7xs_D96yqLcNc8fqhrjI,3408
|
61
61
|
seleniumbase/drivers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
62
62
|
seleniumbase/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
63
|
-
seleniumbase/extensions/ad_block.zip,sha256=
|
64
|
-
seleniumbase/extensions/disable_csp.zip,sha256=
|
63
|
+
seleniumbase/extensions/ad_block.zip,sha256=LTlaOYUs6a1Zu4op64pLoDEqYKJb8zHq_Y0PsBIIqCk,1454
|
64
|
+
seleniumbase/extensions/disable_csp.zip,sha256=5RvomXnm2PdivUVcxTV6jfvD8WhTEsQYHaQZe7nk9Yc,20014
|
65
65
|
seleniumbase/extensions/recorder.zip,sha256=OOyzF-Ize2cSRu1CqhzSAq5vusI9hqLLd2OIApUHesI,11918
|
66
66
|
seleniumbase/extensions/sbase_ext.zip,sha256=3s1N8zrVaMz8RQEOIoBzC3KDjtmHwVZRvVsX25Odr_s,8175
|
67
67
|
seleniumbase/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
68
|
-
seleniumbase/fixtures/base_case.py,sha256=
|
68
|
+
seleniumbase/fixtures/base_case.py,sha256=ncejN3q7m6_GHQTASuy4LHkeeCn829RRZN4lRB0-MkA,722341
|
69
69
|
seleniumbase/fixtures/constants.py,sha256=WMrItuNyKq3XVJ64NluLIRc4gJCxDw8K8qXED0b9S2w,13752
|
70
70
|
seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
|
71
71
|
seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
|
72
|
-
seleniumbase/fixtures/js_utils.py,sha256=
|
72
|
+
seleniumbase/fixtures/js_utils.py,sha256=QxHC0Wz_rDQ5dB6B1CK_UFs9zzryuElr-fj7MUtf_lA,52204
|
73
73
|
seleniumbase/fixtures/page_actions.py,sha256=LPcFSkUvBkxLrOt4laQHHN-NLmqInT41E2vlPiOlLFY,66753
|
74
74
|
seleniumbase/fixtures/page_utils.py,sha256=H1iV8f9vDyEy87DBntyiBXC_tg8HskcebUOAJVn0hxE,12160
|
75
75
|
seleniumbase/fixtures/shared_utils.py,sha256=G6CsE-Adt-GfuZF-71jXWKSIQW7YZPx8FIM24pVd_yI,8368
|
@@ -83,7 +83,7 @@ seleniumbase/js_code/recorder_js.py,sha256=ApFNh6DImuPGmaydvq8OOzGixc0t-xdYSCzfQ
|
|
83
83
|
seleniumbase/masterqa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
84
84
|
seleniumbase/masterqa/master_qa.py,sha256=jLWmAx32Rnu1IhmvrRt8BbsUIcDW5xYj2ouVozny-Y4,19258
|
85
85
|
seleniumbase/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
86
|
-
seleniumbase/plugins/base_plugin.py,sha256=
|
86
|
+
seleniumbase/plugins/base_plugin.py,sha256=ItLgtaZmu_363iycy8BNX0Do5LyIWGiTMLW6krXM-WQ,14748
|
87
87
|
seleniumbase/plugins/basic_test_info.py,sha256=8ov6n417gPbqqvrlT4zrch7l2XcRt-GF2ny6rR9AMWk,2108
|
88
88
|
seleniumbase/plugins/db_reporting_plugin.py,sha256=En09qUCoojrk9-vbcnsoHdSELoGmag2GDIyu3jTiJas,7331
|
89
89
|
seleniumbase/plugins/driver_manager.py,sha256=QGGekWvcj58VMGr87UyXl1OvVTMjZDEdt8jaq7K13u8,35863
|
@@ -92,7 +92,7 @@ seleniumbase/plugins/pytest_plugin.py,sha256=SKCHzUFSd8dHPQwYQTJp-6AX7YD6Kce-Mem
|
|
92
92
|
seleniumbase/plugins/s3_logging_plugin.py,sha256=WDfertQgGOW_SRJpFMaekYD6vBVW9VO62POtXXy2HCM,2319
|
93
93
|
seleniumbase/plugins/sb_manager.py,sha256=aOaP5ZxLM7EfpLml4f_iBXkidKtFA1KcZQQIGm4aSQQ,56242
|
94
94
|
seleniumbase/plugins/screen_shots.py,sha256=1hrXw-hzuZ1BR6Yh7AyWX2ABnvnP73-RCbwdz958gj4,1127
|
95
|
-
seleniumbase/plugins/selenium_plugin.py,sha256=
|
95
|
+
seleniumbase/plugins/selenium_plugin.py,sha256=y0eNco8T4KgGLProLPHPLw479QH5lRms4wqwOnTgkSc,60081
|
96
96
|
seleniumbase/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
97
97
|
seleniumbase/translate/__init__.py,sha256=N2i5XntTwJZmwr9-qvdX5gC6Rdm5-ClIbnQ8yyPn4Oo,459
|
98
98
|
seleniumbase/translate/chinese.py,sha256=0QhK2eadtsdN4KCvwki1J7jBCe8I4xxWbKzteJKJozY,24698
|
@@ -106,18 +106,18 @@ seleniumbase/translate/portuguese.py,sha256=x3P4qxp56UiI41GoaL7JbUvFRYsgXU1EKjTg
|
|
106
106
|
seleniumbase/translate/russian.py,sha256=TyN9n0b4GRWDEYnHRGw1rfNAscdDmP3F3Y3aySM3C7s,27978
|
107
107
|
seleniumbase/translate/spanish.py,sha256=hh3xgW1Pq122SHYVvJAxFaXhFrjniOVncVbJbfWqOUM,25528
|
108
108
|
seleniumbase/translate/translator.py,sha256=wPhZH6e5NhmebYL1kP2eGxUcVy1gfTb6XCH8ATEPpxE,49238
|
109
|
-
seleniumbase/undetected/__init__.py,sha256=
|
109
|
+
seleniumbase/undetected/__init__.py,sha256=s3Si9sNgZEg0dy7JSPdQYbG4a0i3_T3uISl4CmzbM4M,24338
|
110
110
|
seleniumbase/undetected/cdp.py,sha256=RLpwZnhUvmK9tgXcZIBBQedwk2q7Jj_EXZkmzI8WUqk,4023
|
111
111
|
seleniumbase/undetected/dprocess.py,sha256=83EV8ZHJWHG1TSUv9JNClBhdgiBXlkCc6mJ--HsoP3k,1681
|
112
112
|
seleniumbase/undetected/options.py,sha256=BoNuwhrG7oOvuLvTwkvsWCF36pMkS1tHCG-XpP4_EkI,3001
|
113
113
|
seleniumbase/undetected/patcher.py,sha256=fXh99P2D9XPdYTFtsDYXk1ZUSh8Elkg-dGeMhUihmu4,11445
|
114
114
|
seleniumbase/undetected/reactor.py,sha256=NropaXcO54pzmDq6quR27qPJxab6636H7LRAaq-o0ng,2859
|
115
|
-
seleniumbase/undetected/webelement.py,sha256=
|
115
|
+
seleniumbase/undetected/webelement.py,sha256=OOpUYbEiOG52KsYYyuDW9tYLdA2SMnukvwQHUdPVn9E,1389
|
116
116
|
seleniumbase/undetected/cdp_driver/__init__.py,sha256=c0TjMwPfVFyoqYOJ7PQ-Jln_L_dpN3ebHyaD-juQoM0,64
|
117
117
|
seleniumbase/undetected/cdp_driver/_contradict.py,sha256=lP4b0h5quAy573ETn_TBbYV889cL1AuPLVInpJ0ZkiU,3183
|
118
|
-
seleniumbase/undetected/cdp_driver/browser.py,sha256=
|
119
|
-
seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=
|
120
|
-
seleniumbase/undetected/cdp_driver/config.py,sha256=
|
118
|
+
seleniumbase/undetected/cdp_driver/browser.py,sha256=ruPunmJKwE67Veh1MjSkZAF5W38FMwc32lHgy1YULho,30261
|
119
|
+
seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=zlYc_oTqtCSjV_T7lzPbFyJlj_78NHMxKkrpleXcfpQ,21374
|
120
|
+
seleniumbase/undetected/cdp_driver/config.py,sha256=t8KV1Vqa5SQRBq3-gjkHHmj9h85AplAM01asO3AWufs,12507
|
121
121
|
seleniumbase/undetected/cdp_driver/connection.py,sha256=sOTUGjbUqKA2hPvDcRCdqw1VQjVGJs7mbgVvzS7ldtE,23360
|
122
122
|
seleniumbase/undetected/cdp_driver/element.py,sha256=FIC6v7OmumLCT-_vIc3H4oju_oBbaLpWJUJIKm2c_q4,40467
|
123
123
|
seleniumbase/undetected/cdp_driver/tab.py,sha256=rcASsWY_mC7L0wXpFSWM5mtojzA47qG9BWEMXe7ZGF8,50906
|
@@ -135,9 +135,9 @@ seleniumbase/utilities/selenium_grid/start-grid-hub.bat,sha256=Ftq-GrAKRYH2ssDPr
|
|
135
135
|
seleniumbase/utilities/selenium_grid/start-grid-hub.sh,sha256=KADv0RUHONLL2_I443QFK8PryBpDmKn5Gy0s4o0vDSM,106
|
136
136
|
seleniumbase/utilities/selenium_ide/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
137
137
|
seleniumbase/utilities/selenium_ide/convert_ide.py,sha256=pZFnqEJQEKZPyNFjkLD29s2HPQgCrWW9XJWpCPhWOoM,31691
|
138
|
-
seleniumbase-4.
|
139
|
-
seleniumbase-4.
|
140
|
-
seleniumbase-4.
|
141
|
-
seleniumbase-4.
|
142
|
-
seleniumbase-4.
|
143
|
-
seleniumbase-4.
|
138
|
+
seleniumbase-4.35.0.dist-info/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
|
139
|
+
seleniumbase-4.35.0.dist-info/METADATA,sha256=EeKLn-w_eOXpmkxalRWbl9_cFlbJsGdKUsNgqskwprQ,86521
|
140
|
+
seleniumbase-4.35.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
141
|
+
seleniumbase-4.35.0.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
|
142
|
+
seleniumbase-4.35.0.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
|
143
|
+
seleniumbase-4.35.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|