seleniumbase 4.28.2__py3-none-any.whl → 4.28.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- seleniumbase/__version__.py +1 -1
- seleniumbase/core/browser_launcher.py +148 -4
- seleniumbase/fixtures/base_case.py +69 -3
- seleniumbase/fixtures/page_actions.py +15 -5
- {seleniumbase-4.28.2.dist-info → seleniumbase-4.28.4.dist-info}/METADATA +6 -6
- {seleniumbase-4.28.2.dist-info → seleniumbase-4.28.4.dist-info}/RECORD +10 -10
- {seleniumbase-4.28.2.dist-info → seleniumbase-4.28.4.dist-info}/WHEEL +1 -1
- {seleniumbase-4.28.2.dist-info → seleniumbase-4.28.4.dist-info}/LICENSE +0 -0
- {seleniumbase-4.28.2.dist-info → seleniumbase-4.28.4.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.28.2.dist-info → seleniumbase-4.28.4.dist-info}/top_level.txt +0 -0
seleniumbase/__version__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.28.
|
2
|
+
__version__ = "4.28.4"
|
@@ -649,12 +649,144 @@ def uc_gui_write(driver, text):
|
|
649
649
|
pyautogui.write(text)
|
650
650
|
|
651
651
|
|
652
|
-
def
|
652
|
+
def get_gui_element_position(driver, selector):
|
653
|
+
element = driver.wait_for_element_present(selector, timeout=3)
|
654
|
+
element_rect = element.rect
|
655
|
+
window_rect = driver.get_window_rect()
|
656
|
+
window_bottom_y = window_rect["y"] + window_rect["height"]
|
657
|
+
viewport_height = driver.execute_script("return window.innerHeight;")
|
658
|
+
viewport_x = window_rect["x"] + element_rect["x"]
|
659
|
+
viewport_y = window_bottom_y - viewport_height + element_rect["y"]
|
660
|
+
return (viewport_x, viewport_y)
|
661
|
+
|
662
|
+
|
663
|
+
def uc_gui_click_x_y(driver, x, y, timeframe=0.25, uc_lock=True):
|
664
|
+
install_pyautogui_if_missing(driver)
|
665
|
+
import pyautogui
|
666
|
+
pyautogui = get_configured_pyautogui(pyautogui)
|
667
|
+
screen_width, screen_height = pyautogui.size()
|
668
|
+
if x > screen_width or y > screen_height:
|
669
|
+
raise Exception(
|
670
|
+
"PyAutoGUI cannot click on point (%s, %s)"
|
671
|
+
" outside screen. (Width: %s, Height: %s)"
|
672
|
+
% (x, y, screen_width, screen_height)
|
673
|
+
)
|
674
|
+
if uc_lock:
|
675
|
+
gui_lock = fasteners.InterProcessLock(
|
676
|
+
constants.MultiBrowser.PYAUTOGUILOCK
|
677
|
+
)
|
678
|
+
with gui_lock: # Prevent issues with multiple processes
|
679
|
+
pyautogui.moveTo(x, y, timeframe, pyautogui.easeOutQuad)
|
680
|
+
if timeframe >= 0.25:
|
681
|
+
time.sleep(0.0555) # Wait if moving at human-speed
|
682
|
+
if "--debug" in sys.argv:
|
683
|
+
print(" <DEBUG> pyautogui.click(%s, %s)" % (x, y))
|
684
|
+
pyautogui.click(x=x, y=y)
|
685
|
+
else:
|
686
|
+
# Called from a method where the gui_lock is already active
|
687
|
+
pyautogui.moveTo(x, y, timeframe, pyautogui.easeOutQuad)
|
688
|
+
if timeframe >= 0.25:
|
689
|
+
time.sleep(0.0555) # Wait if moving at human-speed
|
690
|
+
if "--debug" in sys.argv:
|
691
|
+
print(" <DEBUG> pyautogui.click(%s, %s)" % (x, y))
|
692
|
+
pyautogui.click(x=x, y=y)
|
693
|
+
|
694
|
+
|
695
|
+
def on_a_cf_turnstile_page(driver):
|
653
696
|
source = driver.get_page_source()
|
654
697
|
if (
|
655
|
-
"//challenges.cloudflare.com"
|
656
|
-
|
698
|
+
"//challenges.cloudflare.com" in source
|
699
|
+
or 'aria-label="Cloudflare"' in source
|
657
700
|
):
|
701
|
+
return True
|
702
|
+
return False
|
703
|
+
|
704
|
+
|
705
|
+
def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
|
706
|
+
if not on_a_cf_turnstile_page(driver):
|
707
|
+
return
|
708
|
+
install_pyautogui_if_missing(driver)
|
709
|
+
import pyautogui
|
710
|
+
pyautogui = get_configured_pyautogui(pyautogui)
|
711
|
+
x = None
|
712
|
+
y = None
|
713
|
+
gui_lock = fasteners.InterProcessLock(
|
714
|
+
constants.MultiBrowser.PYAUTOGUILOCK
|
715
|
+
)
|
716
|
+
with gui_lock: # Prevent issues with multiple processes
|
717
|
+
needs_switch = False
|
718
|
+
is_in_frame = js_utils.is_in_frame(driver)
|
719
|
+
if is_in_frame and driver.is_element_present("#challenge-stage"):
|
720
|
+
driver.switch_to.parent_frame()
|
721
|
+
needs_switch = True
|
722
|
+
is_in_frame = js_utils.is_in_frame(driver)
|
723
|
+
if not is_in_frame:
|
724
|
+
# Make sure the window is on top
|
725
|
+
page_actions.switch_to_window(
|
726
|
+
driver, driver.current_window_handle, 2, uc_lock=False
|
727
|
+
)
|
728
|
+
if not is_in_frame or needs_switch:
|
729
|
+
# Currently not in frame (or nested frame outside CF one)
|
730
|
+
try:
|
731
|
+
i_x, i_y = get_gui_element_position(driver, "iframe")
|
732
|
+
driver.switch_to_frame(frame)
|
733
|
+
except Exception:
|
734
|
+
if driver.is_element_present("iframe"):
|
735
|
+
i_x, i_y = get_gui_element_position(driver, "iframe")
|
736
|
+
driver.switch_to_frame("iframe")
|
737
|
+
else:
|
738
|
+
return
|
739
|
+
try:
|
740
|
+
selector = "span"
|
741
|
+
element = driver.wait_for_element_present(selector, timeout=2.5)
|
742
|
+
x = i_x + element.rect["x"] + int(element.rect["width"] / 2) + 1
|
743
|
+
y = i_y + element.rect["y"] + int(element.rect["height"] / 2) + 1
|
744
|
+
driver.switch_to.default_content()
|
745
|
+
except Exception:
|
746
|
+
try:
|
747
|
+
driver.switch_to.default_content()
|
748
|
+
except Exception:
|
749
|
+
return
|
750
|
+
driver.disconnect()
|
751
|
+
try:
|
752
|
+
if x and y:
|
753
|
+
sb_config._saved_cf_x_y = (x, y)
|
754
|
+
uc_gui_click_x_y(driver, x, y, timeframe=0.842, uc_lock=False)
|
755
|
+
except Exception:
|
756
|
+
pass
|
757
|
+
reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
|
758
|
+
if IS_LINUX:
|
759
|
+
reconnect_time = constants.UC.RECONNECT_TIME
|
760
|
+
if not x or not y:
|
761
|
+
reconnect_time = 1 # Make it quick (it already failed)
|
762
|
+
driver.reconnect(reconnect_time)
|
763
|
+
if blind:
|
764
|
+
retry = True
|
765
|
+
if retry and x and y and on_a_cf_turnstile_page(driver):
|
766
|
+
with gui_lock: # Prevent issues with multiple processes
|
767
|
+
# Make sure the window is on top
|
768
|
+
page_actions.switch_to_window(
|
769
|
+
driver, driver.current_window_handle, 2, uc_lock=False
|
770
|
+
)
|
771
|
+
driver.switch_to_frame("iframe")
|
772
|
+
if driver.is_element_visible("#success-icon"):
|
773
|
+
driver.switch_to.parent_frame()
|
774
|
+
return
|
775
|
+
if blind:
|
776
|
+
driver.uc_open_with_disconnect(driver.current_url, 3.8)
|
777
|
+
uc_gui_click_x_y(driver, x, y, timeframe=1.05, uc_lock=False)
|
778
|
+
else:
|
779
|
+
driver.uc_open_with_reconnect(driver.current_url, 3.8)
|
780
|
+
if on_a_cf_turnstile_page(driver):
|
781
|
+
driver.disconnect()
|
782
|
+
uc_gui_click_x_y(
|
783
|
+
driver, x, y, timeframe=1.05, uc_lock=False
|
784
|
+
)
|
785
|
+
driver.reconnect(reconnect_time)
|
786
|
+
|
787
|
+
|
788
|
+
def uc_gui_handle_cf(driver, frame="iframe"):
|
789
|
+
if not on_a_cf_turnstile_page(driver):
|
658
790
|
return
|
659
791
|
install_pyautogui_if_missing(driver)
|
660
792
|
import pyautogui
|
@@ -672,7 +804,7 @@ def uc_gui_handle_cf(driver, frame="iframe"):
|
|
672
804
|
if not is_in_frame:
|
673
805
|
# Make sure the window is on top
|
674
806
|
page_actions.switch_to_window(
|
675
|
-
driver, driver.current_window_handle, 2
|
807
|
+
driver, driver.current_window_handle, 2, uc_lock=False
|
676
808
|
)
|
677
809
|
if not is_in_frame or needs_switch:
|
678
810
|
# Currently not in frame (or nested frame outside CF one)
|
@@ -696,6 +828,8 @@ def uc_gui_handle_cf(driver, frame="iframe"):
|
|
696
828
|
except Exception:
|
697
829
|
pass
|
698
830
|
reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
|
831
|
+
if IS_LINUX:
|
832
|
+
reconnect_time = constants.UC.RECONNECT_TIME
|
699
833
|
driver.reconnect(reconnect_time)
|
700
834
|
|
701
835
|
|
@@ -4027,6 +4161,16 @@ def get_local_driver(
|
|
4027
4161
|
driver, *args, **kwargs
|
4028
4162
|
)
|
4029
4163
|
)
|
4164
|
+
driver.uc_gui_click_x_y = (
|
4165
|
+
lambda *args, **kwargs: uc_gui_click_x_y(
|
4166
|
+
driver, *args, **kwargs
|
4167
|
+
)
|
4168
|
+
)
|
4169
|
+
driver.uc_gui_click_cf = (
|
4170
|
+
lambda *args, **kwargs: uc_gui_click_cf(
|
4171
|
+
driver, *args, **kwargs
|
4172
|
+
)
|
4173
|
+
)
|
4030
4174
|
driver.uc_gui_handle_cf = (
|
4031
4175
|
lambda *args, **kwargs: uc_gui_handle_cf(
|
4032
4176
|
driver, *args, **kwargs
|
@@ -3393,23 +3393,85 @@ class BaseCase(unittest.TestCase):
|
|
3393
3393
|
self.activate_jquery()
|
3394
3394
|
return self.driver.execute_script(script, *args, **kwargs)
|
3395
3395
|
|
3396
|
+
def get_gui_element_rect(self, selector, by="css selector"):
|
3397
|
+
"""Very similar to element.rect, but the x, y coordinates are
|
3398
|
+
relative to the entire screen, rather than the browser window.
|
3399
|
+
This is specifically for PyAutoGUI actions on the full screen.
|
3400
|
+
(Note: There may be complications if iframes are involved.)"""
|
3401
|
+
element = self.wait_for_element_present(selector, by=by, timeout=1)
|
3402
|
+
element_rect = element.rect
|
3403
|
+
e_width = element_rect["width"]
|
3404
|
+
e_height = element_rect["height"]
|
3405
|
+
i_x = 0
|
3406
|
+
i_y = 0
|
3407
|
+
iframe_switch = False
|
3408
|
+
if self.__is_in_frame():
|
3409
|
+
self.switch_to_parent_frame()
|
3410
|
+
if self.__is_in_frame():
|
3411
|
+
raise Exception("Nested iframes breaks get_gui_element_rect!")
|
3412
|
+
iframe_switch = True
|
3413
|
+
iframe = self.wait_for_element_present("iframe", timeout=1)
|
3414
|
+
i_x = iframe.rect["x"]
|
3415
|
+
i_y = iframe.rect["y"]
|
3416
|
+
window_rect = self.get_window_rect()
|
3417
|
+
w_bottom_y = window_rect["y"] + window_rect["height"]
|
3418
|
+
viewport_height = self.execute_script("return window.innerHeight;")
|
3419
|
+
x = math.ceil(window_rect["x"] + i_x + element_rect["x"])
|
3420
|
+
y = math.ceil(w_bottom_y - viewport_height + i_y + element_rect["y"])
|
3421
|
+
if iframe_switch:
|
3422
|
+
self.switch_to_frame()
|
3423
|
+
if not self.is_element_present(selector, by=by):
|
3424
|
+
self.switch_to_parent_frame()
|
3425
|
+
return ({"height": e_height, "width": e_width, "x": x, "y": y})
|
3426
|
+
|
3427
|
+
def get_gui_element_center(self, selector, by="css selector"):
|
3428
|
+
"""Returns the x, y coordinates of the element's center based
|
3429
|
+
on the entire GUI / screen, rather than on the browser window.
|
3430
|
+
This is specifically for PyAutoGUI actions on the full screen.
|
3431
|
+
(Note: There may be complications if iframes are involved.)"""
|
3432
|
+
element_rect = self.get_gui_element_rect(selector, by=by)
|
3433
|
+
x = int(element_rect["x"]) + int(element_rect["width"] / 2) + 1
|
3434
|
+
y = int(element_rect["y"]) + int(element_rect["height"] / 2) + 1
|
3435
|
+
return (x, y)
|
3436
|
+
|
3437
|
+
def get_window_rect(self):
|
3438
|
+
self.__check_scope()
|
3439
|
+
self._check_browser()
|
3440
|
+
return self.driver.get_window_rect()
|
3441
|
+
|
3442
|
+
def get_window_size(self):
|
3443
|
+
self.__check_scope()
|
3444
|
+
self._check_browser()
|
3445
|
+
return self.driver.get_window_size()
|
3446
|
+
|
3447
|
+
def get_window_position(self):
|
3448
|
+
self.__check_scope()
|
3449
|
+
self._check_browser()
|
3450
|
+
return self.driver.get_window_position()
|
3451
|
+
|
3396
3452
|
def set_window_rect(self, x, y, width, height):
|
3397
3453
|
self.__check_scope()
|
3398
3454
|
self._check_browser()
|
3399
3455
|
self.driver.set_window_rect(x, y, width, height)
|
3400
|
-
self.__demo_mode_pause_if_active()
|
3456
|
+
self.__demo_mode_pause_if_active(tiny=True)
|
3401
3457
|
|
3402
3458
|
def set_window_size(self, width, height):
|
3403
3459
|
self.__check_scope()
|
3404
3460
|
self._check_browser()
|
3405
3461
|
self.driver.set_window_size(width, height)
|
3406
|
-
self.__demo_mode_pause_if_active()
|
3462
|
+
self.__demo_mode_pause_if_active(tiny=True)
|
3463
|
+
|
3464
|
+
def set_window_position(self, x, y):
|
3465
|
+
self.__check_scope()
|
3466
|
+
self._check_browser()
|
3467
|
+
self.driver.set_window_position(x, y)
|
3468
|
+
self.__demo_mode_pause_if_active(tiny=True)
|
3407
3469
|
|
3408
3470
|
def maximize_window(self):
|
3409
3471
|
self.__check_scope()
|
3410
3472
|
self._check_browser()
|
3411
3473
|
self.driver.maximize_window()
|
3412
|
-
self.__demo_mode_pause_if_active()
|
3474
|
+
self.__demo_mode_pause_if_active(tiny=True)
|
3413
3475
|
|
3414
3476
|
def switch_to_frame(self, frame="iframe", timeout=None):
|
3415
3477
|
"""Wait for an iframe to appear, and switch to it. This should be
|
@@ -4178,6 +4240,10 @@ class BaseCase(unittest.TestCase):
|
|
4178
4240
|
self.uc_gui_press_keys = new_driver.uc_gui_press_keys
|
4179
4241
|
if hasattr(new_driver, "uc_gui_write"):
|
4180
4242
|
self.uc_gui_write = new_driver.uc_gui_write
|
4243
|
+
if hasattr(new_driver, "uc_gui_click_x_y"):
|
4244
|
+
self.uc_gui_click_x_y = new_driver.uc_gui_click_x_y
|
4245
|
+
if hasattr(new_driver, "uc_gui_click_cf"):
|
4246
|
+
self.uc_gui_click_cf = new_driver.uc_gui_click_cf
|
4181
4247
|
if hasattr(new_driver, "uc_gui_handle_cf"):
|
4182
4248
|
self.uc_gui_handle_cf = new_driver.uc_gui_handle_cf
|
4183
4249
|
if hasattr(new_driver, "uc_switch_to_frame"):
|
@@ -1430,8 +1430,12 @@ def switch_to_frame(driver, frame, timeout=settings.SMALL_TIMEOUT):
|
|
1430
1430
|
timeout_exception(Exception, message)
|
1431
1431
|
|
1432
1432
|
|
1433
|
-
def __switch_to_window(driver, window_handle):
|
1434
|
-
if
|
1433
|
+
def __switch_to_window(driver, window_handle, uc_lock=True):
|
1434
|
+
if (
|
1435
|
+
hasattr(driver, "_is_using_uc")
|
1436
|
+
and driver._is_using_uc
|
1437
|
+
and uc_lock
|
1438
|
+
):
|
1435
1439
|
gui_lock = fasteners.InterProcessLock(
|
1436
1440
|
constants.MultiBrowser.PYAUTOGUILOCK
|
1437
1441
|
)
|
@@ -1442,7 +1446,12 @@ def __switch_to_window(driver, window_handle):
|
|
1442
1446
|
return True
|
1443
1447
|
|
1444
1448
|
|
1445
|
-
def switch_to_window(
|
1449
|
+
def switch_to_window(
|
1450
|
+
driver,
|
1451
|
+
window,
|
1452
|
+
timeout=settings.SMALL_TIMEOUT,
|
1453
|
+
uc_lock=True,
|
1454
|
+
):
|
1446
1455
|
"""
|
1447
1456
|
Wait for a window to appear, and switch to it. This should be usable
|
1448
1457
|
as a drop-in replacement for driver.switch_to.window().
|
@@ -1450,6 +1459,7 @@ def switch_to_window(driver, window, timeout=settings.SMALL_TIMEOUT):
|
|
1450
1459
|
driver - the webdriver object (required)
|
1451
1460
|
window - the window index or window handle
|
1452
1461
|
timeout - the time to wait for the window in seconds
|
1462
|
+
uc_lock - if UC Mode and True, switch_to_window() uses thread-locking
|
1453
1463
|
"""
|
1454
1464
|
if window == -1:
|
1455
1465
|
window = len(driver.window_handles) - 1
|
@@ -1465,7 +1475,7 @@ def switch_to_window(driver, window, timeout=settings.SMALL_TIMEOUT):
|
|
1465
1475
|
shared_utils.check_if_time_limit_exceeded()
|
1466
1476
|
try:
|
1467
1477
|
window_handle = driver.window_handles[window]
|
1468
|
-
__switch_to_window(driver, window_handle)
|
1478
|
+
__switch_to_window(driver, window_handle, uc_lock=uc_lock)
|
1469
1479
|
return True
|
1470
1480
|
except IndexError:
|
1471
1481
|
now_ms = time.time() * 1000.0
|
@@ -1486,7 +1496,7 @@ def switch_to_window(driver, window, timeout=settings.SMALL_TIMEOUT):
|
|
1486
1496
|
for x in range(int(timeout * 10)):
|
1487
1497
|
shared_utils.check_if_time_limit_exceeded()
|
1488
1498
|
try:
|
1489
|
-
__switch_to_window(driver, window_handle)
|
1499
|
+
__switch_to_window(driver, window_handle, uc_lock=uc_lock)
|
1490
1500
|
return True
|
1491
1501
|
except NoSuchWindowException:
|
1492
1502
|
now_ms = time.time() * 1000.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.28.
|
3
|
+
Version: 4.28.4
|
4
4
|
Summary: A complete web automation framework for end-to-end testing.
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
6
6
|
Author: Michael Mintz
|
@@ -59,7 +59,7 @@ Requires-Python: >=3.7
|
|
59
59
|
Description-Content-Type: text/markdown
|
60
60
|
License-File: LICENSE
|
61
61
|
Requires-Dist: attrs >=23.2.0
|
62
|
-
Requires-Dist: certifi >=2024.
|
62
|
+
Requires-Dist: certifi >=2024.7.4
|
63
63
|
Requires-Dist: exceptiongroup >=1.2.1
|
64
64
|
Requires-Dist: parse >=1.20.2
|
65
65
|
Requires-Dist: parse-type >=0.6.2
|
@@ -115,12 +115,12 @@ Requires-Dist: markdown-it-py ==2.2.0 ; python_version < "3.8"
|
|
115
115
|
Requires-Dist: urllib3 <2.3.0,>=1.26.18 ; python_version >= "3.10"
|
116
116
|
Requires-Dist: pip >=24.1.1 ; python_version >= "3.8"
|
117
117
|
Requires-Dist: packaging >=24.1 ; python_version >= "3.8"
|
118
|
-
Requires-Dist: setuptools >=70.
|
118
|
+
Requires-Dist: setuptools >=70.2.0 ; python_version >= "3.8"
|
119
119
|
Requires-Dist: wheel >=0.43.0 ; python_version >= "3.8"
|
120
120
|
Requires-Dist: filelock >=3.15.4 ; python_version >= "3.8"
|
121
121
|
Requires-Dist: platformdirs >=4.2.2 ; python_version >= "3.8"
|
122
122
|
Requires-Dist: typing-extensions >=4.12.2 ; python_version >= "3.8"
|
123
|
-
Requires-Dist: trio ==0.
|
123
|
+
Requires-Dist: trio ==0.26.0 ; python_version >= "3.8"
|
124
124
|
Requires-Dist: websocket-client ==1.8.0 ; python_version >= "3.8"
|
125
125
|
Requires-Dist: selenium ==4.22.0 ; python_version >= "3.8"
|
126
126
|
Requires-Dist: execnet ==2.1.1 ; python_version >= "3.8"
|
@@ -162,11 +162,11 @@ Requires-Dist: cffi ==1.16.0 ; (python_version >= "3.8") and extra == 'pdfminer'
|
|
162
162
|
Requires-Dist: cryptography ==42.0.8 ; (python_version >= "3.9") and extra == 'pdfminer'
|
163
163
|
Provides-Extra: pillow
|
164
164
|
Requires-Dist: Pillow ==9.5.0 ; (python_version < "3.8") and extra == 'pillow'
|
165
|
-
Requires-Dist: Pillow >=10.
|
165
|
+
Requires-Dist: Pillow >=10.4.0 ; (python_version >= "3.8") and extra == 'pillow'
|
166
166
|
Provides-Extra: pip-system-certs
|
167
167
|
Requires-Dist: pip-system-certs ==4.0 ; (platform_system == "Windows") and extra == 'pip-system-certs'
|
168
168
|
Provides-Extra: proxy
|
169
|
-
Requires-Dist: proxy.py ==2.4.
|
169
|
+
Requires-Dist: proxy.py ==2.4.3 ; extra == 'proxy'
|
170
170
|
Provides-Extra: psutil
|
171
171
|
Requires-Dist: psutil ==5.9.8 ; extra == 'psutil'
|
172
172
|
Provides-Extra: pyautogui
|
@@ -5,7 +5,7 @@ sbase/steps.py,sha256=bKT_u5bJkKzYWEuAXi9NVVRYYxQRCM1_YJUrNFFRVPY,42865
|
|
5
5
|
seleniumbase/ReadMe.md,sha256=4nEdto4d0Ch0Zneg0yAC-RBBdqRqPUP0SCo-ze_XDPM,3612
|
6
6
|
seleniumbase/__init__.py,sha256=dgq30q6wGO2fJOVYemxC5hLxzv-of-MRn5P1YarBq5k,2263
|
7
7
|
seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
|
8
|
-
seleniumbase/__version__.py,sha256=
|
8
|
+
seleniumbase/__version__.py,sha256=GqsU2Pnospr9PDFlGL11hfJERXvsfTuOee7ww0lKDl8,46
|
9
9
|
seleniumbase/behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
seleniumbase/behave/behave_helper.py,sha256=elkl8P9eLulRAioLstE9baYNM9N_PHBmAOcajX-pH_Y,24198
|
11
11
|
seleniumbase/behave/behave_sb.py,sha256=q4uYZixZBf7VYWnQnEk2weTcyMy1X1faR3vyYvUzDiA,56406
|
@@ -40,7 +40,7 @@ seleniumbase/console_scripts/sb_print.py,sha256=yo641b_OdSE0GUauOyxk-QrNeIjYzbRY
|
|
40
40
|
seleniumbase/console_scripts/sb_recorder.py,sha256=UQQhnAR18dbcC7ToDvj6TM2PIG5qBrNaekaM6kSK_E8,10970
|
41
41
|
seleniumbase/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
42
42
|
seleniumbase/core/application_manager.py,sha256=e_0sjtI8cjY5BNyZj1QBR0j6_oCScxGmSXYEpcYwuZE,576
|
43
|
-
seleniumbase/core/browser_launcher.py,sha256=
|
43
|
+
seleniumbase/core/browser_launcher.py,sha256=iARPYQoqT2qq4P6uVfyJL-cFwXmu0Cq0i6iK1PKuomA,182677
|
44
44
|
seleniumbase/core/capabilities_parser.py,sha256=meIS2uHapTCq2ldfNAToC7r0cKmZDRXuYNKExM1GHDY,6038
|
45
45
|
seleniumbase/core/colored_traceback.py,sha256=DrRWfg7XEnKcgY59Xj7Jdk09H-XqHYBSUpB-DiZt6iY,2020
|
46
46
|
seleniumbase/core/create_db_tables.sql,sha256=VWPtrdiW_HQ6yETHjqTu-VIrTwvd8I8o1NfBeaVSHpU,972
|
@@ -70,12 +70,12 @@ seleniumbase/extensions/disable_csp.zip,sha256=YMifIIgEBiLrEFrS1sfW4Exh4br1V4oK1
|
|
70
70
|
seleniumbase/extensions/recorder.zip,sha256=OOyzF-Ize2cSRu1CqhzSAq5vusI9hqLLd2OIApUHesI,11918
|
71
71
|
seleniumbase/extensions/sbase_ext.zip,sha256=3s1N8zrVaMz8RQEOIoBzC3KDjtmHwVZRvVsX25Odr_s,8175
|
72
72
|
seleniumbase/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
73
|
-
seleniumbase/fixtures/base_case.py,sha256=
|
73
|
+
seleniumbase/fixtures/base_case.py,sha256=le9PvYxZzLnGPo-8CcF-RIeCQPv0LeuJGCEV5OIs63Q,701104
|
74
74
|
seleniumbase/fixtures/constants.py,sha256=TapuGLdERtvZPGMblVXkNGybr8tj8FMtN3sbJ3ygyoc,13569
|
75
75
|
seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
|
76
76
|
seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
|
77
77
|
seleniumbase/fixtures/js_utils.py,sha256=y1FgWvrg7CjryqGnFhbmFIIVYMzQfYZhwppYae87UCo,51158
|
78
|
-
seleniumbase/fixtures/page_actions.py,sha256=
|
78
|
+
seleniumbase/fixtures/page_actions.py,sha256=_LBmIqKBdRlgrKnl6aKUcHbns1GC18_YNvuRniRv1V8,63066
|
79
79
|
seleniumbase/fixtures/page_utils.py,sha256=QmAvTlT0j0ESf1IgvyXwHJapJakFM7QqBLXnHXgaeJw,12596
|
80
80
|
seleniumbase/fixtures/shared_utils.py,sha256=Fc78v0OxfLPOPqeT8ExsdkTgXHlmpxvJeLbLyDnu1dI,5748
|
81
81
|
seleniumbase/fixtures/unittest_helper.py,sha256=sfZ92rZeBAn_sF_yQ3I6_I7h3lyU5-cV_UMegBNoEm8,1294
|
@@ -137,9 +137,9 @@ seleniumbase/utilities/selenium_grid/start-grid-hub.sh,sha256=KADv0RUHONLL2_I443
|
|
137
137
|
seleniumbase/utilities/selenium_ide/ReadMe.md,sha256=hznGeuMpkIimqMiZBW-4goIy2ltW4l8X9kb0YSPUQfE,4483
|
138
138
|
seleniumbase/utilities/selenium_ide/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
139
139
|
seleniumbase/utilities/selenium_ide/convert_ide.py,sha256=pZFnqEJQEKZPyNFjkLD29s2HPQgCrWW9XJWpCPhWOoM,31691
|
140
|
-
seleniumbase-4.28.
|
141
|
-
seleniumbase-4.28.
|
142
|
-
seleniumbase-4.28.
|
143
|
-
seleniumbase-4.28.
|
144
|
-
seleniumbase-4.28.
|
145
|
-
seleniumbase-4.28.
|
140
|
+
seleniumbase-4.28.4.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
|
141
|
+
seleniumbase-4.28.4.dist-info/METADATA,sha256=g7wyUzKeBoxVbKkiXW0sh8l_1ldNXCsbiIjs3hpX-lY,85546
|
142
|
+
seleniumbase-4.28.4.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
|
143
|
+
seleniumbase-4.28.4.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
|
144
|
+
seleniumbase-4.28.4.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
|
145
|
+
seleniumbase-4.28.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|