seleniumbase 4.30.2__py3-none-any.whl → 4.30.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- seleniumbase/__version__.py +1 -1
- seleniumbase/common/ReadMe.md +1 -1
- seleniumbase/console_scripts/sb_mkrec.py +34 -1
- seleniumbase/console_scripts/sb_recorder.py +7 -0
- seleniumbase/core/browser_launcher.py +71 -64
- seleniumbase/fixtures/base_case.py +5 -0
- {seleniumbase-4.30.2.dist-info → seleniumbase-4.30.4.dist-info}/METADATA +23 -20
- {seleniumbase-4.30.2.dist-info → seleniumbase-4.30.4.dist-info}/RECORD +12 -12
- {seleniumbase-4.30.2.dist-info → seleniumbase-4.30.4.dist-info}/WHEEL +1 -1
- {seleniumbase-4.30.2.dist-info → seleniumbase-4.30.4.dist-info}/LICENSE +0 -0
- {seleniumbase-4.30.2.dist-info → seleniumbase-4.30.4.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.30.2.dist-info → seleniumbase-4.30.4.dist-info}/top_level.txt +0 -0
seleniumbase/__version__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.30.
|
2
|
+
__version__ = "4.30.4"
|
seleniumbase/common/ReadMe.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
<!-- SeleniumBase Docs -->
|
2
2
|
|
3
|
-
##
|
3
|
+
## [seleniumbase/common](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/common) decorators and security.
|
4
4
|
|
5
5
|
### Part 1: Decorators - (from [decorators.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/common/decorators.py))
|
6
6
|
|
@@ -181,6 +181,28 @@ def main():
|
|
181
181
|
data.append("")
|
182
182
|
data.append("class RecorderTest(BaseCase):")
|
183
183
|
data.append(" def test_recording(self):")
|
184
|
+
if use_uc:
|
185
|
+
data.append(" if self.undetectable:")
|
186
|
+
if (
|
187
|
+
start_page
|
188
|
+
and (
|
189
|
+
start_page.startswith("http:")
|
190
|
+
or start_page.startswith("https:")
|
191
|
+
or start_page.startswith("file:")
|
192
|
+
)
|
193
|
+
):
|
194
|
+
used_sp = start_page
|
195
|
+
if '"' not in start_page:
|
196
|
+
used_sp = '"%s"' % start_page
|
197
|
+
elif "'" not in start_page:
|
198
|
+
used_sp = "'%s'" % start_page
|
199
|
+
data.append(
|
200
|
+
" self.uc_open_with_disconnect(\n"
|
201
|
+
" %s\n"
|
202
|
+
" )" % used_sp
|
203
|
+
)
|
204
|
+
else:
|
205
|
+
data.append(" self.disconnect()")
|
184
206
|
data.append(" if self.recorder_ext:")
|
185
207
|
data.append(" # When done recording actions,")
|
186
208
|
data.append(' # type "c", and press [Enter].')
|
@@ -231,7 +253,18 @@ def main():
|
|
231
253
|
)
|
232
254
|
print(success)
|
233
255
|
run_cmd = None
|
234
|
-
if
|
256
|
+
if (
|
257
|
+
not start_page
|
258
|
+
or (
|
259
|
+
use_uc
|
260
|
+
and (
|
261
|
+
start_page.startswith("http:")
|
262
|
+
or start_page.startswith("https:")
|
263
|
+
or start_page.startswith("file:")
|
264
|
+
)
|
265
|
+
and not esc_end
|
266
|
+
)
|
267
|
+
):
|
235
268
|
run_cmd = "%s -m pytest %s --rec -q -s" % (sys_executable, file_name)
|
236
269
|
else:
|
237
270
|
run_cmd = "%s -m pytest %s --rec -q -s --url=%s" % (
|
@@ -197,6 +197,13 @@ def do_playback(file_name, use_chrome, window, demo_mode=False):
|
|
197
197
|
command += " --edge"
|
198
198
|
if demo_mode:
|
199
199
|
command += " --demo"
|
200
|
+
command_args = sys.argv[2:]
|
201
|
+
if (
|
202
|
+
"--uc" in command_args
|
203
|
+
or "--undetected" in command_args
|
204
|
+
or "--undetectable" in command_args
|
205
|
+
):
|
206
|
+
command += " --uc"
|
200
207
|
poll = None
|
201
208
|
if sb_config.rec_subprocess_used:
|
202
209
|
poll = sb_config.rec_subprocess_p.poll()
|
@@ -728,8 +728,23 @@ def uc_gui_click_x_y(driver, x, y, timeframe=0.25):
|
|
728
728
|
install_pyautogui_if_missing(driver)
|
729
729
|
import pyautogui
|
730
730
|
pyautogui = get_configured_pyautogui(pyautogui)
|
731
|
+
connected = True
|
732
|
+
width_ratio = 1.0
|
731
733
|
if IS_WINDOWS:
|
732
|
-
|
734
|
+
try:
|
735
|
+
driver.window_handles
|
736
|
+
except Exception:
|
737
|
+
connected = False
|
738
|
+
if (
|
739
|
+
not connected
|
740
|
+
and (
|
741
|
+
not hasattr(sb_config, "_saved_width_ratio")
|
742
|
+
or not sb_config._saved_width_ratio
|
743
|
+
)
|
744
|
+
):
|
745
|
+
driver.reconnect(0.1)
|
746
|
+
connected = True
|
747
|
+
if IS_WINDOWS and connected:
|
733
748
|
window_rect = driver.get_window_rect()
|
734
749
|
width = window_rect["width"]
|
735
750
|
height = window_rect["height"]
|
@@ -751,13 +766,24 @@ def uc_gui_click_x_y(driver, x, y, timeframe=0.25):
|
|
751
766
|
sb_config._saved_width_ratio = width_ratio
|
752
767
|
driver.minimize_window()
|
753
768
|
driver.set_window_rect(win_x, win_y, width, height)
|
769
|
+
elif (
|
770
|
+
IS_WINDOWS
|
771
|
+
and not connected
|
772
|
+
and hasattr(sb_config, "_saved_width_ratio")
|
773
|
+
and sb_config._saved_width_ratio
|
774
|
+
):
|
775
|
+
width_ratio = sb_config._saved_width_ratio
|
776
|
+
if IS_WINDOWS:
|
754
777
|
x = x * width_ratio
|
755
778
|
y = y * width_ratio
|
756
779
|
_uc_gui_click_x_y(driver, x, y, timeframe=timeframe, uc_lock=False)
|
757
780
|
return
|
758
|
-
|
759
|
-
|
760
|
-
|
781
|
+
try:
|
782
|
+
page_actions.switch_to_window(
|
783
|
+
driver, driver.current_window_handle, 2, uc_lock=False
|
784
|
+
)
|
785
|
+
except Exception:
|
786
|
+
pass
|
761
787
|
_uc_gui_click_x_y(driver, x, y, timeframe=timeframe, uc_lock=False)
|
762
788
|
|
763
789
|
|
@@ -861,10 +887,19 @@ def _uc_gui_click_captcha(
|
|
861
887
|
visible_iframe = False
|
862
888
|
if (
|
863
889
|
frame != "iframe"
|
864
|
-
and driver.is_element_present(
|
865
|
-
|
890
|
+
and driver.is_element_present(
|
891
|
+
"%s .cf-turnstile-wrapper" % frame
|
892
|
+
)
|
866
893
|
):
|
867
|
-
frame = "%s
|
894
|
+
frame = "%s .cf-turnstile-wrapper" % frame
|
895
|
+
elif (
|
896
|
+
frame != "iframe"
|
897
|
+
and driver.is_element_present(
|
898
|
+
'%s [name*="cf-turnstile"]' % frame
|
899
|
+
)
|
900
|
+
and driver.is_element_present("%s div" % frame)
|
901
|
+
):
|
902
|
+
frame = "%s div" % frame
|
868
903
|
elif (
|
869
904
|
driver.is_element_present('[name*="cf-turnstile-"]')
|
870
905
|
and driver.is_element_present("div.spacer div")
|
@@ -877,47 +912,21 @@ def _uc_gui_click_captcha(
|
|
877
912
|
)
|
878
913
|
):
|
879
914
|
frame = '[data-testid*="challenge-"] div'
|
880
|
-
elif (
|
881
|
-
(
|
882
|
-
driver.is_element_present('[name*="cf-turnstile-"]')
|
883
|
-
or driver.is_element_present('[id*="cf-turnstile-"]')
|
884
|
-
)
|
885
|
-
and driver.is_element_present(
|
886
|
-
'form div div[style*="margin"][style*="padding"]'
|
887
|
-
)
|
915
|
+
elif driver.is_element_present(
|
916
|
+
'form div:not([class]):has(input[name*="cf-turn"])'
|
888
917
|
):
|
889
|
-
frame = 'form div
|
918
|
+
frame = 'form div:not([class]):has(input[name*="cf-turn"])'
|
890
919
|
elif (
|
891
|
-
|
892
|
-
and driver.is_element_present(
|
893
|
-
"%s .cf-turnstile-wrapper" % frame
|
894
|
-
)
|
920
|
+
driver.is_element_present('[src*="/turnstile/"]')
|
921
|
+
and driver.is_element_present("form div:not(:has(*))")
|
895
922
|
):
|
896
|
-
frame = "
|
897
|
-
elif (
|
898
|
-
frame != "iframe"
|
899
|
-
and driver.is_element_present(
|
900
|
-
'%s [name*="cf-turnstile"]' % frame
|
901
|
-
)
|
902
|
-
and driver.is_element_present("%s div" % frame)
|
903
|
-
):
|
904
|
-
frame = "%s div" % frame
|
923
|
+
frame = "form div:not(:has(*))"
|
905
924
|
elif driver.is_element_present(".cf-turnstile-wrapper"):
|
906
925
|
frame = ".cf-turnstile-wrapper"
|
907
926
|
elif driver.is_element_present(
|
908
927
|
'[data-callback="onCaptchaSuccess"]'
|
909
928
|
):
|
910
929
|
frame = '[data-callback="onCaptchaSuccess"]'
|
911
|
-
elif (
|
912
|
-
(
|
913
|
-
driver.is_element_present('[name*="cf-turnstile-"]')
|
914
|
-
or driver.is_element_present('[id*="cf-turnstile-"]')
|
915
|
-
)
|
916
|
-
and driver.is_element_present(
|
917
|
-
'div > div > [style*="margin"][style*="padding"]'
|
918
|
-
)
|
919
|
-
):
|
920
|
-
frame = 'div > div > [style*="margin"][style*="padding"]'
|
921
930
|
else:
|
922
931
|
return
|
923
932
|
if driver.is_element_present('form[class*=center]'):
|
@@ -975,21 +984,20 @@ def _uc_gui_click_captcha(
|
|
975
984
|
pass
|
976
985
|
reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
|
977
986
|
if IS_LINUX:
|
978
|
-
reconnect_time = constants.UC.RECONNECT_TIME + 0.
|
987
|
+
reconnect_time = constants.UC.RECONNECT_TIME + 0.2
|
979
988
|
if not x or not y:
|
980
989
|
reconnect_time = 1 # Make it quick (it already failed)
|
981
990
|
driver.reconnect(reconnect_time)
|
982
|
-
if blind:
|
991
|
+
if blind or (IS_LINUX and "Just a moment" in driver.title):
|
983
992
|
retry = True
|
993
|
+
blind = True
|
984
994
|
if retry and x and y and _on_a_captcha_page(driver):
|
985
995
|
with gui_lock: # Prevent issues with multiple processes
|
986
996
|
# Make sure the window is on top
|
987
997
|
page_actions.switch_to_window(
|
988
998
|
driver, driver.current_window_handle, 2, uc_lock=False
|
989
999
|
)
|
990
|
-
if
|
991
|
-
return
|
992
|
-
else:
|
1000
|
+
if driver.is_element_present("iframe"):
|
993
1001
|
try:
|
994
1002
|
driver.switch_to_frame(frame)
|
995
1003
|
except Exception:
|
@@ -1100,6 +1108,8 @@ def _uc_gui_handle_captcha(
|
|
1100
1108
|
driver.minimize_window()
|
1101
1109
|
driver.set_window_rect(win_x, win_y, width, height)
|
1102
1110
|
time.sleep(0.33)
|
1111
|
+
tab_up_first = False
|
1112
|
+
special_form = False
|
1103
1113
|
if ctype == "cf_t":
|
1104
1114
|
if (
|
1105
1115
|
driver.is_element_present(".cf-turnstile-wrapper iframe")
|
@@ -1128,26 +1138,18 @@ def _uc_gui_handle_captcha(
|
|
1128
1138
|
)
|
1129
1139
|
):
|
1130
1140
|
frame = '[data-testid*="challenge-"] div'
|
1131
|
-
elif (
|
1132
|
-
(
|
1133
|
-
driver.is_element_present('[name*="cf-turnstile-"]')
|
1134
|
-
or driver.is_element_present('[id*="cf-turnstile-"]')
|
1135
|
-
)
|
1136
|
-
and driver.is_element_present(
|
1137
|
-
'form div div[style*="margin"][style*="padding"]'
|
1138
|
-
)
|
1141
|
+
elif driver.is_element_present(
|
1142
|
+
'form div:not([class]):has(input[name*="cf-turn"])'
|
1139
1143
|
):
|
1140
|
-
frame = 'form div
|
1144
|
+
frame = 'form div:not([class]):has(input[name*="cf-turn"])'
|
1145
|
+
tab_up_first = True
|
1146
|
+
special_form = True
|
1141
1147
|
elif (
|
1142
|
-
(
|
1143
|
-
|
1144
|
-
or driver.is_element_present('[id*="cf-turnstile-"]')
|
1145
|
-
)
|
1146
|
-
and driver.is_element_present(
|
1147
|
-
'div > div > [style*="margin"][style*="padding"]'
|
1148
|
-
)
|
1148
|
+
driver.is_element_present('[src*="/turnstile/"]')
|
1149
|
+
and driver.is_element_present("form div:not(:has(*))")
|
1149
1150
|
):
|
1150
|
-
frame =
|
1151
|
+
frame = "form div:not(:has(*))"
|
1152
|
+
tab_up_first = True
|
1151
1153
|
else:
|
1152
1154
|
return
|
1153
1155
|
else:
|
@@ -1172,13 +1174,18 @@ def _uc_gui_handle_captcha(
|
|
1172
1174
|
if ctype == "g_rc":
|
1173
1175
|
selector = "span#recaptcha-anchor"
|
1174
1176
|
found_checkbox = False
|
1175
|
-
|
1177
|
+
if tab_up_first:
|
1178
|
+
for i in range(10):
|
1179
|
+
pyautogui.hotkey("shift", "tab")
|
1180
|
+
time.sleep(0.027)
|
1181
|
+
for i in range(34):
|
1176
1182
|
pyautogui.press("\t")
|
1177
|
-
time.sleep(0.
|
1183
|
+
time.sleep(0.027)
|
1178
1184
|
active_element_css = js_utils.get_active_element_css(driver)
|
1179
1185
|
if (
|
1180
1186
|
active_element_css.startswith(selector)
|
1181
1187
|
or active_element_css.endswith(" > div" * 2)
|
1188
|
+
or (special_form and active_element_css.endswith(" div"))
|
1182
1189
|
):
|
1183
1190
|
found_checkbox = True
|
1184
1191
|
break
|
@@ -1197,7 +1204,7 @@ def _uc_gui_handle_captcha(
|
|
1197
1204
|
pass
|
1198
1205
|
reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
|
1199
1206
|
if IS_LINUX:
|
1200
|
-
reconnect_time = constants.UC.RECONNECT_TIME + 0.
|
1207
|
+
reconnect_time = constants.UC.RECONNECT_TIME + 0.2
|
1201
1208
|
driver.reconnect(reconnect_time)
|
1202
1209
|
|
1203
1210
|
|
@@ -16029,6 +16029,11 @@ class BaseCase(unittest.TestCase):
|
|
16029
16029
|
# This test already called tearDown()
|
16030
16030
|
return
|
16031
16031
|
if hasattr(self, "recorder_mode") and self.recorder_mode:
|
16032
|
+
if self.undetectable:
|
16033
|
+
try:
|
16034
|
+
self.driver.window_handles
|
16035
|
+
except Exception:
|
16036
|
+
self.driver.connect()
|
16032
16037
|
self.__process_recorded_actions()
|
16033
16038
|
self.__called_teardown = True
|
16034
16039
|
self.__called_setup = False
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.30.
|
3
|
+
Version: 4.30.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
|
@@ -90,7 +90,7 @@ Requires-Dist: pdbp ==1.5.4
|
|
90
90
|
Requires-Dist: colorama ==0.4.6
|
91
91
|
Requires-Dist: pyotp ==2.9.0
|
92
92
|
Requires-Dist: mdurl ==0.1.2
|
93
|
-
Requires-Dist: rich ==13.8.
|
93
|
+
Requires-Dist: rich ==13.8.1
|
94
94
|
Requires-Dist: python-xlib ==0.33 ; platform_system == "Linux"
|
95
95
|
Requires-Dist: pyreadline3 ==3.4.1 ; platform_system == "Windows"
|
96
96
|
Requires-Dist: urllib3 <2,>=1.26.19 ; python_version < "3.10"
|
@@ -117,8 +117,8 @@ Requires-Dist: urllib3 <2.3.0,>=1.26.19 ; python_version >= "3.10"
|
|
117
117
|
Requires-Dist: pip >=24.1.2 ; python_version >= "3.8"
|
118
118
|
Requires-Dist: packaging >=24.1 ; python_version >= "3.8"
|
119
119
|
Requires-Dist: wheel >=0.44.0 ; python_version >= "3.8"
|
120
|
-
Requires-Dist: filelock >=3.
|
121
|
-
Requires-Dist: platformdirs >=4.
|
120
|
+
Requires-Dist: filelock >=3.16.0 ; python_version >= "3.8"
|
121
|
+
Requires-Dist: platformdirs >=4.3.2 ; python_version >= "3.8"
|
122
122
|
Requires-Dist: typing-extensions >=4.12.2 ; python_version >= "3.8"
|
123
123
|
Requires-Dist: pyyaml >=6.0.2 ; python_version >= "3.8"
|
124
124
|
Requires-Dist: trio ==0.26.2 ; python_version >= "3.8"
|
@@ -126,7 +126,7 @@ Requires-Dist: websocket-client ==1.8.0 ; python_version >= "3.8"
|
|
126
126
|
Requires-Dist: selenium ==4.24.0 ; python_version >= "3.8"
|
127
127
|
Requires-Dist: execnet ==2.1.1 ; python_version >= "3.8"
|
128
128
|
Requires-Dist: pluggy ==1.5.0 ; python_version >= "3.8"
|
129
|
-
Requires-Dist: pytest ==8.3.
|
129
|
+
Requires-Dist: pytest ==8.3.3 ; python_version >= "3.8"
|
130
130
|
Requires-Dist: pytest-metadata ==3.1.1 ; python_version >= "3.8"
|
131
131
|
Requires-Dist: pytest-rerunfailures ==14.0 ; python_version >= "3.8"
|
132
132
|
Requires-Dist: pytest-xdist ==3.6.1 ; python_version >= "3.8"
|
@@ -160,7 +160,7 @@ Requires-Dist: pdfminer.six ==20221105 ; (python_version < "3.8") and extra == '
|
|
160
160
|
Requires-Dist: cffi ==1.15.1 ; (python_version < "3.8") and extra == 'pdfminer'
|
161
161
|
Requires-Dist: cryptography ==39.0.2 ; (python_version < "3.9") and extra == 'pdfminer'
|
162
162
|
Requires-Dist: pdfminer.six ==20240706 ; (python_version >= "3.8") and extra == 'pdfminer'
|
163
|
-
Requires-Dist: cffi ==1.17.
|
163
|
+
Requires-Dist: cffi ==1.17.1 ; (python_version >= "3.8") and extra == 'pdfminer'
|
164
164
|
Requires-Dist: cryptography ==43.0.1 ; (python_version >= "3.9") and extra == 'pdfminer'
|
165
165
|
Provides-Extra: pillow
|
166
166
|
Requires-Dist: Pillow ==9.5.0 ; (python_version < "3.8") and extra == 'pillow'
|
@@ -187,7 +187,7 @@ Requires-Dist: hyperframe ==6.0.1 ; extra == 'selenium-wire'
|
|
187
187
|
Requires-Dist: kaitaistruct ==0.10 ; extra == 'selenium-wire'
|
188
188
|
Requires-Dist: zstandard ==0.23.0 ; extra == 'selenium-wire'
|
189
189
|
Requires-Dist: pyasn1 ==0.5.1 ; (python_version < "3.8") and extra == 'selenium-wire'
|
190
|
-
Requires-Dist: pyasn1 ==0.6.
|
190
|
+
Requires-Dist: pyasn1 ==0.6.1 ; (python_version >= "3.8") and extra == 'selenium-wire'
|
191
191
|
|
192
192
|
<!-- SeleniumBase Docs -->
|
193
193
|
|
@@ -199,7 +199,7 @@ Requires-Dist: pyasn1 ==0.6.0 ; (python_version >= "3.8") and extra == 'selenium
|
|
199
199
|
|
200
200
|
<p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
|
201
201
|
|
202
|
-
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://
|
202
|
+
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
|
203
203
|
|
204
204
|
<p align="center">
|
205
205
|
<a href="#python_installation">🚀 Start</a> |
|
@@ -239,13 +239,15 @@ Requires-Dist: pyasn1 ==0.6.0 ; (python_version >= "3.8") and extra == 'selenium
|
|
239
239
|
<br />
|
240
240
|
</p>
|
241
241
|
|
242
|
+
<p>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</p>
|
243
|
+
|
242
244
|
--------
|
243
245
|
|
244
246
|
📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/** folder](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
|
245
247
|
|
246
248
|
👤 Note that <span translate="no">SeleniumBase</span> <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b> (Stealth Mode) has its own ReadMe</a>.
|
247
249
|
|
248
|
-
ℹ️ Scripts can be called via <code translate="no"><b>python</b></code>, although some <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover
|
250
|
+
ℹ️ Scripts can be called via <code translate="no"><b>python</b></code>, although some <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
|
249
251
|
|
250
252
|
<p align="left">📗 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py">my_first_test.py</a>, which tests login, shopping, and checkout:</p>
|
251
253
|
|
@@ -1544,22 +1546,23 @@ pytest --reruns=1 --reruns-delay=1
|
|
1544
1546
|
<div><a href="https://github.com/seleniumbase/SeleniumBase/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/seleniumbase/SeleniumBase.svg?color=22BB88" title="Closed Issues" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/pulls?q=is%3Apr+is%3Aclosed"><img src="https://img.shields.io/github/issues-pr-closed/seleniumbase/SeleniumBase.svg?logo=github&logoColor=white&color=22BB99" title="Closed Pull Requests" /></a></div>
|
1545
1547
|
</p>
|
1546
1548
|
|
1547
|
-
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="
|
1549
|
+
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="274" /></a></p>
|
1548
1550
|
|
1549
1551
|
<a href="https://pypi.org/project/seleniumbase/" target="_blank"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=22AAEE&logo=python&logoColor=FEDC54" title="Supported Python Versions" /></a>
|
1550
1552
|
|
1551
1553
|
<p><div>
|
1552
|
-
<span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="
|
1553
|
-
<span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="
|
1554
|
-
<span><a href="https://
|
1555
|
-
<span><a href="https://
|
1554
|
+
<span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="70" /></a></span>
|
1555
|
+
<span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="64" /></a></span>
|
1556
|
+
<span><a href="https://discord.gg/EdhQTn3EyE"><img src="https://seleniumbase.github.io/other/discord_icon.png" title="SeleniumBase on Discord" alt="SeleniumBase on Discord" width="66" /></a></span>
|
1557
|
+
<span><a href="https://www.facebook.com/SeleniumBase"><img src="https://seleniumbase.io/img/social/share_facebook.svg" title="SeleniumBase on Facebook" alt="SeleniumBase on Facebook" width="62" /></a></span>
|
1558
|
+
<span><a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://seleniumbase.github.io/img/social/share_gitter.svg" title="SeleniumBase on Gitter" alt="SeleniumBase on Gitter" width="48" /></a></span>
|
1556
1559
|
</div></p>
|
1557
1560
|
|
1558
1561
|
<p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
|
1559
1562
|
|
1560
|
-
<div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="
|
1561
|
-
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a
|
1562
|
-
<div><a href="https://
|
1563
|
-
<div><a href="https://
|
1564
|
-
<div><a href="https://
|
1565
|
-
<div align="left"
|
1563
|
+
<div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="274" /></a></div>
|
1564
|
+
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
|
1565
|
+
<div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
|
1566
|
+
<div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
|
1567
|
+
<div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
|
1568
|
+
<div align="left"></div>
|
@@ -5,12 +5,12 @@ 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=jDH75_Y_GUYCMTUb1As3Iynp59U2NBmaSqoIDnNQ7m8,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
|
12
12
|
seleniumbase/behave/steps.py,sha256=8-N-NB2tnDsxaP4LSg-uSBgbwZYMS6ZEL1oggO1PCoU,390
|
13
|
-
seleniumbase/common/ReadMe.md,sha256=
|
13
|
+
seleniumbase/common/ReadMe.md,sha256=ib-L8nio7fDREqM3MMOpBHtYQa8dy_LlSsHV9XUUQ4Q,3296
|
14
14
|
seleniumbase/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
15
|
seleniumbase/common/decorators.py,sha256=LJnAgg0RG3kDOFb8tpyq1zjmpv9ks6Tjg8GwgIn1YuY,7633
|
16
16
|
seleniumbase/common/encryption.py,sha256=IfAuE0hdrd3y-_qAQUWdSOKRGQ4QN24uTOBiQ9Eeq2s,5593
|
@@ -34,13 +34,13 @@ seleniumbase/console_scripts/sb_mkchart.py,sha256=QDDjA8N_Qy62Mgbe2fnSU8mhZbKTVy
|
|
34
34
|
seleniumbase/console_scripts/sb_mkdir.py,sha256=-OJrGM3upjdhCQb00zxSapS7eVtE49K3bR6KzsGvBbM,30049
|
35
35
|
seleniumbase/console_scripts/sb_mkfile.py,sha256=mZCUl318UkLvW5v1C40Tx19q6_aVJOfTZoKfd3XcakU,18132
|
36
36
|
seleniumbase/console_scripts/sb_mkpres.py,sha256=5MEYFKATmh68wy0SRi2NQtO71MN7m-rQq-WtUp4cKD8,11306
|
37
|
-
seleniumbase/console_scripts/sb_mkrec.py,sha256=
|
37
|
+
seleniumbase/console_scripts/sb_mkrec.py,sha256=0mJYe689QamICVaaFn3Aw_GkmSeFkHBYfnF48Wa4Fd4,12225
|
38
38
|
seleniumbase/console_scripts/sb_objectify.py,sha256=SRYY_cZ-Ip6Lj65T2maXRyJctOWAFhGSc-Xlc-u-2CM,122140
|
39
39
|
seleniumbase/console_scripts/sb_print.py,sha256=yo641b_OdSE0GUauOyxk-QrNeIjYzbRYRSUL-U0ZH80,30776
|
40
|
-
seleniumbase/console_scripts/sb_recorder.py,sha256=
|
40
|
+
seleniumbase/console_scripts/sb_recorder.py,sha256=9rLgxq_K2g37zpEPYtQ8j01u2fGkZpacw3Xi6o_ENWc,11162
|
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=tqSu7YhmL09Ge6feIaxckuVSANzBX50rbtfp7KFS2ho,199055
|
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=y-GeD6E8SM-mY_fc3QDbxbZFX-K7CBDVssDYBr4wYzY,702107
|
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.30.
|
141
|
-
seleniumbase-4.30.
|
142
|
-
seleniumbase-4.30.
|
143
|
-
seleniumbase-4.30.
|
144
|
-
seleniumbase-4.30.
|
145
|
-
seleniumbase-4.30.
|
140
|
+
seleniumbase-4.30.4.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
|
141
|
+
seleniumbase-4.30.4.dist-info/METADATA,sha256=alRcWbK9kwTlydIX2aDAaEvnn8tc6LNEl7cxrS4xb3w,86682
|
142
|
+
seleniumbase-4.30.4.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
|
143
|
+
seleniumbase-4.30.4.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
|
144
|
+
seleniumbase-4.30.4.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
|
145
|
+
seleniumbase-4.30.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|