seleniumbase 4.15.13__py3-none-any.whl → 4.15.15__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.15.13"
2
+ __version__ = "4.15.15"
@@ -1,5 +1,6 @@
1
1
  """ SeleniumBase Exceptions
2
2
  NoSuchFileException => Called when self.assert_downloaded_file(...) fails.
3
+ NoSuchOptionException => Called when select_option_by_*() lacks the option.
3
4
  NotConnectedException => Called when Internet is not reachable when needed.
4
5
  NotUsingChromeException => Used by Chrome-only methods if not using Chrome.
5
6
  NotUsingChromiumException => Used by Chromium-only methods if not Chromium.
@@ -15,6 +16,10 @@ class NoSuchFileException(Exception):
15
16
  pass
16
17
 
17
18
 
19
+ class NoSuchOptionException(Exception):
20
+ pass
21
+
22
+
18
23
  class NotConnectedException(Exception):
19
24
  pass
20
25
 
@@ -183,8 +183,8 @@ def main():
183
183
  chart_options = '"circular", "barras", "columnas", "líneas", "área"'
184
184
 
185
185
  import_line = "from seleniumbase import BaseCase"
186
+ main_line = "BaseCase.main(__name__, __file__)"
186
187
  parent_class = "BaseCase"
187
- class_line = "class MyTestClass(BaseCase):"
188
188
  if language != "English":
189
189
  from seleniumbase.translate.master_dict import MD_F
190
190
 
@@ -196,6 +196,7 @@ def main():
196
196
  add_slide = '"<p>Chart Demo</p>" + self.extract_chart()'
197
197
  data = []
198
198
  data.append("%s" % import_line)
199
+ data.append("%s" % main_line)
199
200
  data.append("")
200
201
  data.append("")
201
202
  data.append("%s" % class_line)
@@ -204,12 +205,12 @@ def main():
204
205
  data.append("")
205
206
  data.append(" # %s => %s" % (select_option, chart_options))
206
207
  data.append(" self.create_pie_chart(%s)" % chart_settings)
207
- data.append(' self.add_data_point("%s A", 50)' % item)
208
- data.append(' self.add_data_point("%s B", 40)' % item)
209
- data.append(' self.add_data_point("%s C", 35)' % item)
210
- data.append(' self.add_data_point("%s D", 30)' % item)
211
- data.append(' self.add_data_point("%s E", 25)' % item)
212
- data.append(' self.add_data_point("%s F", 20)' % item)
208
+ data.append(' self.add_data_point("%s A", 36)' % item)
209
+ data.append(' self.add_data_point("%s B", 33)' % item)
210
+ data.append(' self.add_data_point("%s C", 27)' % item)
211
+ data.append(' self.add_data_point("%s D", 21)' % item)
212
+ data.append(' self.add_data_point("%s E", 18)' % item)
213
+ data.append(' self.add_data_point("%s F", 15)' % item)
213
214
  data.append(" self.add_slide(%s)" % add_slide)
214
215
  data.append("")
215
216
  data.append(' self.begin_presentation(filename="%s")' % html_name)
@@ -243,6 +244,10 @@ def main():
243
244
  # Example: self.assert_true("Name" in self.get_title())
244
245
  line = new_line
245
246
  continue
247
+ if main_line in line:
248
+ new_main = "%s.main(__name__, __file__)" % parent_class
249
+ new_line = line.replace(main_line, new_main)
250
+ found_swap = True
246
251
  if found_swap:
247
252
  if new_line.endswith(" # noqa"): # Remove flake8 skip
248
253
  new_line = new_line[0 : -len(" # noqa")]
@@ -231,15 +231,14 @@ def main():
231
231
  url = "data:text/html,<p>%s<br><input>" % hello
232
232
 
233
233
  import_line = "from seleniumbase import BaseCase"
234
+ main_line = "BaseCase.main(__name__, __file__)"
234
235
  parent_class = "BaseCase"
235
- class_line = "class MyTestClass(BaseCase):"
236
236
  if language != "English":
237
237
  from seleniumbase.translate.master_dict import MD_F
238
238
 
239
239
  import_line = MD_F.get_import_line(language)
240
240
  parent_class = MD_F.get_lang_parent_class(language)
241
241
  class_line = "class %s(%s):" % (class_name, parent_class)
242
- main_line = "BaseCase.main(__name__, __file__)"
243
242
 
244
243
  data = []
245
244
  data.append("%s" % import_line)
@@ -194,8 +194,8 @@ def main():
194
194
  class_name = "MiClaseDePrueba"
195
195
 
196
196
  import_line = "from seleniumbase import BaseCase"
197
+ main_line = "BaseCase.main(__name__, __file__)"
197
198
  parent_class = "BaseCase"
198
- class_line = "class MyTestClass(BaseCase):"
199
199
  if language != "English":
200
200
  from seleniumbase.translate.master_dict import MD_F
201
201
 
@@ -223,6 +223,7 @@ def main():
223
223
 
224
224
  data = []
225
225
  data.append("%s" % import_line)
226
+ data.append("%s" % main_line)
226
227
  data.append("")
227
228
  data.append("")
228
229
  data.append("%s" % class_line)
@@ -262,6 +263,10 @@ def main():
262
263
  # Example: self.assert_true("Name" in self.get_title())
263
264
  line = new_line
264
265
  continue
266
+ if main_line in line:
267
+ new_main = "%s.main(__name__, __file__)" % parent_class
268
+ new_line = line.replace(main_line, new_main)
269
+ found_swap = True
265
270
  if found_swap:
266
271
  if new_line.endswith(" # noqa"): # Remove flake8 skip
267
272
  new_line = new_line[0 : -len(" # noqa")]
@@ -168,6 +168,32 @@ def get_uc_driver_version():
168
168
  return uc_driver_version
169
169
 
170
170
 
171
+ def has_cf(text):
172
+ if (
173
+ "<title>Just a moment...</title>" in text
174
+ or 'id="challenge-error-text"' in text
175
+ or 'action="/?__cf_chl_f_tk' in text
176
+ or 'id="challenge-form"' in text
177
+ or "window._cf_chl_opt" in text
178
+ ):
179
+ return True
180
+ return False
181
+
182
+
183
+ def uc_open(driver, url):
184
+ if (
185
+ (url.startswith("http:") or url.startswith("https:"))
186
+ and has_cf(requests_get(url).text)
187
+ ):
188
+ driver.execute_script('window.open("%s","_blank");' % url)
189
+ time.sleep(2.75)
190
+ driver.execute_script("window.close();")
191
+ driver.switch_to.window(driver.window_handles[-1])
192
+ else:
193
+ driver.open(url) # The original one
194
+ return None
195
+
196
+
171
197
  def edgedriver_on_path():
172
198
  return os.path.exists(LOCAL_EDGEDRIVER)
173
199
 
@@ -742,6 +768,9 @@ def _set_chrome_options(
742
768
  chrome_options.add_argument("--use-gl=swiftshader")
743
769
  elif not is_using_uc(undetectable, browser_name):
744
770
  chrome_options.add_argument("--disable-gpu")
771
+ if not IS_LINUX and is_using_uc(undetectable, browser_name):
772
+ chrome_options.add_argument("--disable-dev-shm-usage")
773
+ chrome_options.add_argument("--disable-application-cache")
745
774
  if IS_LINUX:
746
775
  chrome_options.add_argument("--disable-dev-shm-usage")
747
776
  if is_using_uc(undetectable, browser_name):
@@ -3008,6 +3037,7 @@ def get_local_driver(
3008
3037
  or not IS_LINUX
3009
3038
  or is_using_uc(undetectable, browser_name)
3010
3039
  ):
3040
+ uc_activated = False
3011
3041
  try:
3012
3042
  if (
3013
3043
  os.path.exists(LOCAL_CHROMEDRIVER)
@@ -3051,6 +3081,7 @@ def get_local_driver(
3051
3081
  version_main=uc_chrome_version,
3052
3082
  use_subprocess=True, # Always!
3053
3083
  )
3084
+ uc_activated = True
3054
3085
  except URLError as e:
3055
3086
  if cert in e.args[0] and IS_MAC:
3056
3087
  mac_certificate_error = True
@@ -3082,6 +3113,7 @@ def get_local_driver(
3082
3113
  version_main=uc_chrome_version,
3083
3114
  use_subprocess=True, # Always!
3084
3115
  )
3116
+ uc_activated = True
3085
3117
  else:
3086
3118
  service = ChromeService(
3087
3119
  executable_path=LOCAL_CHROMEDRIVER,
@@ -3246,6 +3278,9 @@ def get_local_driver(
3246
3278
  service_args=["--disable-build-check"],
3247
3279
  options=chrome_options,
3248
3280
  )
3281
+ driver.open = driver.get # Save copy of original
3282
+ if uc_activated:
3283
+ driver.get = lambda url: uc_open(driver, url)
3249
3284
  return driver
3250
3285
  else: # Running headless on Linux (and not using --uc)
3251
3286
  try:
@@ -2829,11 +2829,38 @@ class BaseCase(unittest.TestCase):
2829
2829
  except Exception:
2830
2830
  self.wait_for_ready_state_complete()
2831
2831
  if option_by == "index":
2832
- Select(element).select_by_index(option)
2832
+ try:
2833
+ Select(element).select_by_index(option)
2834
+ except Exception:
2835
+ msg = (
2836
+ "Element {%s} has no selectable index option {%s}!"
2837
+ % (dropdown_selector, option)
2838
+ )
2839
+ page_actions.timeout_exception(
2840
+ "NoSuchOptionException", msg
2841
+ )
2833
2842
  elif option_by == "value":
2834
- Select(element).select_by_value(option)
2843
+ try:
2844
+ Select(element).select_by_value(option)
2845
+ except Exception:
2846
+ msg = (
2847
+ "Element {%s} has no selectable value option {%s}!"
2848
+ % (dropdown_selector, option)
2849
+ )
2850
+ page_actions.timeout_exception(
2851
+ "NoSuchOptionException", msg
2852
+ )
2835
2853
  else:
2836
- Select(element).select_by_visible_text(option)
2854
+ try:
2855
+ Select(element).select_by_visible_text(option)
2856
+ except Exception:
2857
+ msg = (
2858
+ "Element {%s} has no selectable text option {%s}!"
2859
+ % (dropdown_selector, option)
2860
+ )
2861
+ page_actions.timeout_exception(
2862
+ "NoSuchOptionException", msg
2863
+ )
2837
2864
  time.sleep(0.05)
2838
2865
  self.wait_for_ready_state_complete()
2839
2866
  latest_window_count = len(self.driver.window_handles)
@@ -99,7 +99,7 @@ def wait_for_angularjs(driver, timeout=settings.LARGE_TIMEOUT, **kwargs):
99
99
 
100
100
  def is_html_inspector_activated(driver):
101
101
  try:
102
- driver.execute_script("HTMLInspector") # Fails if not defined
102
+ driver.execute_script("HTMLInspector;") # Fails if not defined
103
103
  return True
104
104
  except Exception:
105
105
  return False
@@ -107,7 +107,7 @@ def is_html_inspector_activated(driver):
107
107
 
108
108
  def is_jquery_activated(driver):
109
109
  try:
110
- driver.execute_script("jQuery('html')") # Fails if jq is not defined
110
+ driver.execute_script("jQuery('html');") # Fails if jq is not defined
111
111
  return True
112
112
  except Exception:
113
113
  return False
@@ -121,7 +121,7 @@ def wait_for_jquery_active(driver, timeout=None):
121
121
  for x in range(timeout):
122
122
  # jQuery needs a small amount of time to activate.
123
123
  try:
124
- driver.execute_script("jQuery('html')")
124
+ driver.execute_script("jQuery('html');")
125
125
  wait_for_ready_state_complete(driver)
126
126
  wait_for_angularjs(driver)
127
127
  return
@@ -590,7 +590,7 @@ def add_meta_tag(driver, http_equiv=None, content=None):
590
590
 
591
591
  def is_jquery_confirm_activated(driver):
592
592
  try:
593
- driver.execute_script("jconfirm") # Fails if jq_confirm is not defined
593
+ driver.execute_script("jconfirm;") # Fails if jconfirm is not defined
594
594
  return True
595
595
  except Exception:
596
596
  return False
@@ -607,10 +607,13 @@ def activate_jquery_confirm(driver):
607
607
  add_css_link(driver, jq_confirm_css)
608
608
  add_js_link(driver, jq_confirm_js)
609
609
 
610
- for x in range(25):
610
+ for x in range(28):
611
611
  # jQuery-Confirm needs a small amount of time to load & activate.
612
+ if x == 14:
613
+ add_css_link(driver, jq_confirm_css)
614
+ add_js_link(driver, jq_confirm_js)
612
615
  try:
613
- driver.execute_script("jconfirm")
616
+ driver.execute_script("jconfirm;")
614
617
  wait_for_ready_state_complete(driver)
615
618
  wait_for_angularjs(driver)
616
619
  return
@@ -636,7 +639,7 @@ def activate_html_inspector(driver):
636
639
  for x in range(25):
637
640
  # HTML-Inspector needs a small amount of time to load & activate.
638
641
  try:
639
- driver.execute_script("HTMLInspector")
642
+ driver.execute_script("HTMLInspector;")
640
643
  wait_for_ready_state_complete(driver)
641
644
  wait_for_angularjs(driver)
642
645
  return
@@ -123,6 +123,7 @@ def format_exc(exception, message):
123
123
  from selenium.common.exceptions import NoSuchFrameException
124
124
  from selenium.common.exceptions import NoSuchWindowException
125
125
  from seleniumbase.common.exceptions import NoSuchFileException
126
+ from seleniumbase.common.exceptions import NoSuchOptionException
126
127
  from seleniumbase.common.exceptions import TextNotVisibleException
127
128
  from seleniumbase.common import exceptions
128
129
 
@@ -161,6 +162,10 @@ def format_exc(exception, message):
161
162
  exc = exceptions.NoSuchFileException
162
163
  elif exception == "NoSuchFileException":
163
164
  exc = exceptions.NoSuchFileException
165
+ elif exception == NoSuchOptionException:
166
+ exc = exceptions.NoSuchOptionException
167
+ elif exception == "NoSuchOptionException":
168
+ exc = exceptions.NoSuchOptionException
164
169
  elif type(exception) is str:
165
170
  exc = Exception
166
171
  message = "%s: %s" % (exception, message)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.15.13
3
+ Version: 4.15.15
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
@@ -119,7 +119,7 @@ Requires-Dist: requests (==2.31.0) ; python_version >= "3.7"
119
119
  Requires-Dist: sniffio (==1.3.0) ; python_version >= "3.7"
120
120
  Requires-Dist: h11 (==0.14.0) ; python_version >= "3.7"
121
121
  Requires-Dist: outcome (==1.2.0) ; python_version >= "3.7"
122
- Requires-Dist: trio (==0.22.1) ; python_version >= "3.7"
122
+ Requires-Dist: trio (==0.22.2) ; python_version >= "3.7"
123
123
  Requires-Dist: trio-websocket (==0.10.3) ; python_version >= "3.7"
124
124
  Requires-Dist: wsproto (==1.2.0) ; python_version >= "3.7"
125
125
  Requires-Dist: selenium (==4.10.0) ; python_version >= "3.7"
@@ -172,7 +172,7 @@ Requires-Dist: pycparser (==2.21) ; extra == 'pdfminer'
172
172
  Requires-Dist: pdfminer.six (==20211012) ; (python_version < "3.7") and extra == 'pdfminer'
173
173
  Requires-Dist: cryptography (==36.0.2) ; (python_version < "3.7") and extra == 'pdfminer'
174
174
  Requires-Dist: pdfminer.six (==20221105) ; (python_version >= "3.7") and extra == 'pdfminer'
175
- Requires-Dist: cryptography (==41.0.1) ; (python_version >= "3.7") and extra == 'pdfminer'
175
+ Requires-Dist: cryptography (==41.0.2) ; (python_version >= "3.7") and extra == 'pdfminer'
176
176
  Provides-Extra: pillow
177
177
  Requires-Dist: Pillow (==8.4.0) ; (python_version < "3.7") and extra == 'pillow'
178
178
  Requires-Dist: Pillow (==9.5.0) ; (python_version >= "3.7" and python_version < "3.8") and extra == 'pillow'
@@ -353,7 +353,7 @@ With raw Selenium, that requires more code:<br />
353
353
  <summary> ▶️ Learn about different ways of writing tests (<b>click to expand</b>)</summary>
354
354
  <div>
355
355
 
356
- <p align="left">📘📝 An example test with the <b>BaseCase</b> class. Runs with <b><a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b> or <b>pynose</b>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">Learn more</a>)</p>
356
+ <p align="left">📘📝 An example test with the <b>BaseCase</b> class. Runs with <b><a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b> or <b><a href="https://github.com/mdmintz/pynose">pynose</a></b>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">Learn more</a>)</p>
357
357
 
358
358
  ```python
359
359
  from seleniumbase import BaseCase
@@ -646,14 +646,14 @@ self.assert_no_js_errors() # Verify there are no JS errors.
646
646
  <p>✅ SeleniumBase uses simple syntax for commands. Example:</p>
647
647
 
648
648
  ```python
649
- self.type("input", "dogs\n")
649
+ self.type("input", "dogs\n") # (The "\n" presses ENTER)
650
650
  ```
651
651
 
652
652
  Most SeleniumBase scripts can be run with <code>pytest</code>, <code>pynose</code>, or pure <code>python</code>. Not all test runners can run all test formats. For example, tests that use the ``sb`` pytest fixture can only be run with ``pytest``. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
653
653
 
654
654
  ```bash
655
655
  pytest coffee_cart_tests.py --rs
656
- pytest test_sb_fixture.py
656
+ pytest test_sb_fixture.py --demo
657
657
  pytest test_suite.py --rs --html=report.html --dashboard
658
658
 
659
659
  pynose basic_test.py --mobile
@@ -692,12 +692,14 @@ pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
692
692
 
693
693
  ✅ SeleniumBase supports all major browsers and operating systems:
694
694
  <p><b>Browsers:</b> Chrome, Edge, Firefox, and Safari.</p>
695
- <p><b>Systems: </b>Linux/Ubuntu, macOS, and Windows.</p>
695
+ <p><b>Systems:</b> Linux/Ubuntu, macOS, and Windows.</p>
696
696
 
697
697
  ✅ SeleniumBase works on all popular CI/CD platforms:
698
698
  <p><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md"><img alt="GitHub Actions integration" src="https://img.shields.io/badge/GitHub_Actions-12B2C2.svg?logo=GitHubActions&logoColor=CFFFC2" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md"><img alt="Jenkins integration" src="https://img.shields.io/badge/Jenkins-32B242.svg?logo=jenkins&logoColor=white" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/azure_pipelines/ReadMe.md"><img alt="Azure integration" src="https://img.shields.io/badge/Azure-2288EE.svg?logo=AzurePipelines&logoColor=white" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/google_cloud/ReadMe.md"><img alt="Google Cloud integration" src="https://img.shields.io/badge/Google_Cloud-11CAE8.svg?logo=GoogleCloud&logoColor=EE0066" /></a> <a href="#utilizing_advanced_features"><img alt="AWS integration" src="https://img.shields.io/badge/AWS-4488DD.svg?logo=AmazonAWS&logoColor=FFFF44" /></a> <a href="https://en.wikipedia.org/wiki/Personal_computer" target="_blank"><img alt="Your Computer" src="https://img.shields.io/badge/💻_Your_Computer-44E6E6.svg" /></a></p>
699
699
 
700
- <p>✅ SeleniumBase includes an automated/manual hybrid solution called <b><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">MasterQA</a></b> to speed up manual testing with automation while the manual tester handles validation.</p>
700
+ <p>✅ SeleniumBase includes an automated/manual hybrid solution called <b><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">MasterQA</a></b> to speed up manual testing with automation while manual testers handle validation.</p>
701
+
702
+ <p>✅ SeleniumBase supports <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/offline_examples">running tests while offline</a> (<i>assuming webdrivers have previously been downloaded when online</i>).</p>
701
703
 
702
704
  <p>✅ For a full list of SeleniumBase features, <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">Click Here</a>.</p>
703
705
 
@@ -739,7 +741,7 @@ pytest test_fail.py --pdb
739
741
  pytest test_coffee_cart.py --trace
740
742
  ```
741
743
 
742
- <a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/cdn/gif/coffee_pdbp.gif" alt="SeleniumBase test with the pdbp (Pdb+) debugger" title="SeleniumBase test with the pdbp (Pdb+) debugger" /></a>
744
+ <a href="https://github.com/mdmintz/pdbp"><img src="https://seleniumbase.github.io/cdn/gif/coffee_pdbp.gif" alt="SeleniumBase test with the pdbp (Pdb+) debugger" title="SeleniumBase test with the pdbp (Pdb+) debugger" /></a>
743
745
 
744
746
 
745
747
  <a id="command_line_options"></a>
@@ -867,9 +869,9 @@ pytest test_coffee_cart.py --trace
867
869
  ```bash
868
870
  cd examples/
869
871
 
870
- pytest test_suite.py --browser=chrome
872
+ pytest test_suite.py --chrome
871
873
 
872
- pytest test_suite.py --browser=firefox
874
+ pytest test_suite.py --firefox
873
875
  ```
874
876
 
875
877
  An easy way to override seleniumbase/config/settings.py is by using a custom settings file.
@@ -883,7 +885,7 @@ Inside your tests, you can use ``self.data`` to access that.
883
885
  <a id="directory_configuration"></a>
884
886
  <h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Directory Configuration:</h2>
885
887
 
886
- 🔵 When running tests with **pytest**, you'll want a copy of **[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)** in your root folders. When running tests with **pynose**, you'll want a copy of **[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)** in your root folders. These files specify default configuration details for tests. Folders should also include a blank ``__init__.py`` file to allow your tests to import files from that folder.
888
+ 🔵 When running tests with **``pytest``**, you'll want a copy of **[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)** in your root folders. When running tests with **``pynose``**, you'll want a copy of **[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)** in your root folders. These files specify default configuration details for tests. Test folders should also include a blank **[__init__.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/offline_examples/__init__.py)** file to allow your test files to import other files from that folder.
887
889
 
888
890
  🔵 ``sbase mkdir DIR`` creates a folder with config files and sample tests:
889
891
 
@@ -1407,7 +1409,7 @@ self.execute_script("return jQuery('textarea')[2].value") # Returns the css "va
1407
1409
 
1408
1410
  <h3>🔵 How to handle a restrictive CSP:</h3>
1409
1411
 
1410
- 🛑 Some websites have a restrictive [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to prevent users from loading jQuery and other external libraries onto their websites. If you need to use jQuery or another JS library on such a website, add ``--disable-csp`` as a ``pytest`` command-line option.
1412
+ Some websites have a restrictive [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to prevent users from loading jQuery and other external libraries onto their websites. If you need to use jQuery or another JS library on those websites, add ``--disable-csp`` as a ``pytest`` command-line option to load a Chromium extension that bypasses the CSP.
1411
1413
 
1412
1414
  <h3>🔵 More JavaScript fun:</h3>
1413
1415
 
@@ -1489,25 +1491,22 @@ pytest --reruns=1 --reruns-delay=1
1489
1491
  <div><a href="https://github.com/seleniumbase/SeleniumBase/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/seleniumbase/SeleniumBase.svg?color=22BB88" title="Closed Issues" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/pulls?q=is%3Apr+is%3Aclosed"><img src="https://img.shields.io/github/issues-pr-closed/seleniumbase/SeleniumBase.svg?logo=github&logoColor=white&color=22BB99" title="Closed Pull Requests" /></a></div>
1490
1492
  </p>
1491
1493
 
1492
- <p>
1493
- <div><b>If you like SeleniumBase, star us! ⭐</b></div>
1494
- <div><a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
1495
- </p>
1496
-
1497
1494
  <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="266" /></a></p>
1498
1495
 
1496
+ <p><div>
1497
+ <span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="68" /></a></span>
1498
+ <span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="62" /></a></span>
1499
+ <span><a href="https://www.facebook.com/SeleniumBase"><img src="https://seleniumbase.io/img/social/share_facebook.svg" title="SeleniumBase on Facebook" alt="SeleniumBase on Facebook" width="64" /></a></span>
1500
+ <span><a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://seleniumbase.github.io/img/social/share_gitter.svg" title="SeleniumBase on Gitter" alt="SeleniumBase on Gitter" width="50" /></a></span>
1501
+ </div></p>
1502
+
1499
1503
  <p><div><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></div></p>
1500
1504
 
1501
1505
  <div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/fancy_logo_14.png" title="SeleniumBase" width="220" /></a></div> <div><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div> <div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a></div> <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></div>
1502
- <p><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a></p>
1503
-
1504
- <p><div>
1505
- <span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="70" /></a></span>
1506
- <span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="64" /></a></span>
1507
- <span><a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://seleniumbase.github.io/img/social/share_gitter.svg" title="SeleniumBase on Gitter" alt="SeleniumBase on Gitter" width="52" /></a></span>
1508
- </div></p>
1506
+ <div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a></div>
1507
+ <div><a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
1509
1508
 
1510
1509
  --------
1511
1510
 
1512
1511
  <p><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb.png" alt="SeleniumBase" title="SeleniumBase" width="300" /></a></p>
1513
- <p><a href="https://www.python.org/downloads/" target="_blank"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=22AAEE&logo=python&logoColor=FEDC54" title="Supported Python Versions" /></a></p>
1512
+ <p><a href="https://pypi.org/project/seleniumbase/" target="_blank"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=22AAEE&logo=python&logoColor=FEDC54" title="Supported Python Versions" /></a></p>
@@ -5,7 +5,7 @@ sbase/steps.py,sha256=RCZ_tKo7kFvgzVrHpIHb090c0on14ObIEkmMHjDURWE,38261
5
5
  seleniumbase/ReadMe.md,sha256=5Bnv8gsyKQGABhLj0S4HXZdtVic98puQlIGYc7YHUm8,3612
6
6
  seleniumbase/__init__.py,sha256=UKfONr7JsfKiXKvqdO5KJ1gMOBzvQ66PHHVAfE636ro,2068
7
7
  seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
8
- seleniumbase/__version__.py,sha256=ewySdv0lJ2OexIta4Olv42jZHzn48G0Hww5Q2yYK9Es,47
8
+ seleniumbase/__version__.py,sha256=-oSen3iyd0GJ-nnZ3RcnEMiTv0gKkBKTze21CRTCuSg,47
9
9
  seleniumbase/behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  seleniumbase/behave/behave_helper.py,sha256=KQ4rgOcWkMFSbD8QBUmevxO47M9UoSDenfoBHy9VaPk,22206
11
11
  seleniumbase/behave/behave_sb.py,sha256=fU8dLa-5Ohb5xVXq9nqVXHeLV4z3RDu5AnDJVvSD60c,54220
@@ -14,7 +14,7 @@ seleniumbase/common/ReadMe.md,sha256=PwQsRSPRCXejL-fg4YyDzED_Yr6e7ddmGu3g2OcDrcQ
14
14
  seleniumbase/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  seleniumbase/common/decorators.py,sha256=LJnAgg0RG3kDOFb8tpyq1zjmpv9ks6Tjg8GwgIn1YuY,7633
16
16
  seleniumbase/common/encryption.py,sha256=IfAuE0hdrd3y-_qAQUWdSOKRGQ4QN24uTOBiQ9Eeq2s,5593
17
- seleniumbase/common/exceptions.py,sha256=Uml3YcS_RFtyGbHQpujyjyisuzHCWQ5x0Mzb5I26P6E,2861
17
+ seleniumbase/common/exceptions.py,sha256=RHo4q237xvZD72q8t2ZDhNPR3bvPklWr7tp9--SGkvs,2992
18
18
  seleniumbase/common/obfuscate.py,sha256=VrwPbVigPH_Jk6ADCk5_miMoq1VK4M9SKnYScDkk-DQ,1204
19
19
  seleniumbase/common/unobfuscate.py,sha256=MgP6MMT9Wam6ECFVIA84WsQczfl_dFiumFu9m3eXFDg,771
20
20
  seleniumbase/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -30,17 +30,17 @@ seleniumbase/console_scripts/sb_behave_gui.py,sha256=A4yrf6LTqkqgpOz8-zjFw8NLNt5
30
30
  seleniumbase/console_scripts/sb_caseplans.py,sha256=KnxiwAXXMatZq03pVuaXoDoOQO6SGkqSA6RvTIJGcTU,18049
31
31
  seleniumbase/console_scripts/sb_commander.py,sha256=GgjFX6VWXctCUOTvYVq4EyxH8oETawqsKEDFi5hiY84,13239
32
32
  seleniumbase/console_scripts/sb_install.py,sha256=28aaBKFbt630fmYXLImE64-SPpKHP9O_o_1WznlutZY,41723
33
- seleniumbase/console_scripts/sb_mkchart.py,sha256=Qy8R9k35kC2YiN6moRrOVcWGP_Sz_s9RSGOQFJ8aKfk,10805
33
+ seleniumbase/console_scripts/sb_mkchart.py,sha256=BYzgzxRA66MeIBhEjeJKa9BqvViWX8YHSqjquWMLh1w,11044
34
34
  seleniumbase/console_scripts/sb_mkdir.py,sha256=UkD3TqaObvsItE7UwIERXOSFlQQqSjf0lUkwaJbN7I8,29782
35
- seleniumbase/console_scripts/sb_mkfile.py,sha256=XZtqpzsA7tFzQP5b8BaWv4ihFvdb_-8EFmhgXaSvN9s,15563
36
- seleniumbase/console_scripts/sb_mkpres.py,sha256=zvo1D9_wnJwNFuFmP1x2xb2p2AgKJfG5-pHQLOjd3Dc,10879
35
+ seleniumbase/console_scripts/sb_mkfile.py,sha256=wvv22cYCVVmFNEE4TDws1S6Rdd8vGhl9beebVvyXl7U,15515
36
+ seleniumbase/console_scripts/sb_mkpres.py,sha256=TfI1RV-MmUHLRlkdjyVpN3nrCsMxGGBsUUB5-4fLx88,11118
37
37
  seleniumbase/console_scripts/sb_mkrec.py,sha256=lRBqdHk9NfBW1VLa6l9GSaexvKpp6WYXX5GzvnzPXHk,9013
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=1mwFO7J0FPTfEa5-LwDa7eZEAOF0Tp811yj8M9gn7_c,30427
40
40
  seleniumbase/console_scripts/sb_recorder.py,sha256=T1gulg1Qq_vvAR7Q97k1g0J4L7j3bcYAq3FADqRuqqo,10581
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=cb8788m0lsBfnyR01qKo07NNN76MYmn1uvKL-WOZV6c,136461
43
+ seleniumbase/core/browser_launcher.py,sha256=L5t1YElo1yBErYNBCotp_1mBNiGfl52ua7s617M6lJg,137686
44
44
  seleniumbase/core/capabilities_parser.py,sha256=IC85bwCKlObCPcbF-il1IGwENnFo7QfzSmk7yfIn-jc,5760
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
@@ -69,14 +69,14 @@ seleniumbase/extensions/disable_csp.zip,sha256=YMifIIgEBiLrEFrS1sfW4Exh4br1V4oK1
69
69
  seleniumbase/extensions/recorder.zip,sha256=wAyF8K9vPkmMyDAqpgKUEmL_WprHWuesv38FMidmgwQ,11876
70
70
  seleniumbase/extensions/sbase_ext.zip,sha256=3s1N8zrVaMz8RQEOIoBzC3KDjtmHwVZRvVsX25Odr_s,8175
71
71
  seleniumbase/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- seleniumbase/fixtures/base_case.py,sha256=lfLF_qVqfs4xsM1CTv0wMTPEhtNI1pRCFN8vWnkQTrM,656144
72
+ seleniumbase/fixtures/base_case.py,sha256=ZcmtZxMZj2iE5dMYzqkM6w1gFrnIi31PeDozSQryAyE,657241
73
73
  seleniumbase/fixtures/constants.py,sha256=llnD8kKsdR-PjGxnvyVs8JS7bGRVcVtoEMwSK5w9ciI,11911
74
74
  seleniumbase/fixtures/css_to_xpath.py,sha256=LFOO3m2JqoqeUSdzpY4b-aNYzG1DzKsX7LhCjhXSXGc,1959
75
75
  seleniumbase/fixtures/errors.py,sha256=WLR1Fg_SgOf92lrJmBWgta3wjQgTSLv6-XOcKpUtPbc,560
76
- seleniumbase/fixtures/js_utils.py,sha256=g5p5j6tn-d2yOJ-h_OZ0QAa660dNa9c7nBeR73jWJmM,44505
76
+ seleniumbase/fixtures/js_utils.py,sha256=TDfLkh5i193YyY01A7b7yi5vS0h1Wy9LmvOK5qa6_BA,44625
77
77
  seleniumbase/fixtures/page_actions.py,sha256=rY2NJJw01aszIb9sBfbEdaY5h00OeLYi7RGy7Wgv50g,48848
78
78
  seleniumbase/fixtures/page_utils.py,sha256=PiBfY7TvjosIGawaXaDxjY668N7yx_htAdcI3hUfUVQ,9640
79
- seleniumbase/fixtures/shared_utils.py,sha256=3m43ap-m34yf2iJDCcb8Zc_RI8FUBxALDEoh414qZGs,7388
79
+ seleniumbase/fixtures/shared_utils.py,sha256=7LubzdEUo5WED5bYFF0Q9qZvp2Ycby-H2o2G3ZMRv4s,7643
80
80
  seleniumbase/fixtures/unittest_helper.py,sha256=sfZ92rZeBAn_sF_yQ3I6_I7h3lyU5-cV_UMegBNoEm8,1294
81
81
  seleniumbase/fixtures/words.py,sha256=YkdUA51Bt51YHalFFtsCVVGke2AYrEhtWo8QE41Jir0,7117
82
82
  seleniumbase/fixtures/xpath_to_css.py,sha256=w0BxPOHnES8HZxddNMayBqLRYhkmpdk0FZJd922buHQ,8877
@@ -136,9 +136,9 @@ seleniumbase/utilities/selenium_grid/start-grid-hub.sh,sha256=KADv0RUHONLL2_I443
136
136
  seleniumbase/utilities/selenium_ide/ReadMe.md,sha256=hznGeuMpkIimqMiZBW-4goIy2ltW4l8X9kb0YSPUQfE,4483
137
137
  seleniumbase/utilities/selenium_ide/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
138
  seleniumbase/utilities/selenium_ide/convert_ide.py,sha256=pZFnqEJQEKZPyNFjkLD29s2HPQgCrWW9XJWpCPhWOoM,31691
139
- seleniumbase-4.15.13.dist-info/LICENSE,sha256=9CweYVs2pqSWEApWewHooJ5p5F44GV0wSXi-jV0kA_U,1085
140
- seleniumbase-4.15.13.dist-info/METADATA,sha256=-qRkFAKau1251tmqN7hocP40v7Y7UG103NUF3HwdayA,81504
141
- seleniumbase-4.15.13.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
142
- seleniumbase-4.15.13.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
143
- seleniumbase-4.15.13.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
144
- seleniumbase-4.15.13.dist-info/RECORD,,
139
+ seleniumbase-4.15.15.dist-info/LICENSE,sha256=9CweYVs2pqSWEApWewHooJ5p5F44GV0wSXi-jV0kA_U,1085
140
+ seleniumbase-4.15.15.dist-info/METADATA,sha256=wMtx8CrvOssnasoDYa-YoaBkAhNVAB0PKRLEz7u_LWw,82109
141
+ seleniumbase-4.15.15.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
142
+ seleniumbase-4.15.15.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
143
+ seleniumbase-4.15.15.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
144
+ seleniumbase-4.15.15.dist-info/RECORD,,