seleniumbase 4.28.3__py3-none-any.whl → 4.28.4a1__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 +128 -3
- seleniumbase/fixtures/base_case.py +69 -3
- {seleniumbase-4.28.3.dist-info → seleniumbase-4.28.4a1.dist-info}/METADATA +6 -6
- {seleniumbase-4.28.3.dist-info → seleniumbase-4.28.4a1.dist-info}/RECORD +9 -9
- {seleniumbase-4.28.3.dist-info → seleniumbase-4.28.4a1.dist-info}/WHEEL +1 -1
- {seleniumbase-4.28.3.dist-info → seleniumbase-4.28.4a1.dist-info}/LICENSE +0 -0
- {seleniumbase-4.28.3.dist-info → seleniumbase-4.28.4a1.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.28.3.dist-info → seleniumbase-4.28.4a1.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.4a1"
|
@@ -649,12 +649,125 @@ 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):
|
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
|
+
pyautogui.moveTo(x, y, timeframe, pyautogui.easeOutQuad)
|
675
|
+
if timeframe >= 0.25:
|
676
|
+
time.sleep(0.0555) # Wait if moving at human-speed
|
677
|
+
if "--debug" in sys.argv:
|
678
|
+
print(" <DEBUG> pyautogui.click(%s, %s)" % (x, y))
|
679
|
+
pyautogui.click(x=x, y=y)
|
680
|
+
|
681
|
+
|
682
|
+
def on_a_cf_turnstile_page(driver):
|
653
683
|
source = driver.get_page_source()
|
654
684
|
if (
|
655
|
-
"//challenges.cloudflare.com"
|
656
|
-
|
685
|
+
"//challenges.cloudflare.com" in source
|
686
|
+
or 'aria-label="Cloudflare"' in source
|
657
687
|
):
|
688
|
+
return True
|
689
|
+
return False
|
690
|
+
|
691
|
+
|
692
|
+
def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
|
693
|
+
if not on_a_cf_turnstile_page(driver):
|
694
|
+
return
|
695
|
+
install_pyautogui_if_missing(driver)
|
696
|
+
import pyautogui
|
697
|
+
pyautogui = get_configured_pyautogui(pyautogui)
|
698
|
+
x = None
|
699
|
+
y = None
|
700
|
+
gui_lock = fasteners.InterProcessLock(
|
701
|
+
constants.MultiBrowser.PYAUTOGUILOCK
|
702
|
+
)
|
703
|
+
with gui_lock: # Prevent issues with multiple processes
|
704
|
+
needs_switch = False
|
705
|
+
is_in_frame = js_utils.is_in_frame(driver)
|
706
|
+
if is_in_frame and driver.is_element_present("#challenge-stage"):
|
707
|
+
driver.switch_to.parent_frame()
|
708
|
+
needs_switch = True
|
709
|
+
is_in_frame = js_utils.is_in_frame(driver)
|
710
|
+
if not is_in_frame:
|
711
|
+
# Make sure the window is on top
|
712
|
+
page_actions.switch_to_window(
|
713
|
+
driver, driver.current_window_handle, 2, uc_lock=False
|
714
|
+
)
|
715
|
+
if not is_in_frame or needs_switch:
|
716
|
+
# Currently not in frame (or nested frame outside CF one)
|
717
|
+
try:
|
718
|
+
i_x, i_y = get_gui_element_position(driver, "iframe")
|
719
|
+
driver.switch_to_frame(frame)
|
720
|
+
except Exception:
|
721
|
+
if driver.is_element_present("iframe"):
|
722
|
+
i_x, i_y = get_gui_element_position(driver, "iframe")
|
723
|
+
driver.switch_to_frame("iframe")
|
724
|
+
else:
|
725
|
+
return
|
726
|
+
try:
|
727
|
+
selector = "span"
|
728
|
+
element = driver.wait_for_element_present(selector, timeout=2)
|
729
|
+
x = i_x + element.rect["x"] + int(element.rect["width"] / 2) + 1
|
730
|
+
y = i_y + element.rect["y"] + int(element.rect["height"] / 2) + 1
|
731
|
+
driver.switch_to.default_content()
|
732
|
+
except Exception:
|
733
|
+
try:
|
734
|
+
driver.switch_to.default_content()
|
735
|
+
except Exception:
|
736
|
+
return
|
737
|
+
driver.disconnect()
|
738
|
+
try:
|
739
|
+
if x and y:
|
740
|
+
sb_config._saved_cf_x_y = (x, y)
|
741
|
+
uc_gui_click_x_y(driver, x, y, timeframe=0.842)
|
742
|
+
except Exception:
|
743
|
+
pass
|
744
|
+
reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
|
745
|
+
if IS_LINUX:
|
746
|
+
reconnect_time = constants.UC.RECONNECT_TIME
|
747
|
+
if not x or not y:
|
748
|
+
reconnect_time = 1 # Make it quick (it already failed)
|
749
|
+
driver.reconnect(reconnect_time)
|
750
|
+
if blind:
|
751
|
+
retry = True
|
752
|
+
if retry and x and y and on_a_cf_turnstile_page(driver):
|
753
|
+
driver.switch_to_frame("iframe")
|
754
|
+
if driver.is_element_visible("#success-icon"):
|
755
|
+
driver.switch_to.parent_frame()
|
756
|
+
return
|
757
|
+
if blind:
|
758
|
+
driver.uc_open_with_disconnect(driver.current_url, 3.8)
|
759
|
+
uc_gui_click_x_y(driver, x, y, timeframe=1.05)
|
760
|
+
driver.reconnect(reconnect_time)
|
761
|
+
else:
|
762
|
+
driver.uc_open_with_reconnect(driver.current_url, 3.8)
|
763
|
+
if on_a_cf_turnstile_page(driver):
|
764
|
+
driver.disconnect()
|
765
|
+
uc_gui_click_x_y(driver, x, y, timeframe=1.05)
|
766
|
+
driver.reconnect(reconnect_time)
|
767
|
+
|
768
|
+
|
769
|
+
def uc_gui_handle_cf(driver, frame="iframe"):
|
770
|
+
if not on_a_cf_turnstile_page(driver):
|
658
771
|
return
|
659
772
|
install_pyautogui_if_missing(driver)
|
660
773
|
import pyautogui
|
@@ -696,6 +809,8 @@ def uc_gui_handle_cf(driver, frame="iframe"):
|
|
696
809
|
except Exception:
|
697
810
|
pass
|
698
811
|
reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
|
812
|
+
if IS_LINUX:
|
813
|
+
reconnect_time = constants.UC.RECONNECT_TIME
|
699
814
|
driver.reconnect(reconnect_time)
|
700
815
|
|
701
816
|
|
@@ -4027,6 +4142,16 @@ def get_local_driver(
|
|
4027
4142
|
driver, *args, **kwargs
|
4028
4143
|
)
|
4029
4144
|
)
|
4145
|
+
driver.uc_gui_click_x_y = (
|
4146
|
+
lambda *args, **kwargs: uc_gui_click_x_y(
|
4147
|
+
driver, *args, **kwargs
|
4148
|
+
)
|
4149
|
+
)
|
4150
|
+
driver.uc_gui_click_cf = (
|
4151
|
+
lambda *args, **kwargs: uc_gui_click_cf(
|
4152
|
+
driver, *args, **kwargs
|
4153
|
+
)
|
4154
|
+
)
|
4030
4155
|
driver.uc_gui_handle_cf = (
|
4031
4156
|
lambda *args, **kwargs: uc_gui_handle_cf(
|
4032
4157
|
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"):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.28.
|
3
|
+
Version: 4.28.4a1
|
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=LuplWFkCnURG8S5Ug851xWuiai-6wpOHdyGC1D8NYQU,48
|
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=hWxgwElRcGkrd70_T080Z9gPqrVypWn4UhXeoBSWq2s,181734
|
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,7 +70,7 @@ 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
|
@@ -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.4a1.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
|
141
|
+
seleniumbase-4.28.4a1.dist-info/METADATA,sha256=ahzWYHH7Ma97Gr6ri4stnRZfA4voUMK5B0HI5VAXZsc,85548
|
142
|
+
seleniumbase-4.28.4a1.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
|
143
|
+
seleniumbase-4.28.4a1.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
|
144
|
+
seleniumbase-4.28.4a1.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
|
145
|
+
seleniumbase-4.28.4a1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|