seleniumbase 4.32.11__py3-none-any.whl → 4.33.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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
|