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.
- seleniumbase/__version__.py +1 -1
- seleniumbase/core/browser_launcher.py +248 -48
- seleniumbase/fixtures/base_case.py +31 -25
- {seleniumbase-4.28.4a1.dist-info → seleniumbase-4.28.6.dist-info}/METADATA +14 -13
- {seleniumbase-4.28.4a1.dist-info → seleniumbase-4.28.6.dist-info}/RECORD +9 -9
- {seleniumbase-4.28.4a1.dist-info → seleniumbase-4.28.6.dist-info}/WHEEL +1 -1
- {seleniumbase-4.28.4a1.dist-info → seleniumbase-4.28.6.dist-info}/LICENSE +0 -0
- {seleniumbase-4.28.4a1.dist-info → seleniumbase-4.28.6.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.28.4a1.dist-info → seleniumbase-4.28.6.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.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
|
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
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
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
|
722
|
+
def _on_a_cf_turnstile_page(driver):
|
683
723
|
source = driver.get_page_source()
|
684
724
|
if (
|
685
|
-
"
|
686
|
-
or
|
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
|
693
|
-
|
694
|
-
|
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,
|
719
|
-
|
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
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
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
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
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
|
-
|
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
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
driver.
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
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
|
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
|
-
|
970
|
+
if visible_iframe:
|
971
|
+
driver.switch_to_frame(frame)
|
794
972
|
except Exception:
|
795
|
-
if
|
796
|
-
driver.
|
797
|
-
|
798
|
-
|
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
|
-
|
13788
|
-
|
13789
|
-
|
13790
|
-
|
13791
|
-
|
13792
|
-
|
13793
|
-
|
13794
|
-
|
13795
|
-
|
13796
|
-
|
13797
|
-
|
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
|
-
|
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
|
-
|
13854
|
-
|
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.
|
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.
|
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.
|
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.
|
90
|
-
Requires-Dist: pdbp ==1.5.
|
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.
|
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:
|
116
|
-
Requires-Dist:
|
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.
|
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 ==
|
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 ==
|
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.
|
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=
|
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=
|
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=
|
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.
|
141
|
-
seleniumbase-4.28.
|
142
|
-
seleniumbase-4.28.
|
143
|
-
seleniumbase-4.28.
|
144
|
-
seleniumbase-4.28.
|
145
|
-
seleniumbase-4.28.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|