seleniumbase 4.26.2__py3-none-any.whl → 4.26.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.26.2"
2
+ __version__ = "4.26.4"
@@ -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
@@ -3754,6 +3778,11 @@ def get_local_driver(
3754
3778
  driver, *args, **kwargs
3755
3779
  )
3756
3780
  )
3781
+ driver.uc_open_with_disconnect = (
3782
+ lambda *args, **kwargs: uc_open_with_disconnect(
3783
+ driver, *args, **kwargs
3784
+ )
3785
+ )
3757
3786
  driver.uc_click = lambda *args, **kwargs: uc_click(
3758
3787
  driver, *args, **kwargs
3759
3788
  )
@@ -60,6 +60,7 @@ from selenium.common.exceptions import (
60
60
  from selenium.webdriver.common.by import By
61
61
  from selenium.webdriver.common.keys import Keys
62
62
  from selenium.webdriver.remote.remote_connection import LOGGER
63
+ from selenium.webdriver.remote.webelement import WebElement
63
64
  from seleniumbase import config as sb_config
64
65
  from seleniumbase.__version__ import __version__
65
66
  from seleniumbase.common import decorators
@@ -113,6 +114,7 @@ class BaseCase(unittest.TestCase):
113
114
  ]
114
115
  self.version_tuple = tuple(self.version_list)
115
116
  self.version_info = self.version_tuple
117
+ self.time = time.time
116
118
  self.__page_sources = []
117
119
  self.__extra_actions = []
118
120
  self.__js_start_time = 0
@@ -380,6 +382,7 @@ class BaseCase(unittest.TestCase):
380
382
  self, selector, by="css selector", timeout=None, delay=0, scroll=True
381
383
  ):
382
384
  self.__check_scope()
385
+ self.__skip_if_esc()
383
386
  if not timeout:
384
387
  timeout = settings.SMALL_TIMEOUT
385
388
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
@@ -670,6 +673,7 @@ class BaseCase(unittest.TestCase):
670
673
  self.__demo_mode_pause_if_active(tiny=True)
671
674
  elif self.slow_mode:
672
675
  self.__slow_mode_pause_if_active()
676
+ self.__set_esc_skip()
673
677
 
674
678
  def slow_click(self, selector, by="css selector", timeout=None):
675
679
  """Similar to click(), but pauses for a brief moment before clicking.
@@ -1585,6 +1589,7 @@ class BaseCase(unittest.TestCase):
1585
1589
  def click_link_text(self, link_text, timeout=None):
1586
1590
  """This method clicks link text on a page."""
1587
1591
  self.__check_scope()
1592
+ self.__skip_if_esc()
1588
1593
  if not timeout:
1589
1594
  timeout = settings.SMALL_TIMEOUT
1590
1595
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
@@ -4141,6 +4146,10 @@ class BaseCase(unittest.TestCase):
4141
4146
  self.uc_open_with_tab = new_driver.uc_open_with_tab
4142
4147
  if hasattr(new_driver, "uc_open_with_reconnect"):
4143
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
+ )
4144
4153
  if hasattr(new_driver, "reconnect"):
4145
4154
  self.reconnect = new_driver.reconnect
4146
4155
  if hasattr(new_driver, "disconnect"):
@@ -4403,11 +4412,35 @@ class BaseCase(unittest.TestCase):
4403
4412
  for cookie_dict in cookies:
4404
4413
  self.driver.add_cookie(cookie_dict)
4405
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
+
4406
4438
  def wait_for_ready_state_complete(self, timeout=None):
4407
4439
  """Waits for the "readyState" of the page to be "complete".
4408
4440
  Returns True when the method completes."""
4409
4441
  self.__check_scope()
4410
4442
  self._check_browser()
4443
+ self.__skip_if_esc()
4411
4444
  if not timeout:
4412
4445
  timeout = settings.EXTREME_TIMEOUT
4413
4446
  if self.timeout_multiplier and timeout == settings.EXTREME_TIMEOUT:
@@ -4426,6 +4459,7 @@ class BaseCase(unittest.TestCase):
4426
4459
  time.sleep(0.01)
4427
4460
  if self.undetectable:
4428
4461
  time.sleep(0.035)
4462
+ self.__set_esc_skip()
4429
4463
  return True
4430
4464
 
4431
4465
  def wait_for_angularjs(self, timeout=None, **kwargs):
@@ -5645,6 +5679,40 @@ class BaseCase(unittest.TestCase):
5645
5679
  if self.is_element_visible(selector, by=by):
5646
5680
  self.__highlight(selector, by=by, loops=loops, scroll=scroll)
5647
5681
 
5682
+ def __highlight_element(self, element, loops=None, scroll=True):
5683
+ self.__check_scope()
5684
+ if not loops:
5685
+ loops = settings.HIGHLIGHTS
5686
+ if scroll and self.browser != "safari":
5687
+ try:
5688
+ self.__slow_scroll_to_element(element)
5689
+ except Exception:
5690
+ pass
5691
+ if self.highlights:
5692
+ loops = self.highlights
5693
+ if self.browser == "ie":
5694
+ loops = 1 # Override previous setting because IE is slow
5695
+ loops = int(loops)
5696
+ if self.headless or self.headless2 or self.xvfb:
5697
+ # Headless modes have less need for highlighting elements.
5698
+ # However, highlight() may be used as a sleep alternative.
5699
+ loops = int(math.ceil(loops * 0.5))
5700
+ o_bs = "" # original_box_shadow
5701
+ try:
5702
+ style = element.get_attribute("style")
5703
+ except Exception:
5704
+ self.wait_for_ready_state_complete()
5705
+ time.sleep(0.12)
5706
+ style = element.get_attribute("style")
5707
+ if style:
5708
+ if "box-shadow: " in style:
5709
+ box_start = style.find("box-shadow: ")
5710
+ box_end = style.find(";", box_start) + 1
5711
+ original_box_shadow = style[box_start:box_end]
5712
+ o_bs = original_box_shadow
5713
+ self.__highlight_element_with_js(element, loops, o_bs)
5714
+ time.sleep(0.065)
5715
+
5648
5716
  def __highlight(
5649
5717
  self, selector, by="css selector", loops=None, scroll=True
5650
5718
  ):
@@ -5733,13 +5801,17 @@ class BaseCase(unittest.TestCase):
5733
5801
  ):
5734
5802
  """This method uses fancy JavaScript to highlight an element.
5735
5803
  @Params
5736
- selector - the selector of the element to find
5804
+ selector - the selector of the element to find (Accepts WebElement)
5737
5805
  by - the type of selector to search by (Default: CSS)
5738
5806
  loops - # of times to repeat the highlight animation
5739
5807
  (Default: 4. Each loop lasts for about 0.2s)
5740
5808
  scroll - the option to scroll to the element first (Default: True)
5741
5809
  timeout - the time to wait for the element to appear """
5742
5810
  self.__check_scope()
5811
+ self.__skip_if_esc()
5812
+ if isinstance(selector, WebElement):
5813
+ self.__highlight_element(selector, loops=loops, scroll=scroll)
5814
+ return
5743
5815
  if not timeout:
5744
5816
  timeout = settings.SMALL_TIMEOUT
5745
5817
  self.wait_for_element_visible(selector, by=by, timeout=timeout)
@@ -5751,6 +5823,31 @@ class BaseCase(unittest.TestCase):
5751
5823
  action = ["hi_li", selector, origin, time_stamp]
5752
5824
  self.__extra_actions.append(action)
5753
5825
 
5826
+ def highlight_elements(
5827
+ self,
5828
+ selector,
5829
+ by="css selector",
5830
+ loops=None,
5831
+ scroll=True,
5832
+ limit=0,
5833
+ ):
5834
+ if not limit:
5835
+ limit = 0 # 0 means no limit
5836
+ limit = int(limit)
5837
+ count = 0
5838
+ elements = self.find_elements(selector, by=by)
5839
+ for element in elements:
5840
+ try:
5841
+ if element.is_displayed():
5842
+ self.__highlight_element(
5843
+ element, loops=loops, scroll=scroll
5844
+ )
5845
+ count += 1
5846
+ except Exception:
5847
+ pass
5848
+ if limit > 0 and count >= limit:
5849
+ break
5850
+
5754
5851
  def press_up_arrow(self, selector="html", times=1, by="css selector"):
5755
5852
  """Simulates pressing the UP Arrow on the keyboard.
5756
5853
  By default, "html" will be used as the CSS Selector target.
@@ -6697,10 +6794,7 @@ class BaseCase(unittest.TestCase):
6697
6794
  constants.PipInstall.FINDLOCK
6698
6795
  )
6699
6796
  with pip_find_lock:
6700
- if (
6701
- sys.version_info >= (3, 7)
6702
- and sys.version_info < (3, 9)
6703
- ):
6797
+ if sys.version_info < (3, 9):
6704
6798
  # Fix bug in newer cryptography for Python 3.7 and 3.8:
6705
6799
  # "pyo3_runtime.PanicException: Python API call failed"
6706
6800
  try:
@@ -8646,6 +8740,7 @@ class BaseCase(unittest.TestCase):
8646
8740
  ):
8647
8741
  """Same as self.wait_for_element()"""
8648
8742
  self.__check_scope()
8743
+ self.__skip_if_esc()
8649
8744
  if not timeout:
8650
8745
  timeout = settings.LARGE_TIMEOUT
8651
8746
  if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
@@ -13415,6 +13510,7 @@ class BaseCase(unittest.TestCase):
13415
13510
  self.slow_scroll_to(selector, by=by)
13416
13511
 
13417
13512
  def __demo_mode_highlight_if_active(self, selector, by):
13513
+ self.__skip_if_esc()
13418
13514
  if self.demo_mode:
13419
13515
  # Includes self.slow_scroll_to(selector, by=by) by default
13420
13516
  self.__highlight(selector, by=by)
@@ -14316,6 +14412,7 @@ class BaseCase(unittest.TestCase):
14316
14412
  self.firefox_arg = sb_config.firefox_arg
14317
14413
  self.firefox_pref = sb_config.firefox_pref
14318
14414
  self.verify_delay = sb_config.verify_delay
14415
+ self.esc_end = sb_config.esc_end
14319
14416
  self.recorder_mode = sb_config.recorder_mode
14320
14417
  self.recorder_ext = sb_config.recorder_mode
14321
14418
  self.rec_print = sb_config.rec_print
@@ -15635,6 +15732,31 @@ class BaseCase(unittest.TestCase):
15635
15732
  else:
15636
15733
  return None
15637
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
+
15638
15760
  def _addSkip(self, result, test_case, reason):
15639
15761
  """This method should NOT be called directly from tests."""
15640
15762
  addSkip = getattr(result, 'addSkip', None)
@@ -15765,6 +15887,11 @@ class BaseCase(unittest.TestCase):
15765
15887
  )
15766
15888
  raise Exception(message)
15767
15889
  # *** Start tearDown() officially ***
15890
+ if self.undetectable:
15891
+ try:
15892
+ self.driver.window_handles
15893
+ except urllib3.exceptions.MaxRetryError:
15894
+ self.driver.connect()
15768
15895
  self.__slow_mode_pause_if_active()
15769
15896
  has_exception = self.__has_exception()
15770
15897
  sb_config._has_exception = has_exception
@@ -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.2
3
+ Version: 4.26.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
@@ -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,6 +109,7 @@ 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"
@@ -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
@@ -844,6 +845,7 @@ pytest test_coffee_cart.py --trace
844
845
  --block-images # (Block images from loading during tests.)
845
846
  --do-not-track # (Indicate to websites that you don't want to be tracked.)
846
847
  --verify-delay=SECONDS # (The delay before MasterQA verification checks.)
848
+ --ee | --esc-end # (Lets the user end the current test via the ESC key.)
847
849
  --recorder # (Enables the Recorder for turning browser actions into code.)
848
850
  --rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
849
851
  --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=IdsM5krAJIinwIWiyshCDLrFMi6Bi4YJ6a8NCuZlhe0,46
8
+ seleniumbase/__version__.py,sha256=OUhvq8oKtVvzLYA6LcqBGQRyR9E9mRo5P6vyOiLX9QU,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=QVVK9v1-_C-J79G2lqEUY5Fr2PD-dQhToNjFXwvflq8,167061
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=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=3IkDFD7nEBv6RXdX3XUva98UXQS8Flfl5x-qwXlb9Lk,688938
73
+ seleniumbase/fixtures/base_case.py,sha256=gVAc8T9TlSJ9UySEldWZBiVm1GS3-mv_HK25XygHcdY,693568
74
74
  seleniumbase/fixtures/constants.py,sha256=Uvr5-Z8ZfiE2-lIqJS1CQ0tkmQ6qJYooCOTo_HMleo4,13348
75
75
  seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
76
76
  seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
@@ -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.2.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
141
- seleniumbase-4.26.2.dist-info/METADATA,sha256=_jN1hMI0IUttrMRfBBhaHYVbARfTPtY64vFqzMdCagc,84898
142
- seleniumbase-4.26.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
143
- seleniumbase-4.26.2.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
- seleniumbase-4.26.2.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
- seleniumbase-4.26.2.dist-info/RECORD,,
140
+ seleniumbase-4.26.4.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
141
+ seleniumbase-4.26.4.dist-info/METADATA,sha256=k-o9G1Re3zS138cZQ4us3gHlOMQZlJeMsbNQL4H-Zu8,85056
142
+ seleniumbase-4.26.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
143
+ seleniumbase-4.26.4.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
+ seleniumbase-4.26.4.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
+ seleniumbase-4.26.4.dist-info/RECORD,,