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.
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.28.2"
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 uc_gui_handle_cf(driver, frame="iframe"):
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" not in source
656
- and 'aria-label="Cloudflare"' not in source
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 hasattr(driver, "_is_using_uc") and driver._is_using_uc:
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(driver, window, timeout=settings.SMALL_TIMEOUT):
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.2
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.6.2
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.1.1 ; python_version >= "3.8"
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.25.1 ; python_version >= "3.8"
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.3.0 ; (python_version >= "3.8") and extra == 'pillow'
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.4 ; extra == 'proxy'
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=5LdSq2oRCgT1RzNcyA-lqWKjAcD-Zx80dQ77gewKL18,46
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=SaXoKQkbybkJ8Sqi3FIsG8SInFYncRQTzAjar97HNlY,176804
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=qCh7W-WPtmpnSUsyc6CbERE4AH415Hp7Ms33GnLw_xo,698095
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=lsat_gPsTwTsnqOrtCHZogDsufzMfUGjQ1ihiMjSeUk,62867
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.2.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
141
- seleniumbase-4.28.2.dist-info/METADATA,sha256=4Tzxn1C24HxU7bFYBN93SWfE-YAQPQwqShJcXwDtUlA,85546
142
- seleniumbase-4.28.2.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
143
- seleniumbase-4.28.2.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
- seleniumbase-4.28.2.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
- seleniumbase-4.28.2.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.1)
2
+ Generator: setuptools (70.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5