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.
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.30.2"
2
+ __version__ = "4.30.4"
@@ -1,6 +1,6 @@
1
1
  <!-- SeleniumBase Docs -->
2
2
 
3
- ## Using [seleniumbase/common](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/common) methods.
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 not start_page:
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
- width_ratio = 1.0
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
- page_actions.switch_to_window(
759
- driver, driver.current_window_handle, 2, uc_lock=False
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('[name*="cf-turnstile-"]')
865
- and driver.is_element_present("%s div[style]" % frame)
890
+ and driver.is_element_present(
891
+ "%s .cf-turnstile-wrapper" % frame
892
+ )
866
893
  ):
867
- frame = "%s div[style]" % frame
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 div[style*="margin"][style*="padding"]'
918
+ frame = 'form div:not([class]):has(input[name*="cf-turn"])'
890
919
  elif (
891
- frame != "iframe"
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 = "%s .cf-turnstile-wrapper" % 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.15
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 not driver.is_element_present("iframe"):
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 div[style*="margin"][style*="padding"]'
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
- driver.is_element_present('[name*="cf-turnstile-"]')
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 = 'div > div > [style*="margin"][style*="padding"]'
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
- for i in range(24):
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.02)
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.15
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.2
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.0
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.15.4 ; python_version >= "3.8"
121
- Requires-Dist: platformdirs >=4.2.2 ; python_version >= "3.8"
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.2 ; python_version >= "3.8"
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.0 ; (python_version >= "3.8") and extra == 'pdfminer'
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.0 ; (python_version >= "3.8") and extra == 'selenium-wire'
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://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></p>
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 & collect tests automatically).
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="266" /></a></p>
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="68" /></a></span>
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="62" /></a></span>
1554
- <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="64" /></a></span>
1555
- <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="50" /></a></span>
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="240" /></a></div>
1561
- <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></div> <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></div> <div><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></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>
1562
- <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" alt="Featured|HelloGitHub" style="width: 173px; height: 38px;" width="173" height="38" /></a></div>
1563
- <div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a></div>
1564
- <div><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>
1565
- <div align="left"><img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="124px" height="28px" alt="Views" /></div>
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=BdkAfSbnD0GdQ2ws-16m3-ETEGErOpRmMIK6vKT_YUs,46
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=PwQsRSPRCXejL-fg4YyDzED_Yr6e7ddmGu3g2OcDrcQ,3286
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=AKAbVnkI5nLDpA6W9JZu38QSpJz5IE8Pto-Em9U5r2o,11208
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=UQQhnAR18dbcC7ToDvj6TM2PIG5qBrNaekaM6kSK_E8,10970
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=S5caztJN0Al8eRFbsTAKQIugD8PpCQnMhvQIqqpO1j8,199052
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=f63hweOgG8Zr0GrbaL-CV8TKGkHkhbR0pWuTmGsn8GM,701929
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.2.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
141
- seleniumbase-4.30.2.dist-info/METADATA,sha256=Zj_V_pSG-9cEhphk9j0wA0vP40xi-Fol8V40UMyTV0M,86175
142
- seleniumbase-4.30.2.dist-info/WHEEL,sha256=uCRv0ZEik_232NlR4YDw4Pv3Ajt5bKvMH13NUU7hFuI,91
143
- seleniumbase-4.30.2.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
- seleniumbase-4.30.2.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
- seleniumbase-4.30.2.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.1)
2
+ Generator: setuptools (74.1.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5