seleniumbase 4.42.5__py3-none-any.whl → 4.43.0__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.

Potentially problematic release.


This version of seleniumbase might be problematic. Click here for more details.

@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.42.5"
2
+ __version__ = "4.43.0"
@@ -636,17 +636,12 @@ def main():
636
636
  data.append("")
637
637
  data.append("class GoogleTests(BaseCase):")
638
638
  data.append(" def test_google_dot_com(self):")
639
+ data.append(" if self.headless:")
640
+ data.append(' self.skip("Skipping test in headless mode.")')
639
641
  data.append(" if not self.undetectable:")
640
642
  data.append(" self.get_new_driver(undetectable=True)")
641
643
  data.append(' self.open("https://google.com/ncr")')
642
644
  data.append(' self.assert_title_contains("Google")')
643
- data.append(" self.sleep(0.05)")
644
- data.append(" self.save_screenshot_to_logs()")
645
- data.append(
646
- " self.wait_for_element('iframe[role=\"presentation\"]')"
647
- )
648
- data.append(" self.hide_elements('iframe')")
649
- data.append(" self.sleep(0.05)")
650
645
  data.append(" self.save_screenshot_to_logs()")
651
646
  data.append(' self.type(HomePage.search_box, "github.com")')
652
647
  data.append(" self.assert_element(HomePage.search_button)")
@@ -985,17 +985,15 @@ def __install_pyautogui_if_missing():
985
985
  import pyautogui
986
986
  with suppress(Exception):
987
987
  use_pyautogui_ver = constants.PyAutoGUI.VER
988
- if pyautogui.__version__ != use_pyautogui_ver:
989
- del pyautogui
990
- shared_utils.pip_install(
991
- "pyautogui", version=use_pyautogui_ver
992
- )
988
+ u_pv = shared_utils.make_version_tuple(use_pyautogui_ver)
989
+ pv = shared_utils.make_version_tuple(pyautogui.__version__)
990
+ if pv < u_pv:
991
+ del pyautogui # To get newer ver
992
+ shared_utils.pip_install("pyautogui", version="Latest")
993
993
  import pyautogui
994
994
  except Exception:
995
995
  print("\nPyAutoGUI required! Installing now...")
996
- shared_utils.pip_install(
997
- "pyautogui", version=constants.PyAutoGUI.VER
998
- )
996
+ shared_utils.pip_install("pyautogui", version="Latest")
999
997
  try:
1000
998
  import pyautogui
1001
999
  except Exception:
@@ -187,46 +187,23 @@ class CDPMethods():
187
187
  element with the given tag. (Eg: a, button, div, script, span)"""
188
188
  if not timeout:
189
189
  timeout = settings.SMALL_TIMEOUT
190
- self.__add_light_pause()
191
- time_now = time.time()
192
- self.assert_text(text, timeout=timeout)
193
- spent = int(time.time() - time_now)
194
- remaining = 1 + timeout - spent
195
- if tag_name:
196
- self.assert_element(tag_name, timeout=remaining)
197
- elements = self.loop.run_until_complete(
198
- self.page.find_elements_by_text(text=text)
199
- )
200
190
  if tag_name:
201
- tag_name = tag_name.lower().strip()
202
- for element in elements:
203
- if element and not tag_name:
204
- element = self.__add_sync_methods(element)
205
- return self.__add_sync_methods(element)
206
- elif (
207
- element
208
- and tag_name in element.tag_name.lower()
209
- and text.strip() in element.text
210
- ):
211
- element = self.__add_sync_methods(element)
212
- return self.__add_sync_methods(element)
213
- elif (
214
- element
215
- and element.parent
216
- and tag_name in element.parent.tag_name.lower()
217
- and text.strip() in element.parent.text
218
- ):
219
- element = self.__add_sync_methods(element.parent)
220
- return self.__add_sync_methods(element)
221
- elif (
222
- element
223
- and element.parent
224
- and element.parent.parent
225
- and tag_name in element.parent.parent.tag_name.lower()
226
- and text.strip() in element.parent.parent.text
227
- ):
228
- element = self.__add_sync_methods(element.parent.parent)
229
- return self.__add_sync_methods(element)
191
+ try:
192
+ return self.find_element(
193
+ '%s:contains("%s")' % (tag_name, text), timeout=timeout
194
+ )
195
+ except Exception:
196
+ pass # The exception will be raised later
197
+ else:
198
+ self.__add_light_pause()
199
+ self.assert_text(text, timeout=timeout)
200
+ elements = self.loop.run_until_complete(
201
+ self.page.find_elements_by_text(text=text)
202
+ )
203
+ for element in elements:
204
+ if element:
205
+ element = self.__add_sync_methods(element)
206
+ return self.__add_sync_methods(element)
230
207
  plural = "s"
231
208
  if timeout == 1:
232
209
  plural = ""
@@ -912,6 +889,12 @@ class CDPMethods():
912
889
  element.scroll_into_view()
913
890
  if text.endswith("\n") or text.endswith("\r"):
914
891
  text = text[:-1] + "\r\n"
892
+ elif (
893
+ element.tag_name == "textarea"
894
+ and "\n" in text
895
+ and "\r" not in text
896
+ ):
897
+ text = text.replace("\n", "\r")
915
898
  element.send_keys(text)
916
899
  self.__slow_mode_pause_if_set()
917
900
  self.loop.run_until_complete(self.page.sleep(0.025))
@@ -927,6 +910,12 @@ class CDPMethods():
927
910
  if text.endswith("\n") or text.endswith("\r"):
928
911
  submit = True
929
912
  text = text[:-1]
913
+ elif (
914
+ element.tag_name == "textarea"
915
+ and "\n" in text
916
+ and "\r" not in text
917
+ ):
918
+ text = text.replace("\n", "\r")
930
919
  for key in text:
931
920
  element.send_keys(key)
932
921
  time.sleep(0.044)
@@ -947,6 +936,12 @@ class CDPMethods():
947
936
  element.clear_input()
948
937
  if text.endswith("\n") or text.endswith("\r"):
949
938
  text = text[:-1] + "\r\n"
939
+ elif (
940
+ element.tag_name == "textarea"
941
+ and "\n" in text
942
+ and "\r" not in text
943
+ ):
944
+ text = text.replace("\n", "\r")
950
945
  element.send_keys(text)
951
946
  self.__slow_mode_pause_if_set()
952
947
  self.loop.run_until_complete(self.page.sleep(0.025))
@@ -1555,17 +1550,15 @@ class CDPMethods():
1555
1550
  import pyautogui
1556
1551
  with suppress(Exception):
1557
1552
  use_pyautogui_ver = constants.PyAutoGUI.VER
1558
- if pyautogui.__version__ != use_pyautogui_ver:
1559
- del pyautogui
1560
- shared_utils.pip_install(
1561
- "pyautogui", version=use_pyautogui_ver
1562
- )
1553
+ u_pv = shared_utils.make_version_tuple(use_pyautogui_ver)
1554
+ pv = shared_utils.make_version_tuple(pyautogui.__version__)
1555
+ if pv < u_pv:
1556
+ del pyautogui # To get newer ver
1557
+ shared_utils.pip_install("pyautogui", version="Latest")
1563
1558
  import pyautogui
1564
1559
  except Exception:
1565
1560
  print("\nPyAutoGUI required! Installing now...")
1566
- shared_utils.pip_install(
1567
- "pyautogui", version=constants.PyAutoGUI.VER
1568
- )
1561
+ shared_utils.pip_install("pyautogui", version="Latest")
1569
1562
  try:
1570
1563
  import pyautogui
1571
1564
  except Exception:
@@ -114,9 +114,7 @@ class BaseCase(unittest.TestCase):
114
114
  self.driver = None
115
115
  self.environment = None
116
116
  self.env = None # Add a shortened version of self.environment
117
- self.version_list = [
118
- int(i) for i in __version__.split(".") if i.isdigit()
119
- ]
117
+ self.version_list = shared_utils.make_version_list(__version__)
120
118
  self.version_tuple = tuple(self.version_list)
121
119
  self.version_info = self.version_tuple
122
120
  self.time = time.time
@@ -10175,7 +10173,7 @@ class BaseCase(unittest.TestCase):
10175
10173
  text = self.__get_type_checked_text(text)
10176
10174
  selector, by = self.__recalculate_selector(selector, by)
10177
10175
  if self.__is_cdp_swap_needed():
10178
- return self.cdp.find_element(selector, timeout=timeout)
10176
+ return self.cdp.wait_for_text(text, selector, timeout=timeout)
10179
10177
  elif self.__is_shadow_selector(selector):
10180
10178
  return self.__wait_for_shadow_text_visible(text, selector, timeout)
10181
10179
  return page_actions.wait_for_text_visible(
@@ -10532,6 +10530,8 @@ class BaseCase(unittest.TestCase):
10532
10530
  timeout = settings.LARGE_TIMEOUT
10533
10531
  if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
10534
10532
  timeout = self.__get_new_timeout(timeout)
10533
+ if self.__is_cdp_swap_needed():
10534
+ return self.cdp.find_element_by_text(text=link_text, tag_name="a")
10535
10535
  return self.wait_for_element_visible(
10536
10536
  link_text, by="link text", timeout=timeout
10537
10537
  )
@@ -14491,11 +14491,11 @@ class BaseCase(unittest.TestCase):
14491
14491
  import pyautogui
14492
14492
  with suppress(Exception):
14493
14493
  use_pyautogui_ver = constants.PyAutoGUI.VER
14494
- if pyautogui.__version__ != use_pyautogui_ver:
14494
+ u_pv = shared_utils.make_version_tuple(use_pyautogui_ver)
14495
+ pv = shared_utils.make_version_tuple(pyautogui.__version__)
14496
+ if pv < u_pv:
14495
14497
  del pyautogui # To get newer ver
14496
- shared_utils.pip_install(
14497
- "pyautogui", version=use_pyautogui_ver
14498
- )
14498
+ shared_utils.pip_install("pyautogui", version="Latest")
14499
14499
  import pyautogui
14500
14500
  pyautogui_is_installed = True
14501
14501
  except Exception:
@@ -14504,9 +14504,7 @@ class BaseCase(unittest.TestCase):
14504
14504
  "Installing now..."
14505
14505
  )
14506
14506
  print("\n" + message)
14507
- shared_utils.pip_install(
14508
- "pyautogui", version=constants.PyAutoGUI.VER
14509
- )
14507
+ shared_utils.pip_install("pyautogui", version="Latest")
14510
14508
  import pyautogui
14511
14509
  pyautogui_is_installed = True
14512
14510
  if (
@@ -18,16 +18,35 @@ def pip_install(package, version=None):
18
18
  pip_install_lock = fasteners.InterProcessLock(
19
19
  constants.PipInstall.LOCKFILE
20
20
  )
21
+ upgrade_to_latest = False
22
+ if (
23
+ version
24
+ and ("U" in str(version).upper() or "L" in str(version).upper())
25
+ ):
26
+ # Upgrade to Latest when specified with "U" or "L"
27
+ upgrade_to_latest = True
21
28
  with pip_install_lock:
22
29
  if not version:
23
30
  subprocess.check_call(
24
31
  [sys.executable, "-m", "pip", "install", package]
25
32
  )
26
- else:
33
+ elif not upgrade_to_latest:
27
34
  package_and_version = package + "==" + str(version)
28
35
  subprocess.check_call(
29
36
  [sys.executable, "-m", "pip", "install", package_and_version]
30
37
  )
38
+ else:
39
+ subprocess.check_call(
40
+ [sys.executable, "-m", "pip", "install", "-U", package]
41
+ )
42
+
43
+
44
+ def make_version_list(version_str):
45
+ return [int(i) for i in version_str.split(".") if i.isdigit()]
46
+
47
+
48
+ def make_version_tuple(version_str):
49
+ return tuple(make_version_list(version_str))
31
50
 
32
51
 
33
52
  def get_mfa_code(totp_key=None):
@@ -369,7 +369,8 @@ class Browser:
369
369
  proxy_user = username_and_password.split(":")[0]
370
370
  proxy_pass = username_and_password.split(":")[1]
371
371
  await connection.set_auth(proxy_user, proxy_pass, self.tabs[0])
372
- time.sleep(0.25)
372
+ time.sleep(0.22)
373
+ await connection.sleep(0.05)
373
374
  frame_id, loader_id, *_ = await connection.send(
374
375
  cdp.page.navigate(url)
375
376
  )
@@ -121,22 +121,26 @@ def __activate_virtual_display_as_needed(
121
121
  import pyautogui
122
122
  with suppress(Exception):
123
123
  use_pyautogui_ver = constants.PyAutoGUI.VER
124
- if pyautogui.__version__ != use_pyautogui_ver:
124
+ u_pv = shared_utils.make_version_tuple(
125
+ use_pyautogui_ver
126
+ )
127
+ pv = shared_utils.make_version_tuple(
128
+ pyautogui.__version__
129
+ )
130
+ if pv < u_pv:
125
131
  del pyautogui # To get newer ver
126
132
  shared_utils.pip_install(
127
- "pyautogui", version=use_pyautogui_ver
133
+ "pyautogui", version="Latest"
128
134
  )
129
135
  import pyautogui
130
136
  pyautogui_is_installed = True
131
137
  except Exception:
132
138
  message = (
133
- "PyAutoGUI is required for UC Mode on Linux! "
139
+ "PyAutoGUI is required for CDP Mode on Linux! "
134
140
  "Installing now..."
135
141
  )
136
142
  print("\n" + message)
137
- shared_utils.pip_install(
138
- "pyautogui", version=constants.PyAutoGUI.VER
139
- )
143
+ shared_utils.pip_install("pyautogui", version="Latest")
140
144
  import pyautogui
141
145
  pyautogui_is_installed = True
142
146
  if (
@@ -689,7 +693,10 @@ def start_sync(*args, **kwargs) -> Browser:
689
693
 
690
694
 
691
695
  async def create_from_driver(driver) -> Browser:
692
- """Create a Browser instance from a running driver instance."""
696
+ """Create a CDP Browser instance from a running UC driver.
697
+ This method is DEPRECATED in favor of activate_cdp_mode(),
698
+ which includes the option of switching between the modes,
699
+ and also properly handles configuration based on options."""
693
700
  from .config import Config
694
701
 
695
702
  conf = Config()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.42.5
3
+ Version: 4.43.0
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
@@ -95,9 +95,9 @@ Requires-Dist: pygments>=2.19.2
95
95
  Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
96
96
  Requires-Dist: tabcompleter>=1.4.0
97
97
  Requires-Dist: pdbp>=1.7.1
98
- Requires-Dist: idna==3.10
98
+ Requires-Dist: idna>=3.11
99
99
  Requires-Dist: chardet==5.2.0
100
- Requires-Dist: charset-normalizer<4,>=3.4.3
100
+ Requires-Dist: charset-normalizer<4,>=3.4.4
101
101
  Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
102
102
  Requires-Dist: urllib3<2.6.0,>=1.26.20; python_version >= "3.10"
103
103
  Requires-Dist: requests==2.32.4; python_version < "3.9"
@@ -113,7 +113,7 @@ Requires-Dist: websocket-client~=1.8.0; python_version < "3.9"
113
113
  Requires-Dist: websocket-client~=1.9.0; python_version >= "3.9"
114
114
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
115
115
  Requires-Dist: selenium==4.32.0; python_version >= "3.9" and python_version < "3.10"
116
- Requires-Dist: selenium==4.36.0; python_version >= "3.10"
116
+ Requires-Dist: selenium==4.37.0; python_version >= "3.10"
117
117
  Requires-Dist: cssselect==1.2.0; python_version < "3.9"
118
118
  Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
119
119
  Requires-Dist: sortedcontainers==2.4.0
@@ -149,7 +149,8 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
149
149
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
150
150
  Provides-Extra: coverage
151
151
  Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
152
- Requires-Dist: coverage>=7.10.7; python_version >= "3.9" and extra == "coverage"
152
+ Requires-Dist: coverage>=7.10.7; (python_version >= "3.9" and python_version < "3.10") and extra == "coverage"
153
+ Requires-Dist: coverage>=7.11.0; python_version >= "3.10" and extra == "coverage"
153
154
  Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
154
155
  Requires-Dist: pytest-cov>=7.0.0; python_version >= "3.9" and extra == "coverage"
155
156
  Provides-Extra: flake8
@@ -170,14 +171,15 @@ Provides-Extra: pdfminer
170
171
  Requires-Dist: pdfminer.six==20250324; python_version < "3.9" and extra == "pdfminer"
171
172
  Requires-Dist: pdfminer.six==20250506; python_version >= "3.9" and extra == "pdfminer"
172
173
  Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
173
- Requires-Dist: cryptography==46.0.2; python_version >= "3.9" and extra == "pdfminer"
174
+ Requires-Dist: cryptography==46.0.3; python_version >= "3.9" and extra == "pdfminer"
174
175
  Requires-Dist: cffi==1.17.1; python_version < "3.9" and extra == "pdfminer"
175
176
  Requires-Dist: cffi==2.0.0; python_version >= "3.9" and extra == "pdfminer"
176
177
  Requires-Dist: pycparser==2.22; python_version < "3.9" and extra == "pdfminer"
177
178
  Requires-Dist: pycparser==2.23; python_version >= "3.9" and extra == "pdfminer"
178
179
  Provides-Extra: pillow
179
180
  Requires-Dist: Pillow>=10.4.0; python_version < "3.9" and extra == "pillow"
180
- Requires-Dist: Pillow>=11.3.0; python_version >= "3.9" and extra == "pillow"
181
+ Requires-Dist: Pillow>=11.3.0; (python_version >= "3.9" and python_version < "3.10") and extra == "pillow"
182
+ Requires-Dist: Pillow>=12.0.0; python_version >= "3.10" and extra == "pillow"
181
183
  Provides-Extra: pip-system-certs
182
184
  Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
183
185
  Provides-Extra: proxy
@@ -227,9 +229,10 @@ Dynamic: summary
227
229
 
228
230
  <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
229
231
 
230
- <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
232
+ <p align="center" class="hero__title"><b>Automate, test, and scrape the web on your own terms.<br /></b></p>
231
233
 
232
- <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/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a></p>
234
+ <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></p>
235
+ <p align="center"><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://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/SeleniumBase?style=social"></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a></p>
233
236
 
234
237
  <p align="center">
235
238
  <a href="#python_installation">🚀 Start</a> |
@@ -269,13 +272,13 @@ Dynamic: summary
269
272
  <br />
270
273
  </p>
271
274
 
272
- <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>
275
+ <p>SeleniumBase is a browser automation framework for the modern web. Both new and experienced Python users alike can easily get started. With special stealth features like UC Mode and CDP Mode, you'll be evading bot-detection and bypassing CAPTCHAs in minutes.</p>
273
276
 
274
277
  --------
275
278
 
276
279
  📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/** folder](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
277
280
 
278
- 🐙 Note that <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> / <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> (Stealth Mode) have their own ReadMe files.
281
+ 🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> help you evade bot-detection.
279
282
 
280
283
  ℹ️ Most scripts run with raw <code translate="no"><b>python</b></code>, although some scripts use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that 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).
281
284
 
@@ -543,7 +546,6 @@ pip install seleniumbase
543
546
 
544
547
  * (Add ``--upgrade`` OR ``-U`` to upgrade SeleniumBase.)
545
548
  * (Add ``--force-reinstall`` to upgrade indirect packages.)
546
- * (Use ``pip3`` if multiple versions of Python are present.)
547
549
 
548
550
  🔵 **How to install ``seleniumbase`` from a GitHub clone:**
549
551
 
@@ -617,10 +619,10 @@ pip install -e .
617
619
  <summary> ▶️ Here's sample output from a chromedriver download. (<b>click to expand</b>)</summary>
618
620
 
619
621
  ```zsh
620
- *** chromedriver to download = 131.0.6778.108 (Latest Stable)
622
+ *** chromedriver to download = 141.0.7390.78 (Latest Stable)
621
623
 
622
624
  Downloading chromedriver-mac-arm64.zip from:
623
- https://storage.googleapis.com/chrome-for-testing-public/131.0.6778.108/mac-arm64/chromedriver-mac-arm64.zip ...
625
+ https://storage.googleapis.com/chrome-for-testing-public/141.0.7390.78/mac-arm64/chromedriver-mac-arm64.zip ...
624
626
  Download Complete!
625
627
 
626
628
  Extracting ['chromedriver'] from chromedriver-mac-arm64.zip ...
@@ -630,8 +632,8 @@ The file [chromedriver] was saved to:
630
632
  ~/github/SeleniumBase/seleniumbase/drivers/
631
633
  chromedriver
632
634
 
633
- Making [chromedriver 131.0.6778.108] executable ...
634
- [chromedriver 131.0.6778.108] is now ready for use!
635
+ Making [chromedriver 141.0.7390.78] executable ...
636
+ [chromedriver 141.0.7390.78] is now ready for use!
635
637
  ```
636
638
 
637
639
  </details>
@@ -3,7 +3,7 @@ sbase/__main__.py,sha256=G0bVB1-DM4PGwQ1KyOupaWCs4ePbChZNNWuX2htim5U,647
3
3
  sbase/steps.py,sha256=wiPSWZhFpBlWvkqXRJ18btpBu3nQaw9K5AzIJNAX5RM,43521
4
4
  seleniumbase/__init__.py,sha256=JFEY9P5QJqsa1M6ghzLMH2eIPQyh85iglCaQwg8Y8z4,2498
5
5
  seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
6
- seleniumbase/__version__.py,sha256=QxAoP8OngQTSxxVddd7kUktH7MikCkbIaCqpWS1-a-Y,46
6
+ seleniumbase/__version__.py,sha256=Rk3JHDl6bfc3IWDxvXHc9k4a6DizDy4Ud9_fyX4zmhA,46
7
7
  seleniumbase/behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  seleniumbase/behave/behave_helper.py,sha256=lJtagtivSbEpbRj0EKV4l4PuPU6NANONJJAnYwgVCe0,24379
9
9
  seleniumbase/behave/behave_sb.py,sha256=guLihFsr1uJ4v2AR3r3Vy_BTeHrHwy2JEJxhp-MVnZA,59872
@@ -27,7 +27,7 @@ seleniumbase/console_scripts/sb_caseplans.py,sha256=C_vhATSa9dEDOSmHT9uk64ebkXcq
27
27
  seleniumbase/console_scripts/sb_commander.py,sha256=Ejal4WhnMSTLcykCT04jmMuH_fvDrfIAoxoJ23LclAM,13084
28
28
  seleniumbase/console_scripts/sb_install.py,sha256=LosIv69jk2k6bNdcB1ozUjV0vZ4lWyUBr8xM2UpSz5g,56401
29
29
  seleniumbase/console_scripts/sb_mkchart.py,sha256=ep9g-9CSIwaOJKVxhB3xjRQpfsuApyN8-Dr129cNXwQ,10941
30
- seleniumbase/console_scripts/sb_mkdir.py,sha256=iFN6ZMOgmH_GAvEuvzYltWuYiS3PRFQcL5fJIj1yX_Y,30897
30
+ seleniumbase/console_scripts/sb_mkdir.py,sha256=YRpgpC6FSVuVlIx-3E-JKomF4jI5HVBk8OSWDULmoAI,30720
31
31
  seleniumbase/console_scripts/sb_mkfile.py,sha256=OWYd4yFccmjrd-gNn1t1una-HDRU2_N2-r4Tg3nHsj0,17744
32
32
  seleniumbase/console_scripts/sb_mkpres.py,sha256=EWFRVacjYTX49y-fEiYTZacM9_01IxuuaO4nMjHrIGo,11015
33
33
  seleniumbase/console_scripts/sb_mkrec.py,sha256=E268227Q75ZHP1rGFoIY_6i6FzGxD_kWmKm7QMntpW4,12012
@@ -36,7 +36,7 @@ seleniumbase/console_scripts/sb_print.py,sha256=tNy-bMDgwHJO3bZxMpmo9weSE8uhbH0C
36
36
  seleniumbase/console_scripts/sb_recorder.py,sha256=DH-n2fN7N9qyHMl7wjtn8MiliBgfw-1kwgmfg1GUuhk,10772
37
37
  seleniumbase/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  seleniumbase/core/application_manager.py,sha256=e_0sjtI8cjY5BNyZj1QBR0j6_oCScxGmSXYEpcYwuZE,576
39
- seleniumbase/core/browser_launcher.py,sha256=B1kj4DfxB3IKZZs1SmDcCxhK--8W8tznpwcXIHzJoKE,250972
39
+ seleniumbase/core/browser_launcher.py,sha256=N9VF8BmQFtIs6NBOD6neVjueaEAmDfJlmCi5mvN1Prk,251017
40
40
  seleniumbase/core/capabilities_parser.py,sha256=meIS2uHapTCq2ldfNAToC7r0cKmZDRXuYNKExM1GHDY,6038
41
41
  seleniumbase/core/colored_traceback.py,sha256=DrRWfg7XEnKcgY59Xj7Jdk09H-XqHYBSUpB-DiZt6iY,2020
42
42
  seleniumbase/core/create_db_tables.sql,sha256=VWPtrdiW_HQ6yETHjqTu-VIrTwvd8I8o1NfBeaVSHpU,972
@@ -50,7 +50,7 @@ seleniumbase/core/proxy_helper.py,sha256=pZ1NboNfziHU3vWZLOZLX-qkfM3oKSnpc3omQf9
50
50
  seleniumbase/core/recorder_helper.py,sha256=gDION28OK4NAYsE-7ohKZ9Z3sxQQ0FEjf859LDpqsg4,25320
51
51
  seleniumbase/core/report_helper.py,sha256=AIl6Qava2yW1uSzbLpJBlPlYDz0KE-rVhogh8hsGWBo,12201
52
52
  seleniumbase/core/s3_manager.py,sha256=z_4qx2jI_gtK5r3niGXgEOBpfMUicUCOciowai50MP4,3529
53
- seleniumbase/core/sb_cdp.py,sha256=9xK3NoiX2knPmBJkIU-zvUHJ9EGfnSBSxrmnQM7MUVo,108271
53
+ seleniumbase/core/sb_cdp.py,sha256=g2bmOuzH32cPkIUqZ7QVkjZrvCTD-bGcN5nqAFydnxk,107843
54
54
  seleniumbase/core/sb_driver.py,sha256=-IQsskc7HpXQbcBL04IPjmGpyYchyo7v9OPF2WcahDw,14159
55
55
  seleniumbase/core/session_helper.py,sha256=s9zD3PVZEWVzG2h81cCUskbNWLfdjC_LwwQjKptHCak,558
56
56
  seleniumbase/core/settings_parser.py,sha256=gqVohHVlE_5L5Cqe2L24uYrRzvoK-saX8E_Df7_-_3I,7609
@@ -67,14 +67,14 @@ seleniumbase/extensions/disable_csp.zip,sha256=5RvomXnm2PdivUVcxTV6jfvD8WhTEsQYH
67
67
  seleniumbase/extensions/recorder.zip,sha256=JEE_FVEvlS63cFQbVLEroIyPSS91nWCDL0MhjVrmIpk,11813
68
68
  seleniumbase/extensions/sbase_ext.zip,sha256=3s1N8zrVaMz8RQEOIoBzC3KDjtmHwVZRvVsX25Odr_s,8175
69
69
  seleniumbase/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- seleniumbase/fixtures/base_case.py,sha256=GjFttS041ML2mUrquiFpF47fuoIv0FeZBIRYh9RUJeU,741358
70
+ seleniumbase/fixtures/base_case.py,sha256=mHFnGq2TzI79mDYtxxEKhSYrGZd6LbauaS_pCb4mBbo,741459
71
71
  seleniumbase/fixtures/constants.py,sha256=WMrItuNyKq3XVJ64NluLIRc4gJCxDw8K8qXED0b9S2w,13752
72
72
  seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
73
73
  seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
74
74
  seleniumbase/fixtures/js_utils.py,sha256=waXwlyMx7-rIFI8mJ_R8cL_mvih_gXlcJ_wT5h38HbI,52517
75
75
  seleniumbase/fixtures/page_actions.py,sha256=DvT0CzqFnpFGLfvmDk7zZ2XMcX_RxLYhNX6Nxxj4rRo,73213
76
76
  seleniumbase/fixtures/page_utils.py,sha256=H1iV8f9vDyEy87DBntyiBXC_tg8HskcebUOAJVn0hxE,12160
77
- seleniumbase/fixtures/shared_utils.py,sha256=LFXGGdvXhNZCShsRxyuEOcO2dcEbSkMSW5seQR2oE08,9950
77
+ seleniumbase/fixtures/shared_utils.py,sha256=kn0rcF0tEkQkiT8RGVooNFsLnVWmdPeTH9PfIm86TOI,10527
78
78
  seleniumbase/fixtures/unittest_helper.py,sha256=sfZ92rZeBAn_sF_yQ3I6_I7h3lyU5-cV_UMegBNoEm8,1294
79
79
  seleniumbase/fixtures/words.py,sha256=FOA4mAYvl3EPVpBTvgvK6YwCL8BdlRCmed685kEe7Vg,7827
80
80
  seleniumbase/fixtures/xpath_to_css.py,sha256=lML56k656fElXJ4NJF07r35FjctrbgQkXUotNk7A-as,8876
@@ -117,8 +117,8 @@ seleniumbase/undetected/reactor.py,sha256=NropaXcO54pzmDq6quR27qPJxab6636H7LRAaq
117
117
  seleniumbase/undetected/webelement.py,sha256=OOpUYbEiOG52KsYYyuDW9tYLdA2SMnukvwQHUdPVn9E,1389
118
118
  seleniumbase/undetected/cdp_driver/__init__.py,sha256=Ga9alwuaZZy4_XOShc0HjgFnNqpPdrcbjAicz5gE7a4,215
119
119
  seleniumbase/undetected/cdp_driver/_contradict.py,sha256=lP4b0h5quAy573ETn_TBbYV889cL1AuPLVInpJ0ZkiU,3183
120
- seleniumbase/undetected/cdp_driver/browser.py,sha256=JQlwMuwZgK0vWlvH4SU6DA7LcZo2I4hJRUIcv4gbZCQ,35609
121
- seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=fs8c3kz9zvESd2xM29ovw0tsffMUFB5VZTrphWHT3g4,33552
120
+ seleniumbase/undetected/cdp_driver/browser.py,sha256=AQI6uWVyhv7VEnx0CE3V9MeoUa-VDilFPytnQile31Y,35651
121
+ seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=XpzaUAbTL-4IciQ984x9QvA9HgYFzRlYrRv94fIfbpM,33918
122
122
  seleniumbase/undetected/cdp_driver/config.py,sha256=B5Wf0E5xvCmIuLO_Y06oyKYd04yM2auj--JyGKUKsls,13630
123
123
  seleniumbase/undetected/cdp_driver/connection.py,sha256=WgZ4QamXSdTzP4Xfgkn8mxv-JFivMG6hqbyHy2_LQlg,25717
124
124
  seleniumbase/undetected/cdp_driver/element.py,sha256=FIC6v7OmumLCT-_vIc3H4oju_oBbaLpWJUJIKm2c_q4,40467
@@ -137,9 +137,9 @@ seleniumbase/utilities/selenium_grid/start-grid-hub.bat,sha256=Ftq-GrAKRYH2ssDPr
137
137
  seleniumbase/utilities/selenium_grid/start-grid-hub.sh,sha256=KADv0RUHONLL2_I443QFK8PryBpDmKn5Gy0s4o0vDSM,106
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.42.5.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
141
- seleniumbase-4.42.5.dist-info/METADATA,sha256=tMx-4iFxgYOZpmEj-DZwbYvzZi2_tN8kXK0Plmc9Pus,89575
142
- seleniumbase-4.42.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
143
- seleniumbase-4.42.5.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
- seleniumbase-4.42.5.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
- seleniumbase-4.42.5.dist-info/RECORD,,
140
+ seleniumbase-4.43.0.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
141
+ seleniumbase-4.43.0.dist-info/METADATA,sha256=SlNtEsXjbxLxS0lyt1KHlN7LA2KpF2HPQiQYJlHcVMY,90229
142
+ seleniumbase-4.43.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
143
+ seleniumbase-4.43.0.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
+ seleniumbase-4.43.0.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
+ seleniumbase-4.43.0.dist-info/RECORD,,