seleniumbase 4.32.11__py3-none-any.whl → 4.33.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.
- sbase/steps.py +7 -0
- seleniumbase/__version__.py +1 -1
- seleniumbase/common/decorators.py +14 -6
- seleniumbase/console_scripts/sb_mkrec.py +3 -1
- seleniumbase/console_scripts/sb_recorder.py +3 -0
- seleniumbase/core/browser_launcher.py +12 -6
- seleniumbase/core/sb_cdp.py +110 -14
- seleniumbase/core/sb_driver.py +31 -0
- seleniumbase/fixtures/base_case.py +86 -6
- seleniumbase/fixtures/js_utils.py +8 -0
- seleniumbase/plugins/sb_manager.py +7 -1
- seleniumbase/undetected/__init__.py +1 -1
- seleniumbase/undetected/cdp_driver/cdp_util.py +5 -1
- {seleniumbase-4.32.11.dist-info → seleniumbase-4.33.0.dist-info}/METADATA +20 -19
- {seleniumbase-4.32.11.dist-info → seleniumbase-4.33.0.dist-info}/RECORD +19 -19
- {seleniumbase-4.32.11.dist-info → seleniumbase-4.33.0.dist-info}/WHEEL +1 -1
- {seleniumbase-4.32.11.dist-info → seleniumbase-4.33.0.dist-info}/LICENSE +0 -0
- {seleniumbase-4.32.11.dist-info → seleniumbase-4.33.0.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.32.11.dist-info → seleniumbase-4.33.0.dist-info}/top_level.txt +0 -0
sbase/steps.py
CHANGED
@@ -1189,3 +1189,10 @@ def set_attributes(context, selector, attribute, value):
|
|
1189
1189
|
if attribute.endswith("'") or attribute.endswith('"'):
|
1190
1190
|
attribute = attribute[:-1]
|
1191
1191
|
sb.set_attributes(selector, attribute, value)
|
1192
|
+
|
1193
|
+
|
1194
|
+
@step("Activate CDP Mode")
|
1195
|
+
@step("User activates CDP Mode")
|
1196
|
+
def activate_cdp_mode(context):
|
1197
|
+
sb = context.sb
|
1198
|
+
sb.activate_cdp_mode()
|
seleniumbase/__version__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.
|
2
|
+
__version__ = "4.33.0"
|
@@ -1,11 +1,18 @@
|
|
1
|
+
import colorama
|
1
2
|
import logging
|
2
3
|
import math
|
4
|
+
import sys
|
3
5
|
import time
|
4
6
|
import warnings
|
5
7
|
from contextlib import contextmanager
|
6
8
|
from functools import wraps
|
7
9
|
from seleniumbase.common.exceptions import TimeoutException
|
8
10
|
|
11
|
+
c1 = colorama.Fore.BLUE + colorama.Back.LIGHTYELLOW_EX
|
12
|
+
cr = colorama.Style.RESET_ALL
|
13
|
+
if "linux" in sys.platform:
|
14
|
+
c1 = cr = ""
|
15
|
+
|
9
16
|
|
10
17
|
@contextmanager
|
11
18
|
def print_runtime(description=None, limit=None):
|
@@ -44,19 +51,20 @@ def print_runtime(description=None, limit=None):
|
|
44
51
|
end_time = time.time()
|
45
52
|
run_time = end_time - start_time
|
46
53
|
name = description
|
54
|
+
info = c1 + "<info>" + cr
|
47
55
|
# Print times with a statistically significant number of decimal places
|
48
56
|
if run_time < 0.0001:
|
49
|
-
print("
|
57
|
+
print("%s - {%s} ran for %.7f seconds." % (info, name, run_time))
|
50
58
|
elif run_time < 0.001:
|
51
|
-
print("
|
59
|
+
print("%s - {%s} ran for %.6f seconds." % (info, name, run_time))
|
52
60
|
elif run_time < 0.01:
|
53
|
-
print("
|
61
|
+
print("%s - {%s} ran for %.5f seconds." % (info, name, run_time))
|
54
62
|
elif run_time < 0.1:
|
55
|
-
print("
|
63
|
+
print("%s - {%s} ran for %.4f seconds." % (info, name, run_time))
|
56
64
|
elif run_time < 1:
|
57
|
-
print("
|
65
|
+
print("%s - {%s} ran for %.3f seconds." % (info, name, run_time))
|
58
66
|
else:
|
59
|
-
print("
|
67
|
+
print("%s - {%s} ran for %.2f seconds." % (info, name, run_time))
|
60
68
|
if limit and limit > 0 and run_time > limit:
|
61
69
|
message = (
|
62
70
|
"\n {%s} duration of %.2fs exceeded the time limit of %.2fs!"
|
@@ -144,7 +144,9 @@ def main():
|
|
144
144
|
elif option.lower() in ("--gui", "--headed"):
|
145
145
|
if "linux" in sys.platform:
|
146
146
|
force_gui = True
|
147
|
-
elif option.lower() in (
|
147
|
+
elif option.lower() in (
|
148
|
+
"--uc", "--cdp", "--undetected", "--undetectable"
|
149
|
+
):
|
148
150
|
use_uc = True
|
149
151
|
elif option.lower() in ("--rec-behave", "--behave", "--gherkin"):
|
150
152
|
rec_behave = True
|
@@ -9,6 +9,7 @@ Usage:
|
|
9
9
|
|
10
10
|
Options:
|
11
11
|
--uc / --undetected (Use undetectable mode.)
|
12
|
+
--cdp (Same as "--uc" and "--undetectable".)
|
12
13
|
--behave (Also output Behave/Gherkin files.)
|
13
14
|
|
14
15
|
Output:
|
@@ -151,6 +152,7 @@ def do_recording(file_name, url, overwrite_enabled, use_chrome, window):
|
|
151
152
|
command += " --edge"
|
152
153
|
if (
|
153
154
|
"--uc" in command_args
|
155
|
+
or "--cdp" in command_args
|
154
156
|
or "--undetected" in command_args
|
155
157
|
or "--undetectable" in command_args
|
156
158
|
):
|
@@ -193,6 +195,7 @@ def do_playback(file_name, use_chrome, window, demo_mode=False):
|
|
193
195
|
command_args = sys.argv[2:]
|
194
196
|
if (
|
195
197
|
"--uc" in command_args
|
198
|
+
or "--cdp" in command_args
|
196
199
|
or "--undetected" in command_args
|
197
200
|
or "--undetectable" in command_args
|
198
201
|
):
|
@@ -216,8 +216,10 @@ def extend_driver(driver):
|
|
216
216
|
driver.get_text = DM.get_text
|
217
217
|
driver.get_active_element_css = DM.get_active_element_css
|
218
218
|
driver.get_locale_code = DM.get_locale_code
|
219
|
+
driver.get_screen_rect = DM.get_screen_rect
|
219
220
|
driver.get_origin = DM.get_origin
|
220
221
|
driver.get_user_agent = DM.get_user_agent
|
222
|
+
driver.get_cookie_string = DM.get_cookie_string
|
221
223
|
driver.highlight = DM.highlight
|
222
224
|
driver.highlight_click = DM.highlight_click
|
223
225
|
driver.highlight_if_visible = DM.highlight_if_visible
|
@@ -234,6 +236,7 @@ def extend_driver(driver):
|
|
234
236
|
driver.switch_to_window = DM.switch_to_window
|
235
237
|
driver.switch_to_tab = DM.switch_to_tab
|
236
238
|
driver.switch_to_frame = DM.switch_to_frame
|
239
|
+
driver.reset_window_size = DM.reset_window_size
|
237
240
|
if hasattr(driver, "proxy"):
|
238
241
|
driver.set_wire_proxy = DM.set_wire_proxy
|
239
242
|
return driver
|
@@ -683,12 +686,17 @@ def uc_open_with_cdp_mode(driver, url=None):
|
|
683
686
|
cdp.is_checked = CDPM.is_checked
|
684
687
|
cdp.is_element_present = CDPM.is_element_present
|
685
688
|
cdp.is_element_visible = CDPM.is_element_visible
|
689
|
+
cdp.wait_for_element_visible = CDPM.wait_for_element_visible
|
690
|
+
cdp.assert_element = CDPM.assert_element
|
691
|
+
cdp.assert_element_visible = CDPM.assert_element_visible
|
686
692
|
cdp.assert_element_present = CDPM.assert_element_present
|
687
693
|
cdp.assert_element_absent = CDPM.assert_element_absent
|
688
|
-
cdp.assert_element = CDPM.assert_element
|
689
|
-
cdp.assert_element_visible = CDPM.assert_element
|
690
694
|
cdp.assert_element_not_visible = CDPM.assert_element_not_visible
|
695
|
+
cdp.assert_element_attribute = CDPM.assert_element_attribute
|
691
696
|
cdp.assert_title = CDPM.assert_title
|
697
|
+
cdp.assert_title_contains = CDPM.assert_title_contains
|
698
|
+
cdp.assert_url = CDPM.assert_url
|
699
|
+
cdp.assert_url_contains = CDPM.assert_url_contains
|
692
700
|
cdp.assert_text = CDPM.assert_text
|
693
701
|
cdp.assert_exact_text = CDPM.assert_exact_text
|
694
702
|
cdp.scroll_into_view = CDPM.scroll_into_view
|
@@ -2442,10 +2450,8 @@ def _set_firefox_options(
|
|
2442
2450
|
firefox_arg_list = firefox_arg.split(",")
|
2443
2451
|
for firefox_arg_item in firefox_arg_list:
|
2444
2452
|
firefox_arg_item = firefox_arg_item.strip()
|
2445
|
-
if not firefox_arg_item.startswith("
|
2446
|
-
if firefox_arg_item.
|
2447
|
-
firefox_arg_item = "-" + firefox_arg_item
|
2448
|
-
else:
|
2453
|
+
if not firefox_arg_item.startswith("-"):
|
2454
|
+
if firefox_arg_item.count(os.sep) == 0:
|
2449
2455
|
firefox_arg_item = "--" + firefox_arg_item
|
2450
2456
|
if len(firefox_arg_item) >= 3:
|
2451
2457
|
options.add_argument(firefox_arg_item)
|
seleniumbase/core/sb_cdp.py
CHANGED
@@ -20,8 +20,16 @@ class CDPMethods():
|
|
20
20
|
self.driver = driver
|
21
21
|
|
22
22
|
def __slow_mode_pause_if_set(self):
|
23
|
-
if
|
24
|
-
|
23
|
+
if (
|
24
|
+
(hasattr(sb_config, "demo_mode") and sb_config.demo_mode)
|
25
|
+
or "--demo" in sys.argv
|
26
|
+
):
|
27
|
+
time.sleep(0.48)
|
28
|
+
elif (
|
29
|
+
(hasattr(sb_config, "slow_mode") and sb_config.slow_mode)
|
30
|
+
or "--slow" in sys.argv
|
31
|
+
):
|
32
|
+
time.sleep(0.24)
|
25
33
|
|
26
34
|
def __add_light_pause(self):
|
27
35
|
time.sleep(0.007)
|
@@ -543,7 +551,7 @@ class CDPMethods():
|
|
543
551
|
if (width != 0 or height != 0):
|
544
552
|
element.click()
|
545
553
|
click_count += 1
|
546
|
-
time.sleep(0.
|
554
|
+
time.sleep(0.044)
|
547
555
|
self.__slow_mode_pause_if_set()
|
548
556
|
self.loop.run_until_complete(self.page.wait())
|
549
557
|
except Exception:
|
@@ -660,10 +668,10 @@ class CDPMethods():
|
|
660
668
|
text = text[:-1]
|
661
669
|
for key in text:
|
662
670
|
element.send_keys(key)
|
663
|
-
time.sleep(0.
|
671
|
+
time.sleep(0.044)
|
664
672
|
if submit:
|
665
673
|
element.send_keys("\r\n")
|
666
|
-
time.sleep(0.
|
674
|
+
time.sleep(0.044)
|
667
675
|
self.__slow_mode_pause_if_set()
|
668
676
|
self.loop.run_until_complete(self.page.wait())
|
669
677
|
|
@@ -733,7 +741,7 @@ class CDPMethods():
|
|
733
741
|
return
|
734
742
|
elif self.get_window()[1].window_state.value == "minimized":
|
735
743
|
self.loop.run_until_complete(self.page.maximize())
|
736
|
-
time.sleep(0.
|
744
|
+
time.sleep(0.044)
|
737
745
|
return self.loop.run_until_complete(self.page.maximize())
|
738
746
|
|
739
747
|
def minimize(self):
|
@@ -743,7 +751,7 @@ class CDPMethods():
|
|
743
751
|
def medimize(self):
|
744
752
|
if self.get_window()[1].window_state.value == "minimized":
|
745
753
|
self.loop.run_until_complete(self.page.medimize())
|
746
|
-
time.sleep(0.
|
754
|
+
time.sleep(0.044)
|
747
755
|
return self.loop.run_until_complete(self.page.medimize())
|
748
756
|
|
749
757
|
def set_window_rect(self, x, y, width, height):
|
@@ -752,7 +760,7 @@ class CDPMethods():
|
|
752
760
|
self.page.set_window_size(
|
753
761
|
left=x, top=y, width=width, height=height)
|
754
762
|
)
|
755
|
-
time.sleep(0.
|
763
|
+
time.sleep(0.044)
|
756
764
|
return self.loop.run_until_complete(
|
757
765
|
self.page.set_window_size(
|
758
766
|
left=x, top=y, width=width, height=height)
|
@@ -1117,7 +1125,7 @@ class CDPMethods():
|
|
1117
1125
|
)
|
1118
1126
|
with gui_lock:
|
1119
1127
|
pyautogui.press(key)
|
1120
|
-
time.sleep(0.
|
1128
|
+
time.sleep(0.044)
|
1121
1129
|
self.__slow_mode_pause_if_set()
|
1122
1130
|
self.loop.run_until_complete(self.page.wait())
|
1123
1131
|
|
@@ -1131,7 +1139,7 @@ class CDPMethods():
|
|
1131
1139
|
with gui_lock:
|
1132
1140
|
for key in keys:
|
1133
1141
|
pyautogui.press(key)
|
1134
|
-
time.sleep(0.
|
1142
|
+
time.sleep(0.044)
|
1135
1143
|
self.__slow_mode_pause_if_set()
|
1136
1144
|
self.loop.run_until_complete(self.page.wait())
|
1137
1145
|
|
@@ -1472,25 +1480,53 @@ class CDPMethods():
|
|
1472
1480
|
return True
|
1473
1481
|
return False
|
1474
1482
|
|
1483
|
+
def wait_for_element_visible(
|
1484
|
+
self, selector, timeout=settings.SMALL_TIMEOUT
|
1485
|
+
):
|
1486
|
+
try:
|
1487
|
+
self.select(selector, timeout=timeout)
|
1488
|
+
except Exception:
|
1489
|
+
raise Exception("Element {%s} was not found!" % selector)
|
1490
|
+
for i in range(30):
|
1491
|
+
if self.is_element_visible(selector):
|
1492
|
+
return self.select(selector)
|
1493
|
+
time.sleep(0.1)
|
1494
|
+
raise Exception("Element {%s} was not visible!" % selector)
|
1495
|
+
|
1475
1496
|
def assert_element(self, selector, timeout=settings.SMALL_TIMEOUT):
|
1497
|
+
"""Same as assert_element_visible()"""
|
1476
1498
|
try:
|
1477
1499
|
self.select(selector, timeout=timeout)
|
1478
1500
|
except Exception:
|
1479
|
-
raise Exception("Element {%s} not found!" % selector)
|
1501
|
+
raise Exception("Element {%s} was not found!" % selector)
|
1480
1502
|
for i in range(30):
|
1481
1503
|
if self.is_element_visible(selector):
|
1482
1504
|
return True
|
1483
1505
|
time.sleep(0.1)
|
1484
|
-
raise Exception("Element {%s} not visible!" % selector)
|
1506
|
+
raise Exception("Element {%s} was not visible!" % selector)
|
1507
|
+
|
1508
|
+
def assert_element_visible(self, selector, timeout=settings.SMALL_TIMEOUT):
|
1509
|
+
"""Same as assert_element()"""
|
1510
|
+
try:
|
1511
|
+
self.select(selector, timeout=timeout)
|
1512
|
+
except Exception:
|
1513
|
+
raise Exception("Element {%s} was not found!" % selector)
|
1514
|
+
for i in range(30):
|
1515
|
+
if self.is_element_visible(selector):
|
1516
|
+
return True
|
1517
|
+
time.sleep(0.1)
|
1518
|
+
raise Exception("Element {%s} was not visible!" % selector)
|
1485
1519
|
|
1486
1520
|
def assert_element_present(self, selector, timeout=settings.SMALL_TIMEOUT):
|
1521
|
+
"""Assert element is present in the DOM. (Visibility NOT required)"""
|
1487
1522
|
try:
|
1488
1523
|
self.select(selector, timeout=timeout)
|
1489
1524
|
except Exception:
|
1490
|
-
raise Exception("Element {%s} not found!" % selector)
|
1525
|
+
raise Exception("Element {%s} was not found!" % selector)
|
1491
1526
|
return True
|
1492
1527
|
|
1493
1528
|
def assert_element_absent(self, selector, timeout=settings.SMALL_TIMEOUT):
|
1529
|
+
"""Assert element is not present in the DOM."""
|
1494
1530
|
start_ms = time.time() * 1000.0
|
1495
1531
|
stop_ms = start_ms + (timeout * 1000.0)
|
1496
1532
|
for i in range(int(timeout * 10)):
|
@@ -1511,6 +1547,7 @@ class CDPMethods():
|
|
1511
1547
|
def assert_element_not_visible(
|
1512
1548
|
self, selector, timeout=settings.SMALL_TIMEOUT
|
1513
1549
|
):
|
1550
|
+
"""Assert element is not visible on page. (May still be in DOM)"""
|
1514
1551
|
start_ms = time.time() * 1000.0
|
1515
1552
|
stop_ms = start_ms + (timeout * 1000.0)
|
1516
1553
|
for i in range(int(timeout * 10)):
|
@@ -1530,6 +1567,21 @@ class CDPMethods():
|
|
1530
1567
|
% (selector, timeout, plural)
|
1531
1568
|
)
|
1532
1569
|
|
1570
|
+
def assert_element_attribute(self, selector, attribute, value=None):
|
1571
|
+
attributes = self.get_element_attributes(selector)
|
1572
|
+
if attribute not in attributes:
|
1573
|
+
raise Exception(
|
1574
|
+
"Attribute {%s} was not found in element {%s}!"
|
1575
|
+
% (attribute, selector)
|
1576
|
+
)
|
1577
|
+
if value and attributes[attribute] != value:
|
1578
|
+
raise Exception(
|
1579
|
+
"Expected value {%s} of attribute {%s} "
|
1580
|
+
"was not found in element {%s}! "
|
1581
|
+
"(Actual value was {%s})"
|
1582
|
+
% (value, attribute, selector, attributes[attribute])
|
1583
|
+
)
|
1584
|
+
|
1533
1585
|
def assert_title(self, title):
|
1534
1586
|
expected = title.strip()
|
1535
1587
|
actual = self.get_title().strip()
|
@@ -1541,11 +1593,55 @@ class CDPMethods():
|
|
1541
1593
|
raise Exception(error % (expected, actual))
|
1542
1594
|
except Exception:
|
1543
1595
|
time.sleep(2)
|
1544
|
-
expected = title.strip()
|
1545
1596
|
actual = self.get_title().strip()
|
1546
1597
|
if expected != actual:
|
1547
1598
|
raise Exception(error % (expected, actual))
|
1548
1599
|
|
1600
|
+
def assert_title_contains(self, substring):
|
1601
|
+
expected = substring.strip()
|
1602
|
+
actual = self.get_title().strip()
|
1603
|
+
error = (
|
1604
|
+
"Expected title substring [%s] does not appear "
|
1605
|
+
"in the actual page title [%s]!"
|
1606
|
+
)
|
1607
|
+
try:
|
1608
|
+
if expected not in actual:
|
1609
|
+
raise Exception(error % (expected, actual))
|
1610
|
+
except Exception:
|
1611
|
+
time.sleep(2)
|
1612
|
+
actual = self.get_title().strip()
|
1613
|
+
if expected not in actual:
|
1614
|
+
raise Exception(error % (expected, actual))
|
1615
|
+
|
1616
|
+
def assert_url(self, url):
|
1617
|
+
expected = url.strip()
|
1618
|
+
actual = self.get_current_url().strip()
|
1619
|
+
error = "Expected URL [%s] does not match the actual URL [%s]!"
|
1620
|
+
try:
|
1621
|
+
if expected != actual:
|
1622
|
+
raise Exception(error % (expected, actual))
|
1623
|
+
except Exception:
|
1624
|
+
time.sleep(2)
|
1625
|
+
actual = self.get_current_url().strip()
|
1626
|
+
if expected != actual:
|
1627
|
+
raise Exception(error % (expected, actual))
|
1628
|
+
|
1629
|
+
def assert_url_contains(self, substring):
|
1630
|
+
expected = substring.strip()
|
1631
|
+
actual = self.get_current_url().strip()
|
1632
|
+
error = (
|
1633
|
+
"Expected URL substring [%s] does not appear "
|
1634
|
+
"in the full URL [%s]!"
|
1635
|
+
)
|
1636
|
+
try:
|
1637
|
+
if expected not in actual:
|
1638
|
+
raise Exception(error % (expected, actual))
|
1639
|
+
except Exception:
|
1640
|
+
time.sleep(2)
|
1641
|
+
actual = self.get_current_url().strip()
|
1642
|
+
if expected not in actual:
|
1643
|
+
raise Exception(error % (expected, actual))
|
1644
|
+
|
1549
1645
|
def assert_text(
|
1550
1646
|
self, text, selector="html", timeout=settings.SMALL_TIMEOUT
|
1551
1647
|
):
|
seleniumbase/core/sb_driver.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Add new methods to extend the driver"""
|
2
2
|
from contextlib import suppress
|
3
3
|
from selenium.webdriver.remote.webelement import WebElement
|
4
|
+
from seleniumbase.config import settings
|
4
5
|
from seleniumbase.fixtures import js_utils
|
5
6
|
from seleniumbase.fixtures import page_actions
|
6
7
|
from seleniumbase.fixtures import page_utils
|
@@ -189,6 +190,8 @@ class DriverMethods():
|
|
189
190
|
return False
|
190
191
|
|
191
192
|
def is_online(self):
|
193
|
+
if self.__is_cdp_swap_needed():
|
194
|
+
return self.driver.cdp.evaluate("navigator.onLine;")
|
192
195
|
return self.driver.execute_script("return navigator.onLine;")
|
193
196
|
|
194
197
|
def is_connected(self):
|
@@ -231,17 +234,35 @@ class DriverMethods():
|
|
231
234
|
return page_actions.get_text(self.driver, *args, **kwargs)
|
232
235
|
|
233
236
|
def get_active_element_css(self, *args, **kwargs):
|
237
|
+
if self.__is_cdp_swap_needed():
|
238
|
+
return self.driver.cdp.get_active_element_css()
|
234
239
|
return js_utils.get_active_element_css(self.driver, *args, **kwargs)
|
235
240
|
|
236
241
|
def get_locale_code(self, *args, **kwargs):
|
242
|
+
if self.__is_cdp_swap_needed():
|
243
|
+
return self.driver.cdp.get_locale_code()
|
237
244
|
return js_utils.get_locale_code(self.driver, *args, **kwargs)
|
238
245
|
|
246
|
+
def get_screen_rect(self, *args, **kwargs):
|
247
|
+
if self.__is_cdp_swap_needed():
|
248
|
+
return self.driver.cdp.get_screen_rect()
|
249
|
+
return js_utils.get_screen_rect(self.driver, *args, **kwargs)
|
250
|
+
|
239
251
|
def get_origin(self, *args, **kwargs):
|
252
|
+
if self.__is_cdp_swap_needed():
|
253
|
+
return self.driver.cdp.get_origin()
|
240
254
|
return js_utils.get_origin(self.driver, *args, **kwargs)
|
241
255
|
|
242
256
|
def get_user_agent(self, *args, **kwargs):
|
257
|
+
if self.__is_cdp_swap_needed():
|
258
|
+
return self.driver.cdp.get_user_agent()
|
243
259
|
return js_utils.get_user_agent(self.driver, *args, **kwargs)
|
244
260
|
|
261
|
+
def get_cookie_string(self, *args, **kwargs):
|
262
|
+
if self.__is_cdp_swap_needed():
|
263
|
+
return self.driver.cdp.get_cookie_string()
|
264
|
+
return js_utils.get_cookie_string(self.driver, *args, **kwargs)
|
265
|
+
|
245
266
|
def highlight(self, *args, **kwargs):
|
246
267
|
if self.__is_cdp_swap_needed():
|
247
268
|
selector = None
|
@@ -312,6 +333,16 @@ class DriverMethods():
|
|
312
333
|
iframe = self.locator(frame)
|
313
334
|
self.driver.switch_to.frame(iframe)
|
314
335
|
|
336
|
+
def reset_window_size(self):
|
337
|
+
if self.__is_cdp_swap_needed():
|
338
|
+
self.driver.cdp.reset_window_size()
|
339
|
+
return
|
340
|
+
x = settings.WINDOW_START_X
|
341
|
+
y = settings.WINDOW_START_Y
|
342
|
+
width = settings.CHROME_START_WIDTH
|
343
|
+
height = settings.CHROME_START_HEIGHT
|
344
|
+
self.driver.set_window_rect(x, y, width, height)
|
345
|
+
|
315
346
|
def set_wire_proxy(self, string):
|
316
347
|
"""Set a proxy server for selenium-wire mode ("--wire")
|
317
348
|
Examples: (ONLY avilable if using selenium-wire mode!)
|
@@ -1310,9 +1310,13 @@ class BaseCase(unittest.TestCase):
|
|
1310
1310
|
return self.get_page_title()
|
1311
1311
|
|
1312
1312
|
def get_user_agent(self):
|
1313
|
+
if self.__is_cdp_swap_needed():
|
1314
|
+
return self.cdp.get_user_agent()
|
1313
1315
|
return self.execute_script("return navigator.userAgent;")
|
1314
1316
|
|
1315
1317
|
def get_locale_code(self):
|
1318
|
+
if self.__is_cdp_swap_needed():
|
1319
|
+
return self.cdp.get_locale_code()
|
1316
1320
|
return self.execute_script(
|
1317
1321
|
"return navigator.language || navigator.languages[0];"
|
1318
1322
|
)
|
@@ -3448,6 +3452,13 @@ class BaseCase(unittest.TestCase):
|
|
3448
3452
|
y = element_rect["y"] + (element_rect["height"] / 2.0) + 0.5
|
3449
3453
|
return (x, y)
|
3450
3454
|
|
3455
|
+
def get_screen_rect(self):
|
3456
|
+
self.__check_scope()
|
3457
|
+
if self.__is_cdp_swap_needed():
|
3458
|
+
return self.cdp.get_screen_rect()
|
3459
|
+
self._check_browser()
|
3460
|
+
return self.driver.get_screen_rect()
|
3461
|
+
|
3451
3462
|
def get_window_rect(self):
|
3452
3463
|
self.__check_scope()
|
3453
3464
|
if self.__is_cdp_swap_needed():
|
@@ -3471,6 +3482,9 @@ class BaseCase(unittest.TestCase):
|
|
3471
3482
|
|
3472
3483
|
def set_window_rect(self, x, y, width, height):
|
3473
3484
|
self.__check_scope()
|
3485
|
+
if self.__is_cdp_swap_needed():
|
3486
|
+
self.cdp.set_window_rect(x, y, width, height)
|
3487
|
+
return
|
3474
3488
|
self._check_browser()
|
3475
3489
|
self.driver.set_window_rect(x, y, width, height)
|
3476
3490
|
self.__demo_mode_pause_if_active(tiny=True)
|
@@ -3489,10 +3503,35 @@ class BaseCase(unittest.TestCase):
|
|
3489
3503
|
|
3490
3504
|
def maximize_window(self):
|
3491
3505
|
self.__check_scope()
|
3506
|
+
if self.__is_cdp_swap_needed():
|
3507
|
+
self.cdp.maximize()
|
3508
|
+
return
|
3492
3509
|
self._check_browser()
|
3493
3510
|
self.driver.maximize_window()
|
3494
3511
|
self.__demo_mode_pause_if_active(tiny=True)
|
3495
3512
|
|
3513
|
+
def minimize_window(self):
|
3514
|
+
self.__check_scope()
|
3515
|
+
if self.__is_cdp_swap_needed():
|
3516
|
+
self.cdp.minimize()
|
3517
|
+
return
|
3518
|
+
self._check_browser()
|
3519
|
+
self.driver.minimize_window()
|
3520
|
+
self.__demo_mode_pause_if_active(tiny=True)
|
3521
|
+
|
3522
|
+
def reset_window_size(self):
|
3523
|
+
self.__check_scope()
|
3524
|
+
if self.__is_cdp_swap_needed():
|
3525
|
+
self.cdp.reset_window_size()
|
3526
|
+
return
|
3527
|
+
self._check_browser()
|
3528
|
+
x = settings.WINDOW_START_X
|
3529
|
+
y = settings.WINDOW_START_Y
|
3530
|
+
width = settings.CHROME_START_WIDTH
|
3531
|
+
height = settings.CHROME_START_HEIGHT
|
3532
|
+
self.set_window_rect(x, y, width, height)
|
3533
|
+
self.__demo_mode_pause_if_active(tiny=True)
|
3534
|
+
|
3496
3535
|
def switch_to_frame(self, frame="iframe", timeout=None):
|
3497
3536
|
"""Wait for an iframe to appear, and switch to it. This should be
|
3498
3537
|
usable as a drop-in replacement for driver.switch_to.frame().
|
@@ -4547,6 +4586,11 @@ class BaseCase(unittest.TestCase):
|
|
4547
4586
|
def get_cookies(self):
|
4548
4587
|
return self.driver.get_cookies()
|
4549
4588
|
|
4589
|
+
def get_cookie_string(self):
|
4590
|
+
if self.__is_cdp_swap_needed():
|
4591
|
+
return self.cdp.get_cookie_string()
|
4592
|
+
return self.execute_script("return document.cookie;")
|
4593
|
+
|
4550
4594
|
def add_cookie(self, cookie_dict, expiry=False):
|
4551
4595
|
"""Usage examples:
|
4552
4596
|
self.add_cookie({'name': 'foo', 'value': 'bar'})
|
@@ -5429,7 +5473,10 @@ class BaseCase(unittest.TestCase):
|
|
5429
5473
|
new_file = True
|
5430
5474
|
sb_config._recorded_actions[filename] = []
|
5431
5475
|
data.append("from seleniumbase import BaseCase")
|
5432
|
-
|
5476
|
+
if "--uc" in sys.argv:
|
5477
|
+
data.append('BaseCase.main(__name__, __file__, "--uc")')
|
5478
|
+
else:
|
5479
|
+
data.append("BaseCase.main(__name__, __file__)")
|
5433
5480
|
data.append("")
|
5434
5481
|
data.append("")
|
5435
5482
|
data.append("class %s(BaseCase):" % classname)
|
@@ -5439,7 +5486,13 @@ class BaseCase(unittest.TestCase):
|
|
5439
5486
|
data.append("class %s(BaseCase):" % classname)
|
5440
5487
|
data.append(" def %s(self):" % methodname)
|
5441
5488
|
if len(sb_actions) > 0:
|
5489
|
+
if "--uc" in sys.argv:
|
5490
|
+
data.append(" self.activate_cdp_mode()")
|
5442
5491
|
for action in sb_actions:
|
5492
|
+
if "--uc" in sys.argv:
|
5493
|
+
action = action.replace(
|
5494
|
+
"self.type(", "self.press_keys("
|
5495
|
+
)
|
5443
5496
|
data.append(" " + action)
|
5444
5497
|
else:
|
5445
5498
|
data.append(" pass")
|
@@ -5617,6 +5670,9 @@ class BaseCase(unittest.TestCase):
|
|
5617
5670
|
data.append(" Scenario: %s" % scenario_test)
|
5618
5671
|
if len(behave_actions) > 0:
|
5619
5672
|
count = 0
|
5673
|
+
if "--uc" in sys.argv:
|
5674
|
+
data.append(" Given Activate CDP Mode")
|
5675
|
+
count += 1
|
5620
5676
|
for action in behave_actions:
|
5621
5677
|
if count == 0:
|
5622
5678
|
data.append(" Given " + action)
|
@@ -7645,7 +7701,10 @@ class BaseCase(unittest.TestCase):
|
|
7645
7701
|
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
|
7646
7702
|
timeout = self.__get_new_timeout(timeout)
|
7647
7703
|
selector, by = self.__recalculate_selector(selector, by)
|
7648
|
-
if self.
|
7704
|
+
if self.__is_cdp_swap_needed():
|
7705
|
+
self.cdp.assert_element_attribute(selector, attribute, value)
|
7706
|
+
return
|
7707
|
+
elif self.__is_shadow_selector(selector):
|
7649
7708
|
return self.__wait_for_shadow_attribute_present(
|
7650
7709
|
selector, attribute, value=value, timeout=timeout
|
7651
7710
|
)
|
@@ -7670,6 +7729,9 @@ class BaseCase(unittest.TestCase):
|
|
7670
7729
|
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
|
7671
7730
|
timeout = self.__get_new_timeout(timeout)
|
7672
7731
|
selector, by = self.__recalculate_selector(selector, by)
|
7732
|
+
if self.__is_cdp_swap_needed():
|
7733
|
+
self.cdp.assert_element_attribute(selector, attribute, value)
|
7734
|
+
return
|
7673
7735
|
self.wait_for_attribute(
|
7674
7736
|
selector, attribute, value=value, by=by, timeout=timeout
|
7675
7737
|
)
|
@@ -7768,6 +7830,9 @@ class BaseCase(unittest.TestCase):
|
|
7768
7830
|
but then the title switches over to the actual page title.
|
7769
7831
|
In Recorder Mode, this assertion is skipped because the Recorder
|
7770
7832
|
changes the page title to the selector of the hovered element."""
|
7833
|
+
if self.__is_cdp_swap_needed():
|
7834
|
+
self.cdp.assert_title_contains(substring)
|
7835
|
+
return
|
7771
7836
|
self.wait_for_ready_state_complete()
|
7772
7837
|
expected = substring.strip()
|
7773
7838
|
actual = self.get_page_title().strip()
|
@@ -7811,6 +7876,9 @@ class BaseCase(unittest.TestCase):
|
|
7811
7876
|
|
7812
7877
|
def assert_url(self, url):
|
7813
7878
|
"""Asserts that the web page URL matches the expected URL."""
|
7879
|
+
if self.__is_cdp_swap_needed():
|
7880
|
+
self.cdp.assert_url(url)
|
7881
|
+
return
|
7814
7882
|
self.wait_for_ready_state_complete()
|
7815
7883
|
expected = url.strip()
|
7816
7884
|
actual = self.get_current_url().strip()
|
@@ -7846,6 +7914,9 @@ class BaseCase(unittest.TestCase):
|
|
7846
7914
|
|
7847
7915
|
def assert_url_contains(self, substring):
|
7848
7916
|
"""Asserts that the URL substring appears in the full URL."""
|
7917
|
+
if self.__is_cdp_swap_needed():
|
7918
|
+
self.cdp.assert_url_contains(substring)
|
7919
|
+
return
|
7849
7920
|
self.wait_for_ready_state_complete()
|
7850
7921
|
expected = substring.strip()
|
7851
7922
|
actual = self.get_current_url().strip()
|
@@ -8044,6 +8115,8 @@ class BaseCase(unittest.TestCase):
|
|
8044
8115
|
|
8045
8116
|
def is_online(self):
|
8046
8117
|
"""Return True if connected to the Internet."""
|
8118
|
+
if self.__is_cdp_swap_needed():
|
8119
|
+
return self.cdp.evaluate("navigator.onLine;")
|
8047
8120
|
return self.execute_script("return navigator.onLine;")
|
8048
8121
|
|
8049
8122
|
def is_connected(self):
|
@@ -8952,7 +9025,9 @@ class BaseCase(unittest.TestCase):
|
|
8952
9025
|
timeout = self.__get_new_timeout(timeout)
|
8953
9026
|
original_selector = selector
|
8954
9027
|
selector, by = self.__recalculate_selector(selector, by)
|
8955
|
-
if self.
|
9028
|
+
if self.__is_cdp_swap_needed():
|
9029
|
+
return self.cdp.select(selector)
|
9030
|
+
elif self.__is_shadow_selector(selector):
|
8956
9031
|
# If a shadow selector, use visible instead of clickable
|
8957
9032
|
return self.__wait_for_shadow_element_visible(selector, timeout)
|
8958
9033
|
return page_actions.wait_for_element_clickable(
|
@@ -9353,7 +9428,7 @@ class BaseCase(unittest.TestCase):
|
|
9353
9428
|
selector, by = self.__recalculate_selector(selector, by)
|
9354
9429
|
if self.__is_cdp_swap_needed():
|
9355
9430
|
return self.cdp.select(selector)
|
9356
|
-
|
9431
|
+
elif self.__is_shadow_selector(selector):
|
9357
9432
|
return self.__wait_for_shadow_element_present(selector, timeout)
|
9358
9433
|
return page_actions.wait_for_element_present(
|
9359
9434
|
self.driver,
|
@@ -9416,6 +9491,8 @@ class BaseCase(unittest.TestCase):
|
|
9416
9491
|
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
|
9417
9492
|
timeout = self.__get_new_timeout(timeout)
|
9418
9493
|
css_selector = self.convert_to_css_selector(selector, by=by)
|
9494
|
+
if self.__is_cdp_swap_needed():
|
9495
|
+
return self.cdp.select(css_selector)
|
9419
9496
|
return js_utils.wait_for_css_query_selector(
|
9420
9497
|
self.driver, css_selector, timeout
|
9421
9498
|
)
|
@@ -9637,7 +9714,7 @@ class BaseCase(unittest.TestCase):
|
|
9637
9714
|
selector, by = self.__recalculate_selector(selector, by)
|
9638
9715
|
if self.__is_cdp_swap_needed():
|
9639
9716
|
return self.cdp.find_element(selector)
|
9640
|
-
|
9717
|
+
elif self.__is_shadow_selector(selector):
|
9641
9718
|
return self.__wait_for_shadow_text_visible(text, selector, timeout)
|
9642
9719
|
return page_actions.wait_for_text_visible(
|
9643
9720
|
self.driver, text, selector, by, timeout
|
@@ -10160,6 +10237,9 @@ class BaseCase(unittest.TestCase):
|
|
10160
10237
|
timeout = settings.SMALL_TIMEOUT
|
10161
10238
|
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
|
10162
10239
|
timeout = self.__get_new_timeout(timeout)
|
10240
|
+
if self.__is_cdp_swap_needed():
|
10241
|
+
self.cdp.assert_element_not_visible(selector)
|
10242
|
+
return True
|
10163
10243
|
self.wait_for_element_not_visible(selector, by=by, timeout=timeout)
|
10164
10244
|
if self.recorder_mode and self.__current_url_is_recordable():
|
10165
10245
|
if self.get_session_storage_item("pause_recorder") == "no":
|
@@ -14496,7 +14576,7 @@ class BaseCase(unittest.TestCase):
|
|
14496
14576
|
message = (
|
14497
14577
|
"Expected value {%s} for attribute {%s} of element "
|
14498
14578
|
"{%s} was not present after %s second%s! "
|
14499
|
-
"(
|
14579
|
+
"(Actual value was {%s})"
|
14500
14580
|
% (
|
14501
14581
|
value,
|
14502
14582
|
attribute,
|
@@ -1188,6 +1188,10 @@ def get_locale_code(driver):
|
|
1188
1188
|
return driver.execute_script(script)
|
1189
1189
|
|
1190
1190
|
|
1191
|
+
def get_screen_rect(driver):
|
1192
|
+
return driver.execute_script("return window.screen;")
|
1193
|
+
|
1194
|
+
|
1191
1195
|
def get_origin(driver):
|
1192
1196
|
return driver.execute_script("return window.location.origin;")
|
1193
1197
|
|
@@ -1196,6 +1200,10 @@ def get_user_agent(driver):
|
|
1196
1200
|
return driver.execute_script("return navigator.userAgent;")
|
1197
1201
|
|
1198
1202
|
|
1203
|
+
def get_cookie_string(driver):
|
1204
|
+
return driver.execute_script("return document.cookie;")
|
1205
|
+
|
1206
|
+
|
1199
1207
|
def get_scroll_distance_to_element(driver, element):
|
1200
1208
|
try:
|
1201
1209
|
scroll_position = driver.execute_script("return window.scrollY;")
|
@@ -275,12 +275,15 @@ def SB(
|
|
275
275
|
collect_only = ("--co" in sys_argv or "--collect-only" in sys_argv)
|
276
276
|
all_scripts = (hasattr(sb_config, "all_scripts") and sb_config.all_scripts)
|
277
277
|
do_log_folder_setup = False # The first "test=True" run does it
|
278
|
+
inner_test = False
|
278
279
|
if (
|
279
280
|
(hasattr(sb_config, "is_behave") and sb_config.is_behave)
|
280
281
|
or (hasattr(sb_config, "is_pytest") and sb_config.is_pytest)
|
281
282
|
or (hasattr(sb_config, "is_nosetest") and sb_config.is_nosetest)
|
282
283
|
):
|
283
284
|
existing_runner = True
|
285
|
+
if test:
|
286
|
+
inner_test = True
|
284
287
|
test = False # Already using a test runner. Skip extra test steps.
|
285
288
|
elif test is None and "--test" in sys_argv:
|
286
289
|
test = True
|
@@ -1222,7 +1225,10 @@ def SB(
|
|
1222
1225
|
sb._has_failure = True
|
1223
1226
|
exception = e
|
1224
1227
|
test_passed = False
|
1225
|
-
if not test_name:
|
1228
|
+
if (test or inner_test) and not test_name:
|
1229
|
+
print(e)
|
1230
|
+
return
|
1231
|
+
elif not test_name:
|
1226
1232
|
raise
|
1227
1233
|
else:
|
1228
1234
|
the_traceback = traceback.format_exc().strip()
|
@@ -455,7 +455,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
455
455
|
if self.service.is_connectable():
|
456
456
|
self.stop_client()
|
457
457
|
self.service.stop()
|
458
|
-
|
458
|
+
self._is_connected = False
|
459
459
|
|
460
460
|
def connect(self):
|
461
461
|
"""Starts the chromedriver service that runs in the background
|
@@ -211,7 +211,11 @@ async def start(
|
|
211
211
|
expert=expert,
|
212
212
|
**kwargs,
|
213
213
|
)
|
214
|
-
|
214
|
+
try:
|
215
|
+
return await Browser.create(config)
|
216
|
+
except Exception:
|
217
|
+
time.sleep(0.15)
|
218
|
+
return await Browser.create(config)
|
215
219
|
|
216
220
|
|
217
221
|
async def start_async(*args, **kwargs) -> Browser:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.
|
3
|
+
Version: 4.33.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,12 +59,16 @@ 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>=24.
|
62
|
+
Requires-Dist: pip>=24.3.1
|
63
63
|
Requires-Dist: packaging>=24.2
|
64
|
-
Requires-Dist:
|
64
|
+
Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
65
|
+
Requires-Dist: setuptools>=75.6.0; python_version >= "3.10"
|
66
|
+
Requires-Dist: wheel>=0.45.1
|
65
67
|
Requires-Dist: attrs>=24.2.0
|
66
68
|
Requires-Dist: certifi>=2024.8.30
|
67
69
|
Requires-Dist: exceptiongroup>=1.2.2
|
70
|
+
Requires-Dist: websockets~=13.1; python_version < "3.9"
|
71
|
+
Requires-Dist: websockets>=14.1; python_version >= "3.9"
|
68
72
|
Requires-Dist: filelock>=3.16.1
|
69
73
|
Requires-Dist: fasteners>=0.19
|
70
74
|
Requires-Dist: mycdp>=1.1.0
|
@@ -78,11 +82,14 @@ Requires-Dist: parse-type>=0.6.4
|
|
78
82
|
Requires-Dist: colorama>=0.4.6
|
79
83
|
Requires-Dist: pyyaml>=6.0.2
|
80
84
|
Requires-Dist: pygments>=2.18.0
|
85
|
+
Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
|
81
86
|
Requires-Dist: tabcompleter>=1.4.0
|
82
87
|
Requires-Dist: pdbp>=1.6.1
|
83
88
|
Requires-Dist: idna==3.10
|
84
89
|
Requires-Dist: chardet==5.2.0
|
85
90
|
Requires-Dist: charset-normalizer==3.4.0
|
91
|
+
Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
|
92
|
+
Requires-Dist: urllib3<2.3.0,>=1.26.20; python_version >= "3.10"
|
86
93
|
Requires-Dist: requests==2.32.3
|
87
94
|
Requires-Dist: sniffio==1.3.1
|
88
95
|
Requires-Dist: h11==0.14.0
|
@@ -91,7 +98,7 @@ Requires-Dist: trio==0.27.0
|
|
91
98
|
Requires-Dist: trio-websocket==0.11.1
|
92
99
|
Requires-Dist: wsproto==1.2.0
|
93
100
|
Requires-Dist: websocket-client==1.8.0
|
94
|
-
Requires-Dist: selenium==4.
|
101
|
+
Requires-Dist: selenium==4.27.1
|
95
102
|
Requires-Dist: cssselect==1.2.0
|
96
103
|
Requires-Dist: sortedcontainers==2.4.0
|
97
104
|
Requires-Dist: execnet==2.1.1
|
@@ -102,40 +109,34 @@ Requires-Dist: pytest==8.3.3
|
|
102
109
|
Requires-Dist: pytest-html==2.0.1
|
103
110
|
Requires-Dist: pytest-metadata==3.1.1
|
104
111
|
Requires-Dist: pytest-ordering==0.6
|
105
|
-
Requires-Dist: pytest-rerunfailures==14.0
|
112
|
+
Requires-Dist: pytest-rerunfailures==14.0; python_version < "3.9"
|
113
|
+
Requires-Dist: pytest-rerunfailures==15.0; python_version >= "3.9"
|
106
114
|
Requires-Dist: pytest-xdist==3.6.1
|
107
115
|
Requires-Dist: parameterized==0.9.0
|
108
116
|
Requires-Dist: behave==1.2.6
|
109
117
|
Requires-Dist: soupsieve==2.6
|
110
118
|
Requires-Dist: beautifulsoup4==4.12.3
|
111
119
|
Requires-Dist: pyotp==2.9.0
|
120
|
+
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
112
121
|
Requires-Dist: markdown-it-py==3.0.0
|
113
122
|
Requires-Dist: mdurl==0.1.2
|
114
123
|
Requires-Dist: rich==13.9.4
|
115
|
-
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
116
|
-
Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
|
117
|
-
Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
118
|
-
Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
|
119
|
-
Requires-Dist: websockets~=13.1; python_version < "3.9"
|
120
|
-
Requires-Dist: setuptools>=75.5.0; python_version >= "3.10"
|
121
|
-
Requires-Dist: urllib3<2.3.0,>=1.26.20; python_version >= "3.10"
|
122
|
-
Requires-Dist: websockets>=14.1; python_version >= "3.9"
|
123
124
|
Provides-Extra: allure
|
124
125
|
Requires-Dist: allure-pytest>=2.13.5; extra == "allure"
|
125
126
|
Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
|
126
127
|
Requires-Dist: allure-behave>=2.13.5; extra == "allure"
|
127
128
|
Provides-Extra: coverage
|
128
129
|
Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
|
130
|
+
Requires-Dist: coverage>=7.6.8; python_version >= "3.9" and extra == "coverage"
|
129
131
|
Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
|
130
|
-
Requires-Dist: coverage>=7.6.5; python_version >= "3.9" and extra == "coverage"
|
131
132
|
Requires-Dist: pytest-cov>=6.0.0; python_version >= "3.9" and extra == "coverage"
|
132
133
|
Provides-Extra: flake8
|
133
|
-
Requires-Dist: mccabe==0.7.0; extra == "flake8"
|
134
134
|
Requires-Dist: flake8==5.0.4; python_version < "3.9" and extra == "flake8"
|
135
|
-
Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
|
136
|
-
Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
|
137
135
|
Requires-Dist: flake8==7.1.1; python_version >= "3.9" and extra == "flake8"
|
136
|
+
Requires-Dist: mccabe==0.7.0; extra == "flake8"
|
137
|
+
Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
|
138
138
|
Requires-Dist: pyflakes==3.2.0; python_version >= "3.9" and extra == "flake8"
|
139
|
+
Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
|
139
140
|
Requires-Dist: pycodestyle==2.12.1; python_version >= "3.9" and extra == "flake8"
|
140
141
|
Provides-Extra: ipdb
|
141
142
|
Requires-Dist: ipdb==0.13.13; extra == "ipdb"
|
@@ -144,10 +145,10 @@ Provides-Extra: mss
|
|
144
145
|
Requires-Dist: mss==9.0.2; extra == "mss"
|
145
146
|
Provides-Extra: pdfminer
|
146
147
|
Requires-Dist: pdfminer.six==20240706; extra == "pdfminer"
|
147
|
-
Requires-Dist: cffi==1.17.1; extra == "pdfminer"
|
148
|
-
Requires-Dist: pycparser==2.22; extra == "pdfminer"
|
149
148
|
Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
|
150
149
|
Requires-Dist: cryptography==43.0.3; python_version >= "3.9" and extra == "pdfminer"
|
150
|
+
Requires-Dist: cffi==1.17.1; extra == "pdfminer"
|
151
|
+
Requires-Dist: pycparser==2.22; extra == "pdfminer"
|
151
152
|
Provides-Extra: pillow
|
152
153
|
Requires-Dist: Pillow>=10.4.0; python_version < "3.9" and extra == "pillow"
|
153
154
|
Requires-Dist: Pillow>=11.0.0; python_version >= "3.9" and extra == "pillow"
|
@@ -1,15 +1,15 @@
|
|
1
1
|
sbase/__init__.py,sha256=02izDj786GVBT0bpSq2Q2O8uwSxtyT09pnobZz91ML8,605
|
2
2
|
sbase/__main__.py,sha256=G0bVB1-DM4PGwQ1KyOupaWCs4ePbChZNNWuX2htim5U,647
|
3
|
-
sbase/steps.py,sha256=
|
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=QWcZHZxKcoTjnqMUASmFQCA91tzSUF4vP43yJf9hNSk,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=-hza7Nx2U41mSObYiPMi48v3JlPh3sJO3yzP0kqZ1Gk,59174
|
10
10
|
seleniumbase/behave/steps.py,sha256=8-N-NB2tnDsxaP4LSg-uSBgbwZYMS6ZEL1oggO1PCoU,390
|
11
11
|
seleniumbase/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
-
seleniumbase/common/decorators.py,sha256=
|
12
|
+
seleniumbase/common/decorators.py,sha256=DYdjtF8Y7YJj0JS33WtmsIn4yddPoniNwcPyrgt522o,7857
|
13
13
|
seleniumbase/common/encryption.py,sha256=IfAuE0hdrd3y-_qAQUWdSOKRGQ4QN24uTOBiQ9Eeq2s,5593
|
14
14
|
seleniumbase/common/exceptions.py,sha256=SbdHOTbg7ycrioWleAVw9kG9vBtDfbYoj3e7ikkYYz0,3257
|
15
15
|
seleniumbase/common/obfuscate.py,sha256=VrwPbVigPH_Jk6ADCk5_miMoq1VK4M9SKnYScDkk-DQ,1204
|
@@ -30,13 +30,13 @@ seleniumbase/console_scripts/sb_mkchart.py,sha256=ep9g-9CSIwaOJKVxhB3xjRQpfsuApy
|
|
30
30
|
seleniumbase/console_scripts/sb_mkdir.py,sha256=csqyWGEUdT2slLnQU3p9gnu5qE26TSVi_ZE3wttH_SQ,29778
|
31
31
|
seleniumbase/console_scripts/sb_mkfile.py,sha256=OWYd4yFccmjrd-gNn1t1una-HDRU2_N2-r4Tg3nHsj0,17744
|
32
32
|
seleniumbase/console_scripts/sb_mkpres.py,sha256=EWFRVacjYTX49y-fEiYTZacM9_01IxuuaO4nMjHrIGo,11015
|
33
|
-
seleniumbase/console_scripts/sb_mkrec.py,sha256=
|
33
|
+
seleniumbase/console_scripts/sb_mkrec.py,sha256=PrizjTmyrROYPO0yDm-zQS3QSfsZNeAmcJKKUvfgLhc,11966
|
34
34
|
seleniumbase/console_scripts/sb_objectify.py,sha256=nGxtVGL_nHj0bLHvk86znV3EABsE2_tjF74lgto1_Mk,122020
|
35
35
|
seleniumbase/console_scripts/sb_print.py,sha256=tNy-bMDgwHJO3bZxMpmo9weSE8uhbH0CUpP4VZqWxvI,30558
|
36
|
-
seleniumbase/console_scripts/sb_recorder.py,sha256=
|
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=GT7S15R_nxJJUesB693ST2F0kUMNn4FXrwiNBoXAKpE,220293
|
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
|
@@ -50,8 +50,8 @@ seleniumbase/core/proxy_helper.py,sha256=cXhu8ErK9Vjdm82RMaQj7hEq_yUWizSp6LyiD50
|
|
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=4H91tZw77A8capl7wsRjzkpD62H018AmzKSQpmxXp6k,66948
|
54
|
+
seleniumbase/core/sb_driver.py,sha256=NGa4adi8OAi2WFtFkEguXg3JCd1p-JuZweIpGNifEfU,13488
|
55
55
|
seleniumbase/core/session_helper.py,sha256=s9zD3PVZEWVzG2h81cCUskbNWLfdjC_LwwQjKptHCak,558
|
56
56
|
seleniumbase/core/settings_parser.py,sha256=KokVXpCiGZhJ-D4Bo-hizPz5r-iefzWoiTANu9zNaq4,7504
|
57
57
|
seleniumbase/core/style_sheet.py,sha256=tPpJ1xl6Kuw425Z-3Y0OgVRLGXk_ciBDREZjXk_NuPE,11395
|
@@ -65,11 +65,11 @@ seleniumbase/extensions/disable_csp.zip,sha256=YMifIIgEBiLrEFrS1sfW4Exh4br1V4oK1
|
|
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=_A6LC26exhIz_4o3XXCmn36JeVmC3gJLKSJQeUXLFRg,716755
|
69
69
|
seleniumbase/fixtures/constants.py,sha256=e1LppavlrAcI4XBJMq7u5j8SffaQ7SPQps1y0YvZYfY,13649
|
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=uHJ7RdOzvSkhG81nnO_m9qFRVmfCUsYbkH463q_w8Bo,51121
|
73
73
|
seleniumbase/fixtures/page_actions.py,sha256=dbp63c-7asYZyd8aOu57Y3dxQQozp_VJsP5h74s1kBA,66552
|
74
74
|
seleniumbase/fixtures/page_utils.py,sha256=5m7iXpikLs80TJoRO6_gEfXE1AKeQgcH1aFbR8o1C9A,12034
|
75
75
|
seleniumbase/fixtures/shared_utils.py,sha256=WbPb15IvIWzRtMInKG8DUzJ26UZU-PixdOwTCjXQirU,7545
|
@@ -90,7 +90,7 @@ seleniumbase/plugins/driver_manager.py,sha256=s20s0pJYaNrG0WNwyIC04oUMRVFjtm6V_n
|
|
90
90
|
seleniumbase/plugins/page_source.py,sha256=loTnXxOj4kxEukuTZEiGyvKBhY3KDVDMnNlHHheTBDE,1889
|
91
91
|
seleniumbase/plugins/pytest_plugin.py,sha256=Up96HY6q3hcPo4LQoEcKqt1hm2OmY5GZz_nMXTqDSXQ,97185
|
92
92
|
seleniumbase/plugins/s3_logging_plugin.py,sha256=WDfertQgGOW_SRJpFMaekYD6vBVW9VO62POtXXy2HCM,2319
|
93
|
-
seleniumbase/plugins/sb_manager.py,sha256=
|
93
|
+
seleniumbase/plugins/sb_manager.py,sha256=qCf6RAkAfziLTGgiJvB3V416RxWoTbRLm9wc-KsB8g8,54419
|
94
94
|
seleniumbase/plugins/screen_shots.py,sha256=1hrXw-hzuZ1BR6Yh7AyWX2ABnvnP73-RCbwdz958gj4,1127
|
95
95
|
seleniumbase/plugins/selenium_plugin.py,sha256=GhGW2ATy2kM7UH7NrZ2je402nN2LMlVHpM-yxlU3I9E,59069
|
96
96
|
seleniumbase/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -106,7 +106,7 @@ 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=PSaAVgWU-yU1zwts2-UIJMWS6Mwo1YwAw0pMlSx6jVM,22998
|
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
|
@@ -116,7 +116,7 @@ seleniumbase/undetected/webelement.py,sha256=_s6evgUkdWJpwOnzX4qR9i796PoVbz3txlz
|
|
116
116
|
seleniumbase/undetected/cdp_driver/__init__.py,sha256=c0TjMwPfVFyoqYOJ7PQ-Jln_L_dpN3ebHyaD-juQoM0,64
|
117
117
|
seleniumbase/undetected/cdp_driver/_contradict.py,sha256=6thDYeoEGiC7Q3tXLgoD_AhxecCFnATzBSjNympyRHA,3184
|
118
118
|
seleniumbase/undetected/cdp_driver/browser.py,sha256=mGmpWuR206yYJoBPTNslru8CbEpQuvvIHdjBylSkoKg,30020
|
119
|
-
seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=
|
119
|
+
seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=YhtD2Tm6PLIy9VKbgk8lHdGniS3mObyX4yAC1aG0TgQ,16733
|
120
120
|
seleniumbase/undetected/cdp_driver/config.py,sha256=Rjvde7V-XJ0ihZdTmOmHEVWSuDWm3SprQ3njg8SN3Go,12087
|
121
121
|
seleniumbase/undetected/cdp_driver/connection.py,sha256=sOTUGjbUqKA2hPvDcRCdqw1VQjVGJs7mbgVvzS7ldtE,23360
|
122
122
|
seleniumbase/undetected/cdp_driver/element.py,sha256=wEHtuF9oiny7cb4QMMjdtD5Yf1z3WOs2_NHEWcscusM,40289
|
@@ -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.33.0.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
|
139
|
+
seleniumbase-4.33.0.dist-info/METADATA,sha256=vubW0bw2Oh3djh-PyVRyNtMR0qOqUWSzYo05-T_IE5w,86554
|
140
|
+
seleniumbase-4.33.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
141
|
+
seleniumbase-4.33.0.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
|
142
|
+
seleniumbase-4.33.0.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
|
143
|
+
seleniumbase-4.33.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|