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.
- seleniumbase/__version__.py +1 -1
- seleniumbase/common/exceptions.py +5 -0
- seleniumbase/console_scripts/sb_mkchart.py +12 -7
- seleniumbase/console_scripts/sb_mkfile.py +1 -2
- seleniumbase/console_scripts/sb_mkpres.py +6 -1
- seleniumbase/core/browser_launcher.py +35 -0
- seleniumbase/fixtures/base_case.py +30 -3
- seleniumbase/fixtures/js_utils.py +10 -7
- seleniumbase/fixtures/shared_utils.py +5 -0
- {seleniumbase-4.15.13.dist-info → seleniumbase-4.15.15.dist-info}/METADATA +25 -26
- {seleniumbase-4.15.13.dist-info → seleniumbase-4.15.15.dist-info}/RECORD +15 -15
- {seleniumbase-4.15.13.dist-info → seleniumbase-4.15.15.dist-info}/LICENSE +0 -0
- {seleniumbase-4.15.13.dist-info → seleniumbase-4.15.15.dist-info}/WHEEL +0 -0
- {seleniumbase-4.15.13.dist-info → seleniumbase-4.15.15.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.15.13.dist-info → seleniumbase-4.15.15.dist-info}/top_level.txt +0 -0
seleniumbase/__version__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.15.
|
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",
|
208
|
-
data.append(' self.add_data_point("%s B",
|
209
|
-
data.append(' self.add_data_point("%s C",
|
210
|
-
data.append(' self.add_data_point("%s D",
|
211
|
-
data.append(' self.add_data_point("%s E",
|
212
|
-
data.append(' self.add_data_point("%s F",
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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(
|
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.
|
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.
|
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.
|
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
|
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
|
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/
|
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 --
|
872
|
+
pytest test_suite.py --chrome
|
871
873
|
|
872
|
-
pytest test_suite.py --
|
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
|
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
|
-
|
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
|
-
<
|
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://
|
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
|
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=
|
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=
|
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=
|
36
|
-
seleniumbase/console_scripts/sb_mkpres.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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.
|
140
|
-
seleniumbase-4.15.
|
141
|
-
seleniumbase-4.15.
|
142
|
-
seleniumbase-4.15.
|
143
|
-
seleniumbase-4.15.
|
144
|
-
seleniumbase-4.15.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|