seleniumbase 4.26.3__py3-none-any.whl → 4.27.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.
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.26.3"
2
+ __version__ = "4.27.0"
@@ -406,6 +406,7 @@ sbase codegen new_test.py --url=wikipedia.org
406
406
  ``--edge`` (Use Edge browser instead of Chrome.)
407
407
  ``--gui`` / ``--headed`` (Use headed mode on Linux.)
408
408
  ``--uc`` / ``--undetected`` (Use undetectable mode.)
409
+ ``--ee`` (Use SHIFT + ESC to end the recording.)
409
410
  ``--overwrite`` (Overwrite file when it exists.)
410
411
  ``--behave`` (Also output Behave/Gherkin files.)
411
412
 
@@ -310,6 +310,7 @@ def show_mkrec_usage():
310
310
  print(" --edge (Use Edge browser instead of Chrome.)")
311
311
  print(" --gui / --headed (Use headed mode on Linux.)")
312
312
  print(" --uc / --undetected (Use undetectable mode.)")
313
+ print(" --ee (Use SHIFT + ESC to end the recording.)")
313
314
  print(" --overwrite (Overwrite file when it exists.)")
314
315
  print(" --behave (Also output Behave/Gherkin files.)")
315
316
  print(" Output:")
@@ -336,6 +337,7 @@ def show_codegen_usage():
336
337
  print(" --edge (Use Edge browser instead of Chrome.)")
337
338
  print(" --gui / --headed (Use headed mode on Linux.)")
338
339
  print(" --uc / --undetected (Use undetectable mode.)")
340
+ print(" --ee (Use SHIFT + ESC to end the recording.)")
339
341
  print(" --overwrite (Overwrite file when it exists.)")
340
342
  print(" --behave (Also output Behave/Gherkin files.)")
341
343
  print(" Output:")
@@ -93,6 +93,7 @@ def main():
93
93
  invalid_cmd = None
94
94
  use_edge = False
95
95
  use_uc = False
96
+ esc_end = False
96
97
  start_page = None
97
98
  next_is_url = False
98
99
  use_colors = True
@@ -145,6 +146,8 @@ def main():
145
146
  help_me = True
146
147
  elif option.lower() == "--edge":
147
148
  use_edge = True
149
+ elif option.lower() == "--ee":
150
+ esc_end = True
148
151
  elif option.lower() in ("--gui", "--headed"):
149
152
  if "linux" in sys.platform:
150
153
  force_gui = True
@@ -183,6 +186,42 @@ def main():
183
186
  data.append(' # type "c", and press [Enter].')
184
187
  data.append(" import pdb; pdb.set_trace()")
185
188
  data.append("")
189
+
190
+ if esc_end:
191
+ msg = ">>> Use [SHIFT + ESC] in the browser to end recording!"
192
+ d2 = []
193
+ d2.append("from seleniumbase import BaseCase")
194
+ d2.append("")
195
+ d2.append("")
196
+ d2.append("class RecorderTest(BaseCase):")
197
+ d2.append(" def test_recording(self):")
198
+ d2.append(" if self.recorder_ext:")
199
+ d2.append(" print(")
200
+ d2.append(' "\\n\\n%s\\n"' % msg)
201
+ d2.append(" )")
202
+ d2.append(' script = self._get_rec_shift_esc_script()')
203
+ d2.append(' esc = "return document.sb_esc_end;"')
204
+ d2.append(" start_time = self.time()")
205
+ d2.append(" last_handles_num = self._get_num_handles()")
206
+ d2.append(" for i in range(1200):")
207
+ d2.append(" try:")
208
+ d2.append(" self.execute_script(script)")
209
+ d2.append(" handles_num = self._get_num_handles()")
210
+ d2.append(" if handles_num < 1:")
211
+ d2.append(" return")
212
+ d2.append(" elif handles_num != last_handles_num:")
213
+ d2.append(" self.switch_to_window(-1)")
214
+ d2.append(" last_handles_num = handles_num")
215
+ d2.append(' if self.execute_script(esc) == "yes":')
216
+ d2.append(" return")
217
+ d2.append(" elif self.time() - start_time > 600:")
218
+ d2.append(" return")
219
+ d2.append(" self.sleep(0.5)")
220
+ d2.append(" except Exception:")
221
+ d2.append(" return")
222
+ d2.append("")
223
+ data = d2
224
+
186
225
  file = codecs.open(file_path, "w+", "utf-8")
187
226
  file.writelines("\r\n".join(data))
188
227
  file.close()
@@ -162,6 +162,8 @@ def do_recording(file_name, url, overwrite_enabled, use_chrome, window):
162
162
  or "--undetectable" in command_args
163
163
  ):
164
164
  command += " --uc"
165
+ if "--ee" in command_args:
166
+ command += " --ee"
165
167
  command += add_on
166
168
  poll = None
167
169
  if sb_config.rec_subprocess_used:
@@ -443,8 +443,32 @@ def uc_open_with_reconnect(driver, url, reconnect_time=None):
443
443
  js_utils.call_me_later(driver, script, 3)
444
444
  time.sleep(0.007)
445
445
  driver.close()
446
- driver.reconnect(reconnect_time)
447
- driver.switch_to.window(driver.window_handles[-1])
446
+ if reconnect_time == "disconnect":
447
+ driver.disconnect()
448
+ time.sleep(0.007)
449
+ else:
450
+ driver.reconnect(reconnect_time)
451
+ driver.switch_to.window(driver.window_handles[-1])
452
+ else:
453
+ driver.default_get(url) # The original one
454
+ return None
455
+
456
+
457
+ def uc_open_with_disconnect(driver, url):
458
+ """Open a url and disconnect chromedriver.
459
+ Note: You can't perform Selenium actions again
460
+ until after you've called driver.connect()."""
461
+ if url.startswith("//"):
462
+ url = "https:" + url
463
+ elif ":" not in url:
464
+ url = "https://" + url
465
+ if (url.startswith("http:") or url.startswith("https:")):
466
+ script = 'window.open("%s","_blank");' % url
467
+ js_utils.call_me_later(driver, script, 3)
468
+ time.sleep(0.007)
469
+ driver.close()
470
+ driver.disconnect()
471
+ time.sleep(0.007)
448
472
  else:
449
473
  driver.default_get(url) # The original one
450
474
  return None
@@ -1748,14 +1772,28 @@ def get_remote_driver(
1748
1772
  pip_find_lock = fasteners.InterProcessLock(
1749
1773
  constants.PipInstall.FINDLOCK
1750
1774
  )
1751
- with pip_find_lock:
1775
+ with pip_find_lock: # Prevent issues with multiple processes
1752
1776
  try:
1753
1777
  from seleniumwire import webdriver
1778
+ import blinker
1779
+ try:
1780
+ use_blinker_ver = constants.SeleniumWire.BLINKER_VER
1781
+ if blinker.__version__ != use_blinker_ver:
1782
+ shared_utils.pip_install(
1783
+ "blinker", version=use_blinker_ver
1784
+ )
1785
+ except Exception:
1786
+ pass
1787
+ del blinker
1754
1788
  except Exception:
1789
+ shared_utils.pip_install(
1790
+ "blinker", version=constants.SeleniumWire.BLINKER_VER
1791
+ )
1755
1792
  shared_utils.pip_install(
1756
1793
  "selenium-wire", version=constants.SeleniumWire.VER
1757
1794
  )
1758
1795
  from seleniumwire import webdriver
1796
+ warnings.simplefilter("ignore", category=DeprecationWarning)
1759
1797
  else:
1760
1798
  from selenium import webdriver
1761
1799
 
@@ -2162,17 +2200,31 @@ def get_local_driver(
2162
2200
  downloads_path = DOWNLOADS_FOLDER
2163
2201
  b_path = binary_location
2164
2202
  if use_wire:
2165
- driver_fixing_lock = fasteners.InterProcessLock(
2166
- constants.MultiBrowser.DRIVER_FIXING_LOCK
2203
+ pip_find_lock = fasteners.InterProcessLock(
2204
+ constants.PipInstall.FINDLOCK
2167
2205
  )
2168
- with driver_fixing_lock: # Prevent multi-processes mode issues
2206
+ with pip_find_lock: # Prevent issues with multiple processes
2169
2207
  try:
2170
2208
  from seleniumwire import webdriver
2209
+ import blinker
2210
+ try:
2211
+ use_blinker_ver = constants.SeleniumWire.BLINKER_VER
2212
+ if blinker.__version__ != use_blinker_ver:
2213
+ shared_utils.pip_install(
2214
+ "blinker", version=use_blinker_ver
2215
+ )
2216
+ except Exception:
2217
+ pass
2218
+ del blinker
2171
2219
  except Exception:
2220
+ shared_utils.pip_install(
2221
+ "blinker", version=constants.SeleniumWire.BLINKER_VER
2222
+ )
2172
2223
  shared_utils.pip_install(
2173
2224
  "selenium-wire", version=constants.SeleniumWire.VER
2174
2225
  )
2175
2226
  from seleniumwire import webdriver
2227
+ warnings.simplefilter("ignore", category=DeprecationWarning)
2176
2228
  else:
2177
2229
  from selenium import webdriver
2178
2230
 
@@ -3754,6 +3806,11 @@ def get_local_driver(
3754
3806
  driver, *args, **kwargs
3755
3807
  )
3756
3808
  )
3809
+ driver.uc_open_with_disconnect = (
3810
+ lambda *args, **kwargs: uc_open_with_disconnect(
3811
+ driver, *args, **kwargs
3812
+ )
3813
+ )
3757
3814
  driver.uc_click = lambda *args, **kwargs: uc_click(
3758
3815
  driver, *args, **kwargs
3759
3816
  )
@@ -114,6 +114,7 @@ class BaseCase(unittest.TestCase):
114
114
  ]
115
115
  self.version_tuple = tuple(self.version_list)
116
116
  self.version_info = self.version_tuple
117
+ self.time = time.time
117
118
  self.__page_sources = []
118
119
  self.__extra_actions = []
119
120
  self.__js_start_time = 0
@@ -381,6 +382,7 @@ class BaseCase(unittest.TestCase):
381
382
  self, selector, by="css selector", timeout=None, delay=0, scroll=True
382
383
  ):
383
384
  self.__check_scope()
385
+ self.__skip_if_esc()
384
386
  if not timeout:
385
387
  timeout = settings.SMALL_TIMEOUT
386
388
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
@@ -671,6 +673,7 @@ class BaseCase(unittest.TestCase):
671
673
  self.__demo_mode_pause_if_active(tiny=True)
672
674
  elif self.slow_mode:
673
675
  self.__slow_mode_pause_if_active()
676
+ self.__set_esc_skip()
674
677
 
675
678
  def slow_click(self, selector, by="css selector", timeout=None):
676
679
  """Similar to click(), but pauses for a brief moment before clicking.
@@ -1586,6 +1589,7 @@ class BaseCase(unittest.TestCase):
1586
1589
  def click_link_text(self, link_text, timeout=None):
1587
1590
  """This method clicks link text on a page."""
1588
1591
  self.__check_scope()
1592
+ self.__skip_if_esc()
1589
1593
  if not timeout:
1590
1594
  timeout = settings.SMALL_TIMEOUT
1591
1595
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
@@ -4142,6 +4146,10 @@ class BaseCase(unittest.TestCase):
4142
4146
  self.uc_open_with_tab = new_driver.uc_open_with_tab
4143
4147
  if hasattr(new_driver, "uc_open_with_reconnect"):
4144
4148
  self.uc_open_with_reconnect = new_driver.uc_open_with_reconnect
4149
+ if hasattr(new_driver, "uc_open_with_disconnect"):
4150
+ self.uc_open_with_disconnect = (
4151
+ new_driver.uc_open_with_disconnect
4152
+ )
4145
4153
  if hasattr(new_driver, "reconnect"):
4146
4154
  self.reconnect = new_driver.reconnect
4147
4155
  if hasattr(new_driver, "disconnect"):
@@ -4404,11 +4412,35 @@ class BaseCase(unittest.TestCase):
4404
4412
  for cookie_dict in cookies:
4405
4413
  self.driver.add_cookie(cookie_dict)
4406
4414
 
4415
+ def __set_esc_skip(self):
4416
+ if hasattr(self, "esc_end") and self.esc_end:
4417
+ script = (
4418
+ """document.onkeydown = function(evt) {
4419
+ evt = evt || window.event;
4420
+ var isEscape = false;
4421
+ if ("key" in evt) {
4422
+ isEscape = (evt.key === "Escape" || evt.key === "Esc");
4423
+ } else {
4424
+ isEscape = (evt.keyCode === 27);
4425
+ }
4426
+ if (isEscape) {
4427
+ document.sb_esc_end = 'yes';
4428
+ }
4429
+ };"""
4430
+ )
4431
+ self.execute_script(script)
4432
+
4433
+ def __skip_if_esc(self):
4434
+ if hasattr(self, "esc_end") and self.esc_end:
4435
+ if self.execute_script("return document.sb_esc_end;") == "yes":
4436
+ self.skip()
4437
+
4407
4438
  def wait_for_ready_state_complete(self, timeout=None):
4408
4439
  """Waits for the "readyState" of the page to be "complete".
4409
4440
  Returns True when the method completes."""
4410
4441
  self.__check_scope()
4411
4442
  self._check_browser()
4443
+ self.__skip_if_esc()
4412
4444
  if not timeout:
4413
4445
  timeout = settings.EXTREME_TIMEOUT
4414
4446
  if self.timeout_multiplier and timeout == settings.EXTREME_TIMEOUT:
@@ -4427,6 +4459,7 @@ class BaseCase(unittest.TestCase):
4427
4459
  time.sleep(0.01)
4428
4460
  if self.undetectable:
4429
4461
  time.sleep(0.035)
4462
+ self.__set_esc_skip()
4430
4463
  return True
4431
4464
 
4432
4465
  def wait_for_angularjs(self, timeout=None, **kwargs):
@@ -5775,6 +5808,7 @@ class BaseCase(unittest.TestCase):
5775
5808
  scroll - the option to scroll to the element first (Default: True)
5776
5809
  timeout - the time to wait for the element to appear """
5777
5810
  self.__check_scope()
5811
+ self.__skip_if_esc()
5778
5812
  if isinstance(selector, WebElement):
5779
5813
  self.__highlight_element(selector, loops=loops, scroll=scroll)
5780
5814
  return
@@ -6760,10 +6794,7 @@ class BaseCase(unittest.TestCase):
6760
6794
  constants.PipInstall.FINDLOCK
6761
6795
  )
6762
6796
  with pip_find_lock:
6763
- if (
6764
- sys.version_info >= (3, 7)
6765
- and sys.version_info < (3, 9)
6766
- ):
6797
+ if sys.version_info < (3, 9):
6767
6798
  # Fix bug in newer cryptography for Python 3.7 and 3.8:
6768
6799
  # "pyo3_runtime.PanicException: Python API call failed"
6769
6800
  try:
@@ -8709,6 +8740,7 @@ class BaseCase(unittest.TestCase):
8709
8740
  ):
8710
8741
  """Same as self.wait_for_element()"""
8711
8742
  self.__check_scope()
8743
+ self.__skip_if_esc()
8712
8744
  if not timeout:
8713
8745
  timeout = settings.LARGE_TIMEOUT
8714
8746
  if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
@@ -13478,6 +13510,7 @@ class BaseCase(unittest.TestCase):
13478
13510
  self.slow_scroll_to(selector, by=by)
13479
13511
 
13480
13512
  def __demo_mode_highlight_if_active(self, selector, by):
13513
+ self.__skip_if_esc()
13481
13514
  if self.demo_mode:
13482
13515
  # Includes self.slow_scroll_to(selector, by=by) by default
13483
13516
  self.__highlight(selector, by=by)
@@ -14379,6 +14412,7 @@ class BaseCase(unittest.TestCase):
14379
14412
  self.firefox_arg = sb_config.firefox_arg
14380
14413
  self.firefox_pref = sb_config.firefox_pref
14381
14414
  self.verify_delay = sb_config.verify_delay
14415
+ self.esc_end = sb_config.esc_end
14382
14416
  self.recorder_mode = sb_config.recorder_mode
14383
14417
  self.recorder_ext = sb_config.recorder_mode
14384
14418
  self.rec_print = sb_config.rec_print
@@ -15698,6 +15732,31 @@ class BaseCase(unittest.TestCase):
15698
15732
  else:
15699
15733
  return None
15700
15734
 
15735
+ def _get_num_handles(self):
15736
+ return len(self.driver.window_handles)
15737
+
15738
+ def _get_rec_shift_esc_script(self):
15739
+ return (
15740
+ """document.onkeydown = function(evt) {
15741
+ evt = evt || window.event;
15742
+ var isEscape = false;
15743
+ if ("key" in evt) {
15744
+ isEscape = (evt.key === "Escape" || evt.key === "Esc");
15745
+ last_key = evt.key;
15746
+ } else {
15747
+ isEscape = (evt.keyCode === 27);
15748
+ last_key = evt.keyCode;
15749
+ if (last_key === 16) {
15750
+ last_key = "Shift";
15751
+ }
15752
+ }
15753
+ if (isEscape && document.sb_last_key === "Shift") {
15754
+ document.sb_esc_end = "yes";
15755
+ }
15756
+ document.sb_last_key = last_key;
15757
+ };"""
15758
+ )
15759
+
15701
15760
  def _addSkip(self, result, test_case, reason):
15702
15761
  """This method should NOT be called directly from tests."""
15703
15762
  addSkip = getattr(result, 'addSkip', None)
@@ -15828,6 +15887,11 @@ class BaseCase(unittest.TestCase):
15828
15887
  )
15829
15888
  raise Exception(message)
15830
15889
  # *** Start tearDown() officially ***
15890
+ if self.undetectable:
15891
+ try:
15892
+ self.driver.window_handles
15893
+ except urllib3.exceptions.MaxRetryError:
15894
+ self.driver.connect()
15831
15895
  self.__slow_mode_pause_if_active()
15832
15896
  has_exception = self.__has_exception()
15833
15897
  sb_config._has_exception = has_exception
@@ -351,6 +351,7 @@ class ProxyPy:
351
351
  class SeleniumWire:
352
352
  # The version installed if selenium-wire is not installed
353
353
  VER = "5.1.0"
354
+ BLINKER_VER = "1.7.0" # The "blinker" dependency version
354
355
 
355
356
 
356
357
  class Mobile:
@@ -81,6 +81,7 @@ def pytest_addoption(parser):
81
81
  --block-images (Block images from loading during tests.)
82
82
  --do-not-track (Indicate to websites that you don't want to be tracked.)
83
83
  --verify-delay=SECONDS (The delay before MasterQA verification checks.)
84
+ --ee / --esc-end (Lets the user end the current test via the ESC key.)
84
85
  --recorder (Enables the Recorder for turning browser actions into code.)
85
86
  --rec-behave (Same as Recorder Mode, but also generates behave-gherkin.)
86
87
  --rec-sleep (If the Recorder is enabled, also records self.sleep calls.)
@@ -895,6 +896,16 @@ def pytest_addoption(parser):
895
896
  help="""Setting this overrides the default wait time
896
897
  before each MasterQA verification pop-up.""",
897
898
  )
899
+ parser.addoption(
900
+ "--esc-end",
901
+ "--esc_end",
902
+ "--ee",
903
+ action="store_true",
904
+ dest="esc_end",
905
+ default=False,
906
+ help="""End the current test early via the ESC key.
907
+ The test will be marked as skipped.""",
908
+ )
898
909
  parser.addoption(
899
910
  "--recorder",
900
911
  "--record",
@@ -1549,6 +1560,7 @@ def pytest_configure(config):
1549
1560
  sb_config.block_images = config.getoption("block_images")
1550
1561
  sb_config.do_not_track = config.getoption("do_not_track")
1551
1562
  sb_config.verify_delay = config.getoption("verify_delay")
1563
+ sb_config.esc_end = config.getoption("esc_end")
1552
1564
  sb_config.recorder_mode = config.getoption("recorder_mode")
1553
1565
  sb_config.recorder_ext = config.getoption("recorder_mode") # Again
1554
1566
  sb_config.rec_behave = config.getoption("rec_behave")
@@ -60,6 +60,7 @@ class SeleniumBrowser(Plugin):
60
60
  --block-images (Block images from loading during tests.)
61
61
  --do-not-track (Indicate to websites that you don't want to be tracked.)
62
62
  --verify-delay=SECONDS (The delay before MasterQA verification checks.)
63
+ --ee / --esc-end (Lets the user end the current test via the ESC key.)
63
64
  --recorder (Enables the Recorder for turning browser actions into code.)
64
65
  --rec-behave (Same as Recorder Mode, but also generates behave-gherkin.)
65
66
  --rec-sleep (If the Recorder is enabled, also records self.sleep calls.)
@@ -613,6 +614,16 @@ class SeleniumBrowser(Plugin):
613
614
  help="""Setting this overrides the default wait time
614
615
  before each MasterQA verification pop-up.""",
615
616
  )
617
+ parser.addoption(
618
+ "--esc-end",
619
+ "--esc_end",
620
+ "--ee",
621
+ action="store_true",
622
+ dest="esc_end",
623
+ default=False,
624
+ help="""End the current test early via the ESC key.
625
+ The test will be marked as skipped.""",
626
+ )
616
627
  parser.addoption(
617
628
  "--recorder",
618
629
  "--record",
@@ -1126,6 +1137,7 @@ class SeleniumBrowser(Plugin):
1126
1137
  test.test.block_images = self.options.block_images
1127
1138
  test.test.do_not_track = self.options.do_not_track
1128
1139
  test.test.verify_delay = self.options.verify_delay # MasterQA
1140
+ test.test.esc_end = self.options.esc_end
1129
1141
  test.test.recorder_mode = self.options.recorder_mode
1130
1142
  test.test.recorder_ext = self.options.recorder_mode # Again
1131
1143
  test.test.rec_behave = self.options.rec_behave
@@ -14,7 +14,7 @@ class WebElement(selenium.webdriver.remote.webelement.WebElement):
14
14
  ):
15
15
  if driver and selector and by:
16
16
  delayed_click = False
17
- if tag_name in ["span", "button", "div", "a"]:
17
+ if tag_name in ["span", "button", "div", "a", "b", "input"]:
18
18
  delayed_click = True
19
19
  if delayed_click and ":contains" not in selector:
20
20
  selector = js_utils.convert_to_css_selector(selector, by)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.26.3
3
+ Version: 4.27.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
@@ -88,7 +88,6 @@ Requires-Dist: parameterized ==0.9.0
88
88
  Requires-Dist: sbvirtualdisplay ==1.3.0
89
89
  Requires-Dist: behave ==1.2.6
90
90
  Requires-Dist: beautifulsoup4 ==4.12.3
91
- Requires-Dist: pygments ==2.17.2
92
91
  Requires-Dist: tabcompleter ==1.3.0
93
92
  Requires-Dist: pdbp ==1.5.0
94
93
  Requires-Dist: colorama ==0.4.6
@@ -110,15 +109,16 @@ Requires-Dist: pytest-metadata ==3.0.0 ; python_version < "3.8"
110
109
  Requires-Dist: pytest-rerunfailures ==13.0 ; python_version < "3.8"
111
110
  Requires-Dist: pytest-xdist ==3.5.0 ; python_version < "3.8"
112
111
  Requires-Dist: soupsieve ==2.4.1 ; python_version < "3.8"
112
+ Requires-Dist: pygments ==2.17.2 ; python_version < "3.8"
113
113
  Requires-Dist: markdown-it-py ==2.2.0 ; python_version < "3.8"
114
114
  Requires-Dist: urllib3 <2.3.0,>=1.26.18 ; python_version >= "3.10"
115
115
  Requires-Dist: setuptools >=69.5.1 ; python_version >= "3.8"
116
116
  Requires-Dist: wheel >=0.43.0 ; python_version >= "3.8"
117
117
  Requires-Dist: filelock >=3.14.0 ; python_version >= "3.8"
118
- Requires-Dist: platformdirs >=4.2.1 ; python_version >= "3.8"
118
+ Requires-Dist: platformdirs >=4.2.2 ; python_version >= "3.8"
119
119
  Requires-Dist: typing-extensions >=4.11.0 ; python_version >= "3.8"
120
- Requires-Dist: trio ==0.25.0 ; python_version >= "3.8"
121
- Requires-Dist: selenium ==4.20.0 ; python_version >= "3.8"
120
+ Requires-Dist: trio ==0.25.1 ; python_version >= "3.8"
121
+ Requires-Dist: selenium ==4.21.0 ; python_version >= "3.8"
122
122
  Requires-Dist: execnet ==2.1.1 ; python_version >= "3.8"
123
123
  Requires-Dist: pluggy ==1.5.0 ; python_version >= "3.8"
124
124
  Requires-Dist: pytest ==8.2.0 ; python_version >= "3.8"
@@ -126,6 +126,7 @@ Requires-Dist: pytest-metadata ==3.1.1 ; python_version >= "3.8"
126
126
  Requires-Dist: pytest-rerunfailures ==14.0 ; python_version >= "3.8"
127
127
  Requires-Dist: pytest-xdist ==3.6.1 ; python_version >= "3.8"
128
128
  Requires-Dist: soupsieve ==2.5 ; python_version >= "3.8"
129
+ Requires-Dist: pygments ==2.18.0 ; python_version >= "3.8"
129
130
  Requires-Dist: markdown-it-py ==3.0.0 ; python_version >= "3.8"
130
131
  Provides-Extra: allure
131
132
  Requires-Dist: allure-pytest >=2.13.5 ; extra == 'allure'
@@ -134,7 +135,7 @@ Requires-Dist: allure-behave >=2.13.5 ; extra == 'allure'
134
135
  Provides-Extra: coverage
135
136
  Requires-Dist: coverage ==7.2.7 ; (python_version < "3.8") and extra == 'coverage'
136
137
  Requires-Dist: pytest-cov ==4.1.0 ; (python_version < "3.8") and extra == 'coverage'
137
- Requires-Dist: coverage >=7.5.0 ; (python_version >= "3.8") and extra == 'coverage'
138
+ Requires-Dist: coverage >=7.5.1 ; (python_version >= "3.8") and extra == 'coverage'
138
139
  Requires-Dist: pytest-cov >=5.0.0 ; (python_version >= "3.8") and extra == 'coverage'
139
140
  Provides-Extra: flake8
140
141
  Requires-Dist: mccabe ==0.7.0 ; extra == 'flake8'
@@ -154,14 +155,14 @@ Requires-Dist: cffi ==1.15.1 ; (python_version < "3.8") and extra == 'pdfminer'
154
155
  Requires-Dist: cryptography ==39.0.2 ; (python_version < "3.9") and extra == 'pdfminer'
155
156
  Requires-Dist: pdfminer.six ==20231228 ; (python_version >= "3.8") and extra == 'pdfminer'
156
157
  Requires-Dist: cffi ==1.16.0 ; (python_version >= "3.8") and extra == 'pdfminer'
157
- Requires-Dist: cryptography ==42.0.5 ; (python_version >= "3.9") and extra == 'pdfminer'
158
+ Requires-Dist: cryptography ==42.0.7 ; (python_version >= "3.9") and extra == 'pdfminer'
158
159
  Provides-Extra: pillow
159
160
  Requires-Dist: Pillow ==9.5.0 ; (python_version < "3.8") and extra == 'pillow'
160
161
  Requires-Dist: Pillow >=10.3.0 ; (python_version >= "3.8") and extra == 'pillow'
161
162
  Provides-Extra: pip-system-certs
162
163
  Requires-Dist: pip-system-certs ==4.0 ; (platform_system == "Windows") and extra == 'pip-system-certs'
163
164
  Provides-Extra: proxy
164
- Requires-Dist: proxy.py ==2.4.3 ; extra == 'proxy'
165
+ Requires-Dist: proxy.py ==2.4.4 ; extra == 'proxy'
165
166
  Provides-Extra: psutil
166
167
  Requires-Dist: psutil ==5.9.8 ; extra == 'psutil'
167
168
  Provides-Extra: selenium-stealth
@@ -174,8 +175,9 @@ Requires-Dist: h2 ==4.1.0 ; extra == 'selenium-wire'
174
175
  Requires-Dist: hpack ==4.0.0 ; extra == 'selenium-wire'
175
176
  Requires-Dist: hyperframe ==6.0.1 ; extra == 'selenium-wire'
176
177
  Requires-Dist: kaitaistruct ==0.10 ; extra == 'selenium-wire'
177
- Requires-Dist: pyasn1 ==0.5.1 ; extra == 'selenium-wire'
178
178
  Requires-Dist: zstandard ==0.22.0 ; extra == 'selenium-wire'
179
+ Requires-Dist: pyasn1 ==0.5.1 ; (python_version < "3.8") and extra == 'selenium-wire'
180
+ Requires-Dist: pyasn1 ==0.6.0 ; (python_version >= "3.8") and extra == 'selenium-wire'
179
181
 
180
182
  <!-- SeleniumBase Docs -->
181
183
 
@@ -844,6 +846,7 @@ pytest test_coffee_cart.py --trace
844
846
  --block-images # (Block images from loading during tests.)
845
847
  --do-not-track # (Indicate to websites that you don't want to be tracked.)
846
848
  --verify-delay=SECONDS # (The delay before MasterQA verification checks.)
849
+ --ee | --esc-end # (Lets the user end the current test via the ESC key.)
847
850
  --recorder # (Enables the Recorder for turning browser actions into code.)
848
851
  --rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
849
852
  --rec-sleep # (If the Recorder is enabled, also records self.sleep calls.)
@@ -5,7 +5,7 @@ sbase/steps.py,sha256=bKT_u5bJkKzYWEuAXi9NVVRYYxQRCM1_YJUrNFFRVPY,42865
5
5
  seleniumbase/ReadMe.md,sha256=4nEdto4d0Ch0Zneg0yAC-RBBdqRqPUP0SCo-ze_XDPM,3612
6
6
  seleniumbase/__init__.py,sha256=Mw4ShIWUF2Efjx-JuwUQLWF9nIbxcX-vu9AOGBp32ec,2123
7
7
  seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
8
- seleniumbase/__version__.py,sha256=FFWk8j6zhXWDYdLew6Aj1jcg3AsMK8J44UaJpDRfpws,46
8
+ seleniumbase/__version__.py,sha256=gq-c9L8g2riz89KLUv51q7uL-IWfLjHq1GH96dLVBEQ,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=rpSKGufjzKeoiTqsr1HChNu1fY68CMirr5mgff--LHs,56291
@@ -21,11 +21,11 @@ seleniumbase/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
21
21
  seleniumbase/config/ad_block_list.py,sha256=qCQvbpONdSXk6q5tMwLuOswGYE1Syd8cy5TMIYFjTME,3380
22
22
  seleniumbase/config/proxy_list.py,sha256=tSdk82_6pPqClotHMl3YOTlxi9IIEppHmCoQDkZXLqw,1123
23
23
  seleniumbase/config/settings.py,sha256=n07U3PrrTgXgg5S1DIGnRuR6Y7AW11y06lvkflD7ZuE,7708
24
- seleniumbase/console_scripts/ReadMe.md,sha256=edWzZCdEpLaUSkzeasVq990ONVPWQSi-F0Y9ZWY5Xuw,20160
24
+ seleniumbase/console_scripts/ReadMe.md,sha256=WQiuXXpsyoKePkkt3aq7XMWr7KBZq7Wk4n2iee-2Ihk,20210
25
25
  seleniumbase/console_scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  seleniumbase/console_scripts/logo_helper.py,sha256=F8pcANlWY6pdcMwHUdjjpjAD9i8XD0R5J-28eSh7QMM,1907
27
27
  seleniumbase/console_scripts/rich_helper.py,sha256=U_zvXpalxVV8rtg8c8EnNNmnh45tii3AV5ZV3O3KbGA,2234
28
- seleniumbase/console_scripts/run.py,sha256=3bZAxL0CjcVU-jSEa-8nsL7DVrcUvrP1H0qa5_bOgNI,59033
28
+ seleniumbase/console_scripts/run.py,sha256=54XCmUvOtYT5UmajEZ208wflH5BLkEpHZSmvgaJFSN0,59173
29
29
  seleniumbase/console_scripts/sb_behave_gui.py,sha256=8uFTnHU3lPsxAlPFbGe4tH4fVryEbQeVBydwJZw3e9c,15403
30
30
  seleniumbase/console_scripts/sb_caseplans.py,sha256=HrML5SU6E_3gC8Ae5byo5tnBidrs0sY3feJ8ug4cR4o,18415
31
31
  seleniumbase/console_scripts/sb_commander.py,sha256=FdRLcEe3xOnnbU1bZI4_1ZLu5eKdR4JuIh37j5M-J00,13585
@@ -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=t2rxTZTz76RDeSbBdHLaHUDS6LT_p0ttm2H_uYdtBko,16480
36
36
  seleniumbase/console_scripts/sb_mkpres.py,sha256=5MEYFKATmh68wy0SRi2NQtO71MN7m-rQq-WtUp4cKD8,11306
37
- seleniumbase/console_scripts/sb_mkrec.py,sha256=9p-1kkRby_bVn0RecbKPIj3B_CEefINqGkkqcq5-nbE,9302
37
+ seleniumbase/console_scripts/sb_mkrec.py,sha256=AKAbVnkI5nLDpA6W9JZu38QSpJz5IE8Pto-Em9U5r2o,11208
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=2QQov64Erfnm1hnVleKX-c_llcsO6hhJKKxzcANcix0,10904
40
+ seleniumbase/console_scripts/sb_recorder.py,sha256=UQQhnAR18dbcC7ToDvj6TM2PIG5qBrNaekaM6kSK_E8,10970
41
41
  seleniumbase/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  seleniumbase/core/application_manager.py,sha256=e_0sjtI8cjY5BNyZj1QBR0j6_oCScxGmSXYEpcYwuZE,576
43
- seleniumbase/core/browser_launcher.py,sha256=xlZqxbA4p3zIpsXGAcJYr-09OtykvdIsDoj6yyOPKYw,166053
43
+ seleniumbase/core/browser_launcher.py,sha256=CUtHUY1lv1diGQESHy0MQn1wuQgW-M2LZ3N2MutHYWk,168326
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,8 +70,8 @@ seleniumbase/extensions/disable_csp.zip,sha256=YMifIIgEBiLrEFrS1sfW4Exh4br1V4oK1
70
70
  seleniumbase/extensions/recorder.zip,sha256=dE3-vt1lsIyMbz3MD0WboizA5KiR3SH2jxAMrC0T_cU,11908
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=IOSN4C10oS-xv_euTU99mZ3vunySXwx9Sr5tShAn2B0,691243
74
- seleniumbase/fixtures/constants.py,sha256=Uvr5-Z8ZfiE2-lIqJS1CQ0tkmQ6qJYooCOTo_HMleo4,13348
73
+ seleniumbase/fixtures/base_case.py,sha256=gVAc8T9TlSJ9UySEldWZBiVm1GS3-mv_HK25XygHcdY,693568
74
+ seleniumbase/fixtures/constants.py,sha256=jOPy8CuR-QEK2hTv06cKZHaCNgGoFmtNHkvhR6mD7sg,13410
75
75
  seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
76
76
  seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
77
77
  seleniumbase/fixtures/js_utils.py,sha256=y1FgWvrg7CjryqGnFhbmFIIVYMzQfYZhwppYae87UCo,51158
@@ -94,11 +94,11 @@ seleniumbase/plugins/basic_test_info.py,sha256=8ov6n417gPbqqvrlT4zrch7l2XcRt-GF2
94
94
  seleniumbase/plugins/db_reporting_plugin.py,sha256=En09qUCoojrk9-vbcnsoHdSELoGmag2GDIyu3jTiJas,7331
95
95
  seleniumbase/plugins/driver_manager.py,sha256=oO3ML-tVqf8v6EGvylTCtPi5PjdfnSH40m7icjJfZDM,22485
96
96
  seleniumbase/plugins/page_source.py,sha256=loTnXxOj4kxEukuTZEiGyvKBhY3KDVDMnNlHHheTBDE,1889
97
- seleniumbase/plugins/pytest_plugin.py,sha256=fPOADQgwLKQ-BxDZm3sAp8jrN2FTjQo8_suIXXRvZqM,94467
97
+ seleniumbase/plugins/pytest_plugin.py,sha256=9JgG-PUZ8snb4O-gNYjOEBPkaWSBaspdQEqHEsxno8Q,94873
98
98
  seleniumbase/plugins/s3_logging_plugin.py,sha256=WDfertQgGOW_SRJpFMaekYD6vBVW9VO62POtXXy2HCM,2319
99
99
  seleniumbase/plugins/sb_manager.py,sha256=LPhV75mvhFRtSE18J1r8aPtAwaJO9UOLNxNdKM_qW1I,40491
100
100
  seleniumbase/plugins/screen_shots.py,sha256=1hrXw-hzuZ1BR6Yh7AyWX2ABnvnP73-RCbwdz958gj4,1127
101
- seleniumbase/plugins/selenium_plugin.py,sha256=wErmsKOzBFd9lDX9VVmxPauSpdjBDWScDk74QsCzJOY,54493
101
+ seleniumbase/plugins/selenium_plugin.py,sha256=VlHdUJIBhsmanyNJiNyUk67i7iux_X44s_0neaK7WYI,54936
102
102
  seleniumbase/resources/ReadMe.md,sha256=uminnO5_Uv-UZDKcc9a9s9kxisaYUps-H98Fp5PJcaU,2124
103
103
  seleniumbase/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
104
  seleniumbase/resources/favicon.ico,sha256=QPf_YK0QXa_--C4_CH-odh6OTHRQ9k-4O6WcCpXSdwM,1150
@@ -120,7 +120,7 @@ seleniumbase/undetected/dprocess.py,sha256=WWQ_X_-Q7Lfx1m6oxkYHU0eTIc76Jodph4n1Q
120
120
  seleniumbase/undetected/options.py,sha256=SGuz8iqlVPYN7IexNiGauupWF0xP3mqO72-9tgIqeuI,2999
121
121
  seleniumbase/undetected/patcher.py,sha256=u8X3uFBCTJ4XcU09AWpbDyPc-dm2LM-YeuciCp5AEdM,10853
122
122
  seleniumbase/undetected/reactor.py,sha256=UT1pEnGaTPZT7-0-xKROk9_eWDZueGzSUrCksc22nyA,2883
123
- seleniumbase/undetected/webelement.py,sha256=uD_XuJBG1RS42rDyx6br17FNvdgqXzJsntCgYeoWtQc,1356
123
+ seleniumbase/undetected/webelement.py,sha256=_s6evgUkdWJpwOnzX4qR9i796PoVbz3txlzHlOBJ4BE,1370
124
124
  seleniumbase/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  seleniumbase/utilities/selenium_grid/ReadMe.md,sha256=Uqvn4KmhaMY_jrhcsxL2WptCukPq1J3Yz-9WenCXEu0,3599
126
126
  seleniumbase/utilities/selenium_grid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -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.26.3.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
141
- seleniumbase-4.26.3.dist-info/METADATA,sha256=IBs2oYYeZBIZKe_U9KREMujzQhZUCmQdzpiGfPtZI74,84898
142
- seleniumbase-4.26.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
143
- seleniumbase-4.26.3.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
- seleniumbase-4.26.3.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
- seleniumbase-4.26.3.dist-info/RECORD,,
140
+ seleniumbase-4.27.0.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
141
+ seleniumbase-4.27.0.dist-info/METADATA,sha256=xW1f8Yg4uOmDdw1dZT_XcV2pZ64qV_m5DX3ApW7rQr8,85172
142
+ seleniumbase-4.27.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
143
+ seleniumbase-4.27.0.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
+ seleniumbase-4.27.0.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
+ seleniumbase-4.27.0.dist-info/RECORD,,