seleniumbase 4.28.4a1__py3-none-any.whl → 4.28.6__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.4a1"
2
+ __version__ = "4.28.6"
@@ -586,6 +586,29 @@ def install_pyautogui_if_missing(driver):
586
586
  shared_utils.pip_install(
587
587
  "pyautogui", version=constants.PyAutoGUI.VER
588
588
  )
589
+ try:
590
+ import pyautogui
591
+ except Exception:
592
+ if (
593
+ IS_LINUX
594
+ and hasattr(sb_config, "xvfb")
595
+ and hasattr(sb_config, "headed")
596
+ and hasattr(sb_config, "headless")
597
+ and hasattr(sb_config, "headless2")
598
+ and (not sb_config.headed or sb_config.xvfb)
599
+ and not (sb_config.headless or sb_config.headless2)
600
+ ):
601
+ from sbvirtualdisplay import Display
602
+ try:
603
+ xvfb_display = Display(
604
+ visible=True,
605
+ size=(1366, 768),
606
+ backend="xvfb",
607
+ use_xauth=True,
608
+ )
609
+ xvfb_display.start()
610
+ except Exception:
611
+ pass
589
612
 
590
613
 
591
614
  def get_configured_pyautogui(pyautogui_copy):
@@ -660,7 +683,7 @@ def get_gui_element_position(driver, selector):
660
683
  return (viewport_x, viewport_y)
661
684
 
662
685
 
663
- def uc_gui_click_x_y(driver, x, y, timeframe=0.25):
686
+ def _uc_gui_click_x_y(driver, x, y, timeframe=0.25, uc_lock=False):
664
687
  install_pyautogui_if_missing(driver)
665
688
  import pyautogui
666
689
  pyautogui = get_configured_pyautogui(pyautogui)
@@ -671,32 +694,86 @@ def uc_gui_click_x_y(driver, x, y, timeframe=0.25):
671
694
  " outside screen. (Width: %s, Height: %s)"
672
695
  % (x, y, screen_width, screen_height)
673
696
  )
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)
697
+ if uc_lock:
698
+ gui_lock = fasteners.InterProcessLock(
699
+ constants.MultiBrowser.PYAUTOGUILOCK
700
+ )
701
+ with gui_lock: # Prevent issues with multiple processes
702
+ pyautogui.moveTo(x, y, timeframe, pyautogui.easeOutQuad)
703
+ if timeframe >= 0.25:
704
+ time.sleep(0.056) # Wait if moving at human-speed
705
+ if "--debug" in sys.argv:
706
+ print(" <DEBUG> pyautogui.click(%s, %s)" % (x, y))
707
+ pyautogui.click(x=x, y=y)
708
+ else:
709
+ # Called from a method where the gui_lock is already active
710
+ pyautogui.moveTo(x, y, timeframe, pyautogui.easeOutQuad)
711
+ if timeframe >= 0.25:
712
+ time.sleep(0.056) # Wait if moving at human-speed
713
+ if "--debug" in sys.argv:
714
+ print(" <DEBUG> pyautogui.click(%s, %s)" % (x, y))
715
+ pyautogui.click(x=x, y=y)
716
+
717
+
718
+ def uc_gui_click_x_y(driver, x, y, timeframe=0.25):
719
+ _uc_gui_click_x_y(driver, x, y, timeframe=timeframe, uc_lock=True)
680
720
 
681
721
 
682
- def on_a_cf_turnstile_page(driver):
722
+ def _on_a_cf_turnstile_page(driver):
683
723
  source = driver.get_page_source()
684
724
  if (
685
- "//challenges.cloudflare.com" in source
686
- or 'aria-label="Cloudflare"' in source
725
+ 'data-callback="onCaptchaSuccess"' in source
726
+ or "cf-turnstile-wrapper" in source
687
727
  ):
688
728
  return True
689
729
  return False
690
730
 
691
731
 
692
- def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
693
- if not on_a_cf_turnstile_page(driver):
694
- return
732
+ def _on_a_g_recaptcha_page(driver):
733
+ source = driver.get_page_source()
734
+ if (
735
+ 'id="recaptcha-token"' in source
736
+ or 'title="reCAPTCHA"' in source
737
+ ):
738
+ return True
739
+ return False
740
+
741
+
742
+ def _uc_gui_click_captcha(
743
+ driver,
744
+ frame="iframe",
745
+ retry=False,
746
+ blind=False,
747
+ ctype=None,
748
+ ):
749
+ _on_a_captcha_page = None
750
+ if ctype == "cf_t":
751
+ if not _on_a_cf_turnstile_page(driver):
752
+ return
753
+ else:
754
+ _on_a_captcha_page = _on_a_cf_turnstile_page
755
+ elif ctype == "g_rc":
756
+ if not _on_a_g_recaptcha_page(driver):
757
+ return
758
+ else:
759
+ _on_a_captcha_page = _on_a_g_recaptcha_page
760
+ else:
761
+ if _on_a_g_recaptcha_page(driver):
762
+ ctype = "g_rc"
763
+ _on_a_captcha_page = _on_a_g_recaptcha_page
764
+ elif _on_a_cf_turnstile_page(driver):
765
+ ctype = "cf_t"
766
+ _on_a_captcha_page = _on_a_cf_turnstile_page
767
+ else:
768
+ return
695
769
  install_pyautogui_if_missing(driver)
696
770
  import pyautogui
697
771
  pyautogui = get_configured_pyautogui(pyautogui)
772
+ i_x = None
773
+ i_y = None
698
774
  x = None
699
775
  y = None
776
+ visible_iframe = True
700
777
  gui_lock = fasteners.InterProcessLock(
701
778
  constants.MultiBrowser.PYAUTOGUILOCK
702
779
  )
@@ -712,22 +789,54 @@ def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
712
789
  page_actions.switch_to_window(
713
790
  driver, driver.current_window_handle, 2, uc_lock=False
714
791
  )
792
+ if ctype == "cf_t":
793
+ if (
794
+ driver.is_element_present(".cf-turnstile-wrapper iframe")
795
+ or driver.is_element_present(
796
+ '[data-callback="onCaptchaSuccess"] iframe'
797
+ )
798
+ ):
799
+ pass
800
+ else:
801
+ visible_iframe = False
802
+ if driver.is_element_present(".cf-turnstile-wrapper"):
803
+ frame = ".cf-turnstile-wrapper"
804
+ elif driver.is_element_present(
805
+ '[data-callback="onCaptchaSuccess"]'
806
+ ):
807
+ frame = '[data-callback="onCaptchaSuccess"]'
808
+ else:
809
+ return
715
810
  if not is_in_frame or needs_switch:
716
811
  # Currently not in frame (or nested frame outside CF one)
717
812
  try:
718
- i_x, i_y = get_gui_element_position(driver, "iframe")
719
- driver.switch_to_frame(frame)
813
+ i_x, i_y = get_gui_element_position(driver, frame)
814
+ if visible_iframe:
815
+ driver.switch_to_frame(frame)
720
816
  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
817
+ if visible_iframe:
818
+ if driver.is_element_present("iframe"):
819
+ i_x, i_y = get_gui_element_position(driver, "iframe")
820
+ driver.switch_to_frame("iframe")
821
+ else:
822
+ return
823
+ if not i_x or not i_y:
824
+ return
726
825
  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
826
+ if visible_iframe:
827
+ selector = "span"
828
+ if ctype == "g_rc":
829
+ selector = "span.recaptcha-checkbox"
830
+ element = driver.wait_for_element_present(
831
+ selector, timeout=2.5
832
+ )
833
+ x = i_x + element.rect["x"] + int(element.rect["width"] / 2)
834
+ x += 1
835
+ y = i_y + element.rect["y"] + int(element.rect["height"] / 2)
836
+ y += 1
837
+ else:
838
+ x = i_x + 34
839
+ y = i_y + 34
731
840
  driver.switch_to.default_content()
732
841
  except Exception:
733
842
  try:
@@ -738,40 +847,91 @@ def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
738
847
  try:
739
848
  if x and y:
740
849
  sb_config._saved_cf_x_y = (x, y)
741
- uc_gui_click_x_y(driver, x, y, timeframe=0.842)
850
+ _uc_gui_click_x_y(driver, x, y, timeframe=0.95)
742
851
  except Exception:
743
852
  pass
744
853
  reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
745
854
  if IS_LINUX:
746
- reconnect_time = constants.UC.RECONNECT_TIME
855
+ reconnect_time = constants.UC.RECONNECT_TIME + 0.15
747
856
  if not x or not y:
748
857
  reconnect_time = 1 # Make it quick (it already failed)
749
858
  driver.reconnect(reconnect_time)
750
859
  if blind:
751
860
  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)
861
+ if retry and x and y and _on_a_captcha_page(driver):
862
+ with gui_lock: # Prevent issues with multiple processes
863
+ # Make sure the window is on top
864
+ page_actions.switch_to_window(
865
+ driver, driver.current_window_handle, 2, uc_lock=False
866
+ )
867
+ if not driver.is_element_present("iframe"):
868
+ return
869
+ else:
870
+ try:
871
+ driver.switch_to_frame(frame)
872
+ except Exception:
873
+ try:
874
+ driver.switch_to_frame("iframe")
875
+ except Exception:
876
+ return
877
+ checkbox_success = None
878
+ if ctype == "cf_t":
879
+ checkbox_success = "#success-icon"
880
+ elif ctype == "g_rc":
881
+ checkbox_success = "span.recaptcha-checkbox-checked"
882
+ else:
883
+ return # If this line is reached, ctype wasn't set
884
+ if driver.is_element_visible("#success-icon"):
885
+ driver.switch_to.parent_frame(checkbox_success)
886
+ return
887
+ if blind:
888
+ driver.uc_open_with_disconnect(driver.current_url, 3.8)
889
+ _uc_gui_click_x_y(driver, x, y, timeframe=1.05)
890
+ else:
891
+ driver.uc_open_with_reconnect(driver.current_url, 3.8)
892
+ if _on_a_captcha_page(driver):
893
+ driver.disconnect()
894
+ _uc_gui_click_x_y(driver, x, y, timeframe=1.05)
895
+ driver.reconnect(reconnect_time)
896
+
897
+
898
+ def uc_gui_click_captcha(driver, frame="iframe", retry=False, blind=False):
899
+ _uc_gui_click_captcha(
900
+ driver,
901
+ frame=frame,
902
+ retry=retry,
903
+ blind=blind,
904
+ ctype=None,
905
+ )
906
+
907
+
908
+ def uc_gui_click_rc(driver, frame="iframe", retry=False, blind=False):
909
+ _uc_gui_click_captcha(
910
+ driver,
911
+ frame=frame,
912
+ retry=retry,
913
+ blind=blind,
914
+ ctype="g_rc",
915
+ )
916
+
917
+
918
+ def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
919
+ _uc_gui_click_captcha(
920
+ driver,
921
+ frame=frame,
922
+ retry=retry,
923
+ blind=blind,
924
+ ctype="cf_t",
925
+ )
767
926
 
768
927
 
769
928
  def uc_gui_handle_cf(driver, frame="iframe"):
770
- if not on_a_cf_turnstile_page(driver):
929
+ if not _on_a_cf_turnstile_page(driver):
771
930
  return
772
931
  install_pyautogui_if_missing(driver)
773
932
  import pyautogui
774
933
  pyautogui = get_configured_pyautogui(pyautogui)
934
+ visible_iframe = True
775
935
  gui_lock = fasteners.InterProcessLock(
776
936
  constants.MultiBrowser.PYAUTOGUILOCK
777
937
  )
@@ -787,16 +947,46 @@ def uc_gui_handle_cf(driver, frame="iframe"):
787
947
  page_actions.switch_to_window(
788
948
  driver, driver.current_window_handle, 2, uc_lock=False
789
949
  )
950
+ if (
951
+ driver.is_element_present(".cf-turnstile-wrapper iframe")
952
+ or driver.is_element_present(
953
+ '[data-callback="onCaptchaSuccess"] iframe'
954
+ )
955
+ ):
956
+ pass
957
+ else:
958
+ visible_iframe = False
959
+ if driver.is_element_present(".cf-turnstile-wrapper"):
960
+ frame = ".cf-turnstile-wrapper"
961
+ elif driver.is_element_present(
962
+ '[data-callback="onCaptchaSuccess"]'
963
+ ):
964
+ frame = '[data-callback="onCaptchaSuccess"]'
965
+ else:
966
+ return
790
967
  if not is_in_frame or needs_switch:
791
968
  # Currently not in frame (or nested frame outside CF one)
792
969
  try:
793
- driver.switch_to_frame(frame)
970
+ if visible_iframe:
971
+ driver.switch_to_frame(frame)
794
972
  except Exception:
795
- if driver.is_element_present("iframe"):
796
- driver.switch_to_frame("iframe")
797
- else:
798
- return
973
+ if visible_iframe:
974
+ if driver.is_element_present("iframe"):
975
+ driver.switch_to_frame("iframe")
976
+ else:
977
+ return
799
978
  try:
979
+ found_checkbox = False
980
+ for i in range(10):
981
+ pyautogui.press("\t")
982
+ time.sleep(0.02)
983
+ active_element_css = js_utils.get_active_element_css(driver)
984
+ if active_element_css == "div.cf-turnstile-wrapper":
985
+ found_checkbox = True
986
+ break
987
+ time.sleep(0.02)
988
+ if not found_checkbox:
989
+ return
800
990
  driver.execute_script('document.querySelector("input").focus()')
801
991
  except Exception:
802
992
  try:
@@ -810,7 +1000,7 @@ def uc_gui_handle_cf(driver, frame="iframe"):
810
1000
  pass
811
1001
  reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
812
1002
  if IS_LINUX:
813
- reconnect_time = constants.UC.RECONNECT_TIME
1003
+ reconnect_time = constants.UC.RECONNECT_TIME + 0.15
814
1004
  driver.reconnect(reconnect_time)
815
1005
 
816
1006
 
@@ -4147,6 +4337,16 @@ def get_local_driver(
4147
4337
  driver, *args, **kwargs
4148
4338
  )
4149
4339
  )
4340
+ driver.uc_gui_click_captcha = (
4341
+ lambda *args, **kwargs: uc_gui_click_captcha(
4342
+ driver, *args, **kwargs
4343
+ )
4344
+ )
4345
+ driver.uc_gui_click_rc = (
4346
+ lambda *args, **kwargs: uc_gui_click_rc(
4347
+ driver, *args, **kwargs
4348
+ )
4349
+ )
4150
4350
  driver.uc_gui_click_cf = (
4151
4351
  lambda *args, **kwargs: uc_gui_click_cf(
4152
4352
  driver, *args, **kwargs
@@ -4242,6 +4242,10 @@ class BaseCase(unittest.TestCase):
4242
4242
  self.uc_gui_write = new_driver.uc_gui_write
4243
4243
  if hasattr(new_driver, "uc_gui_click_x_y"):
4244
4244
  self.uc_gui_click_x_y = new_driver.uc_gui_click_x_y
4245
+ if hasattr(new_driver, "uc_gui_click_captcha"):
4246
+ self.uc_gui_click_captcha = new_driver.uc_gui_click_captcha
4247
+ if hasattr(new_driver, "uc_gui_click_rc"):
4248
+ self.uc_gui_click_rc = new_driver.uc_gui_click_rc
4245
4249
  if hasattr(new_driver, "uc_gui_click_cf"):
4246
4250
  self.uc_gui_click_cf = new_driver.uc_gui_click_cf
4247
4251
  if hasattr(new_driver, "uc_gui_handle_cf"):
@@ -13784,31 +13788,33 @@ class BaseCase(unittest.TestCase):
13784
13788
  which is the default mode on Linux unless using another arg."""
13785
13789
  if "linux" in sys.platform and (not self.headed or self.xvfb):
13786
13790
  from sbvirtualdisplay import Display
13787
- if self.undetectable and not (self.headless or self.headless2):
13788
- import Xlib.display
13789
- try:
13790
- self._xvfb_display = Display(
13791
- visible=True,
13792
- size=(1366, 768),
13793
- backend="xvfb",
13794
- use_xauth=True,
13795
- )
13796
- self._xvfb_display.start()
13797
- if "DISPLAY" not in os.environ.keys():
13791
+ pip_find_lock = fasteners.InterProcessLock(
13792
+ constants.PipInstall.FINDLOCK
13793
+ )
13794
+ with pip_find_lock: # Prevent issues with multiple processes
13795
+ if self.undetectable and not (self.headless or self.headless2):
13796
+ import Xlib.display
13797
+ try:
13798
+ self._xvfb_display = Display(
13799
+ visible=True,
13800
+ size=(1366, 768),
13801
+ backend="xvfb",
13802
+ use_xauth=True,
13803
+ )
13804
+ self._xvfb_display.start()
13805
+ if "DISPLAY" not in os.environ.keys():
13806
+ print(
13807
+ "\nX11 display failed! Will use regular xvfb!"
13808
+ )
13809
+ self.__activate_standard_virtual_display()
13810
+ except Exception as e:
13811
+ if hasattr(e, "msg"):
13812
+ print("\n" + str(e.msg))
13813
+ else:
13814
+ print(e)
13798
13815
  print("\nX11 display failed! Will use regular xvfb!")
13799
13816
  self.__activate_standard_virtual_display()
13800
- except Exception as e:
13801
- if hasattr(e, "msg"):
13802
- print("\n" + str(e.msg))
13803
- else:
13804
- print(e)
13805
- print("\nX11 display failed! Will use regular xvfb!")
13806
- self.__activate_standard_virtual_display()
13807
- return
13808
- pip_find_lock = fasteners.InterProcessLock(
13809
- constants.PipInstall.FINDLOCK
13810
- )
13811
- with pip_find_lock: # Prevent issues with multiple processes
13817
+ return
13812
13818
  pyautogui_is_installed = False
13813
13819
  try:
13814
13820
  import pyautogui
@@ -13850,8 +13856,8 @@ class BaseCase(unittest.TestCase):
13850
13856
  print("\n" + str(e.msg))
13851
13857
  else:
13852
13858
  print(e)
13853
- else:
13854
- self.__activate_standard_virtual_display()
13859
+ else:
13860
+ self.__activate_standard_virtual_display()
13855
13861
 
13856
13862
  def __ad_block_as_needed(self):
13857
13863
  """This is an internal method for handling ad-blocking.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.28.4a1
3
+ Version: 4.28.6
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
@@ -60,7 +60,7 @@ Description-Content-Type: text/markdown
60
60
  License-File: LICENSE
61
61
  Requires-Dist: attrs >=23.2.0
62
62
  Requires-Dist: certifi >=2024.7.4
63
- Requires-Dist: exceptiongroup >=1.2.1
63
+ Requires-Dist: exceptiongroup >=1.2.2
64
64
  Requires-Dist: parse >=1.20.2
65
65
  Requires-Dist: parse-type >=0.6.2
66
66
  Requires-Dist: pyyaml >=6.0.1
@@ -69,7 +69,7 @@ Requires-Dist: idna ==3.7
69
69
  Requires-Dist: chardet ==5.2.0
70
70
  Requires-Dist: charset-normalizer ==3.3.2
71
71
  Requires-Dist: requests ==2.31.0
72
- Requires-Dist: pynose ==1.5.1
72
+ Requires-Dist: pynose ==1.5.2
73
73
  Requires-Dist: sniffio ==1.3.1
74
74
  Requires-Dist: h11 ==0.14.0
75
75
  Requires-Dist: outcome ==1.3.0.post0
@@ -86,15 +86,15 @@ Requires-Dist: parameterized ==0.9.0
86
86
  Requires-Dist: sbvirtualdisplay ==1.3.0
87
87
  Requires-Dist: behave ==1.2.6
88
88
  Requires-Dist: beautifulsoup4 ==4.12.3
89
- Requires-Dist: tabcompleter ==1.3.0
90
- Requires-Dist: pdbp ==1.5.1
89
+ Requires-Dist: tabcompleter ==1.3.3
90
+ Requires-Dist: pdbp ==1.5.3
91
91
  Requires-Dist: colorama ==0.4.6
92
92
  Requires-Dist: pyotp ==2.9.0
93
93
  Requires-Dist: mdurl ==0.1.2
94
94
  Requires-Dist: rich ==13.7.1
95
95
  Requires-Dist: python-xlib ==0.33 ; platform_system == "Linux"
96
96
  Requires-Dist: pyreadline3 ==3.4.1 ; platform_system == "Windows"
97
- Requires-Dist: urllib3 <2,>=1.26.18 ; python_version < "3.10"
97
+ Requires-Dist: urllib3 <2,>=1.26.19 ; python_version < "3.10"
98
98
  Requires-Dist: pip >=24.0 ; python_version < "3.8"
99
99
  Requires-Dist: packaging >=24.0 ; python_version < "3.8"
100
100
  Requires-Dist: setuptools >=68.0.0 ; python_version < "3.8"
@@ -112,10 +112,10 @@ Requires-Dist: pytest-xdist ==3.5.0 ; python_version < "3.8"
112
112
  Requires-Dist: soupsieve ==2.4.1 ; python_version < "3.8"
113
113
  Requires-Dist: pygments ==2.17.2 ; python_version < "3.8"
114
114
  Requires-Dist: markdown-it-py ==2.2.0 ; python_version < "3.8"
115
- Requires-Dist: urllib3 <2.3.0,>=1.26.18 ; python_version >= "3.10"
116
- Requires-Dist: pip >=24.1.1 ; python_version >= "3.8"
115
+ Requires-Dist: setuptools >=70.2.0 ; python_version >= "3.10"
116
+ Requires-Dist: urllib3 <2.3.0,>=1.26.19 ; python_version >= "3.10"
117
+ Requires-Dist: pip >=24.1.2 ; python_version >= "3.8"
117
118
  Requires-Dist: packaging >=24.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"
@@ -132,6 +132,7 @@ Requires-Dist: pytest-xdist ==3.6.1 ; python_version >= "3.8"
132
132
  Requires-Dist: soupsieve ==2.5 ; python_version >= "3.8"
133
133
  Requires-Dist: pygments ==2.18.0 ; python_version >= "3.8"
134
134
  Requires-Dist: markdown-it-py ==3.0.0 ; python_version >= "3.8"
135
+ Requires-Dist: setuptools ~=70.2 ; python_version >= "3.8" and python_version < "3.10"
135
136
  Provides-Extra: allure
136
137
  Requires-Dist: allure-pytest >=2.13.5 ; extra == 'allure'
137
138
  Requires-Dist: allure-python-commons >=2.13.5 ; extra == 'allure'
@@ -139,7 +140,7 @@ Requires-Dist: allure-behave >=2.13.5 ; extra == 'allure'
139
140
  Provides-Extra: coverage
140
141
  Requires-Dist: coverage ==7.2.7 ; (python_version < "3.8") and extra == 'coverage'
141
142
  Requires-Dist: pytest-cov ==4.1.0 ; (python_version < "3.8") and extra == 'coverage'
142
- Requires-Dist: coverage >=7.5.4 ; (python_version >= "3.8") and extra == 'coverage'
143
+ Requires-Dist: coverage >=7.6.0 ; (python_version >= "3.8") and extra == 'coverage'
143
144
  Requires-Dist: pytest-cov >=5.0.0 ; (python_version >= "3.8") and extra == 'coverage'
144
145
  Provides-Extra: flake8
145
146
  Requires-Dist: mccabe ==0.7.0 ; extra == 'flake8'
@@ -157,7 +158,7 @@ Requires-Dist: pycparser ==2.22 ; extra == 'pdfminer'
157
158
  Requires-Dist: pdfminer.six ==20221105 ; (python_version < "3.8") and extra == 'pdfminer'
158
159
  Requires-Dist: cffi ==1.15.1 ; (python_version < "3.8") and extra == 'pdfminer'
159
160
  Requires-Dist: cryptography ==39.0.2 ; (python_version < "3.9") and extra == 'pdfminer'
160
- Requires-Dist: pdfminer.six ==20231228 ; (python_version >= "3.8") and extra == 'pdfminer'
161
+ Requires-Dist: pdfminer.six ==20240706 ; (python_version >= "3.8") and extra == 'pdfminer'
161
162
  Requires-Dist: cffi ==1.16.0 ; (python_version >= "3.8") and extra == 'pdfminer'
162
163
  Requires-Dist: cryptography ==42.0.8 ; (python_version >= "3.9") and extra == 'pdfminer'
163
164
  Provides-Extra: pillow
@@ -168,7 +169,7 @@ Requires-Dist: pip-system-certs ==4.0 ; (platform_system == "Windows") and extra
168
169
  Provides-Extra: proxy
169
170
  Requires-Dist: proxy.py ==2.4.3 ; extra == 'proxy'
170
171
  Provides-Extra: psutil
171
- Requires-Dist: psutil ==5.9.8 ; extra == 'psutil'
172
+ Requires-Dist: psutil ==6.0.0 ; extra == 'psutil'
172
173
  Provides-Extra: pyautogui
173
174
  Requires-Dist: PyAutoGUI ==0.9.54 ; extra == 'pyautogui'
174
175
  Provides-Extra: selenium-stealth
@@ -181,7 +182,7 @@ Requires-Dist: h2 ==4.1.0 ; extra == 'selenium-wire'
181
182
  Requires-Dist: hpack ==4.0.0 ; extra == 'selenium-wire'
182
183
  Requires-Dist: hyperframe ==6.0.1 ; extra == 'selenium-wire'
183
184
  Requires-Dist: kaitaistruct ==0.10 ; extra == 'selenium-wire'
184
- Requires-Dist: zstandard ==0.22.0 ; extra == 'selenium-wire'
185
+ Requires-Dist: zstandard ==0.23.0 ; extra == 'selenium-wire'
185
186
  Requires-Dist: pyasn1 ==0.5.1 ; (python_version < "3.8") and extra == 'selenium-wire'
186
187
  Requires-Dist: pyasn1 ==0.6.0 ; (python_version >= "3.8") and extra == 'selenium-wire'
187
188
 
@@ -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=LuplWFkCnURG8S5Ug851xWuiai-6wpOHdyGC1D8NYQU,48
8
+ seleniumbase/__version__.py,sha256=F8nW6XkjYuw9JJPjNU6qC6fH_YtUhubEYGnbkn7R7fE,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=hWxgwElRcGkrd70_T080Z9gPqrVypWn4UhXeoBSWq2s,181734
43
+ seleniumbase/core/browser_launcher.py,sha256=rkixOsZ1z-53esu723YIJBiqG55_t0hjIJLzWAIFZLg,188607
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=le9PvYxZzLnGPo-8CcF-RIeCQPv0LeuJGCEV5OIs63Q,701104
73
+ seleniumbase/fixtures/base_case.py,sha256=utTB0fdSAKqSd1lUzCqamU0FlVYpC3M2w4Z-gt2L83s,701499
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.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,,
140
+ seleniumbase-4.28.6.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
141
+ seleniumbase-4.28.6.dist-info/METADATA,sha256=IWF1Bgg75cMbraClxzJOxvuTJZq3xer2BWcm8GwOE-E,85634
142
+ seleniumbase-4.28.6.dist-info/WHEEL,sha256=-oYQCr74JF3a37z2nRlQays_SX2MqOANoqVjBBAP2yE,91
143
+ seleniumbase-4.28.6.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
+ seleniumbase-4.28.6.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
+ seleniumbase-4.28.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.2.0)
2
+ Generator: setuptools (71.0.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5