seleniumbase 4.45.1__tar.gz → 4.45.12__tar.gz
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-4.45.1 → seleniumbase-4.45.12}/.gitignore +10 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/LICENSE +1 -1
- {seleniumbase-4.45.1/seleniumbase.egg-info → seleniumbase-4.45.12}/PKG-INFO +80 -70
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/README.md +69 -61
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/pyproject.toml +1 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/requirements.txt +7 -6
- seleniumbase-4.45.12/seleniumbase/__version__.py +2 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/behave/behave_sb.py +6 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/run.py +1 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_install.py +145 -2
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkdir.py +76 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkrec.py +5 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_recorder.py +2 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/browser_launcher.py +150 -38
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/sb_cdp.py +139 -26
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/base_case.py +53 -50
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/js_utils.py +6 -2
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/driver_manager.py +11 -4
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/pytest_plugin.py +20 -4
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/sb_manager.py +9 -4
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/selenium_plugin.py +15 -3
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/browser.py +81 -30
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/cdp_util.py +34 -18
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/config.py +61 -2
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/connection.py +25 -16
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/element.py +31 -19
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/tab.py +35 -2
- seleniumbase-4.45.12/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12/seleniumbase.egg-info}/PKG-INFO +80 -70
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase.egg-info/SOURCES.txt +1 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase.egg-info/requires.txt +14 -8
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/setup.py +11 -8
- seleniumbase-4.45.1/seleniumbase/__version__.py +0 -2
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/MANIFEST.in +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/install.sh +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/pytest.ini +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/sbase/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/sbase/__main__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/sbase/steps.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/drivers/chs_drivers → seleniumbase-4.45.12/seleniumbase/drivers/chromium_drivers}/__init__.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/drivers/comet_drivers → seleniumbase-4.45.12/seleniumbase/drivers/chs_drivers}/__init__.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/drivers/opera_drivers → seleniumbase-4.45.12/seleniumbase/drivers/comet_drivers}/__init__.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/extensions → seleniumbase-4.45.12/seleniumbase/drivers/opera_drivers}/__init__.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/fixtures → seleniumbase-4.45.12/seleniumbase/extensions}/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.45.1/seleniumbase/js_code → seleniumbase-4.45.12/seleniumbase/fixtures}/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/masterqa → seleniumbase-4.45.12/seleniumbase/js_code}/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/plugins → seleniumbase-4.45.12/seleniumbase/masterqa}/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/resources → seleniumbase-4.45.12/seleniumbase/plugins}/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/utilities → seleniumbase-4.45.12/seleniumbase/resources}/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/utilities/selenium_grid → seleniumbase-4.45.12/seleniumbase/utilities}/__init__.py +0 -0
- {seleniumbase-4.45.1/seleniumbase/utilities/selenium_ide → seleniumbase-4.45.12/seleniumbase/utilities/selenium_grid}/__init__.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/setup.cfg +0 -0
- {seleniumbase-4.45.1 → seleniumbase-4.45.12}/virtualenv_install.sh +0 -0
|
@@ -82,6 +82,16 @@ msedgedriver.exe
|
|
|
82
82
|
operadriver.exe
|
|
83
83
|
uc_driver.exe
|
|
84
84
|
|
|
85
|
+
# Chromium Zip Files
|
|
86
|
+
chrome-mac.zip
|
|
87
|
+
chrome-linux.zip
|
|
88
|
+
chrome-win.zip
|
|
89
|
+
|
|
90
|
+
# Chromium folders
|
|
91
|
+
chrome-mac
|
|
92
|
+
chrome-linux
|
|
93
|
+
chrome-win
|
|
94
|
+
|
|
85
95
|
# Chrome for Testing Zip Files
|
|
86
96
|
chrome-mac-arm64.zip
|
|
87
97
|
chrome-mac-x64.zip
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.45.
|
|
3
|
+
Version: 4.45.12
|
|
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
|
|
@@ -64,11 +64,12 @@ Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
|
|
64
64
|
Requires-Dist: setuptools>=80.9.0; python_version >= "3.10"
|
|
65
65
|
Requires-Dist: wheel>=0.45.1
|
|
66
66
|
Requires-Dist: attrs>=25.4.0
|
|
67
|
-
Requires-Dist: certifi>=
|
|
67
|
+
Requires-Dist: certifi>=2026.1.4
|
|
68
68
|
Requires-Dist: exceptiongroup>=1.3.1
|
|
69
|
-
Requires-Dist: websockets
|
|
69
|
+
Requires-Dist: websockets~=15.0.1; python_version < "3.10"
|
|
70
|
+
Requires-Dist: websockets>=16.0; python_version >= "3.10"
|
|
70
71
|
Requires-Dist: filelock~=3.19.1; python_version < "3.10"
|
|
71
|
-
Requires-Dist: filelock>=3.20.
|
|
72
|
+
Requires-Dist: filelock>=3.20.3; python_version >= "3.10"
|
|
72
73
|
Requires-Dist: fasteners>=0.20
|
|
73
74
|
Requires-Dist: mycdp>=1.3.2
|
|
74
75
|
Requires-Dist: pynose>=1.5.5
|
|
@@ -86,7 +87,7 @@ Requires-Dist: pyyaml>=6.0.3
|
|
|
86
87
|
Requires-Dist: pygments>=2.19.2
|
|
87
88
|
Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
|
|
88
89
|
Requires-Dist: tabcompleter>=1.4.0
|
|
89
|
-
Requires-Dist: pdbp>=1.8.
|
|
90
|
+
Requires-Dist: pdbp>=1.8.2
|
|
90
91
|
Requires-Dist: idna>=3.11
|
|
91
92
|
Requires-Dist: chardet==5.2.0
|
|
92
93
|
Requires-Dist: charset-normalizer<4,>=3.4.4
|
|
@@ -122,7 +123,7 @@ Requires-Dist: pytest-rerunfailures==16.1; python_version >= "3.10"
|
|
|
122
123
|
Requires-Dist: pytest-xdist==3.8.0
|
|
123
124
|
Requires-Dist: parameterized==0.9.0
|
|
124
125
|
Requires-Dist: behave==1.2.6
|
|
125
|
-
Requires-Dist: soupsieve~=2.8
|
|
126
|
+
Requires-Dist: soupsieve~=2.8.1
|
|
126
127
|
Requires-Dist: beautifulsoup4~=4.14.3
|
|
127
128
|
Requires-Dist: pyotp==2.9.0
|
|
128
129
|
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
|
@@ -137,7 +138,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
|
|
|
137
138
|
Requires-Dist: allure-behave>=2.13.5; extra == "allure"
|
|
138
139
|
Provides-Extra: coverage
|
|
139
140
|
Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
|
|
140
|
-
Requires-Dist: coverage>=7.13.
|
|
141
|
+
Requires-Dist: coverage>=7.13.1; python_version >= "3.10" and extra == "coverage"
|
|
141
142
|
Requires-Dist: pytest-cov>=7.0.0; extra == "coverage"
|
|
142
143
|
Provides-Extra: flake8
|
|
143
144
|
Requires-Dist: flake8==7.3.0; extra == "flake8"
|
|
@@ -150,13 +151,14 @@ Requires-Dist: ipython==7.34.0; extra == "ipdb"
|
|
|
150
151
|
Provides-Extra: mss
|
|
151
152
|
Requires-Dist: mss==10.1.0; extra == "mss"
|
|
152
153
|
Provides-Extra: pdfminer
|
|
153
|
-
Requires-Dist: pdfminer.six==20251107; extra == "pdfminer"
|
|
154
|
+
Requires-Dist: pdfminer.six==20251107; python_version < "3.10" and extra == "pdfminer"
|
|
155
|
+
Requires-Dist: pdfminer.six==20260107; python_version >= "3.10" and extra == "pdfminer"
|
|
154
156
|
Requires-Dist: cryptography==46.0.3; extra == "pdfminer"
|
|
155
157
|
Requires-Dist: cffi==2.0.0; extra == "pdfminer"
|
|
156
158
|
Requires-Dist: pycparser==2.23; extra == "pdfminer"
|
|
157
159
|
Provides-Extra: pillow
|
|
158
160
|
Requires-Dist: Pillow>=11.3.0; python_version < "3.10" and extra == "pillow"
|
|
159
|
-
Requires-Dist: Pillow>=12.
|
|
161
|
+
Requires-Dist: Pillow>=12.1.0; python_version >= "3.10" and extra == "pillow"
|
|
160
162
|
Provides-Extra: pip-system-certs
|
|
161
163
|
Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
|
|
162
164
|
Provides-Extra: proxy
|
|
@@ -218,22 +220,21 @@ Dynamic: summary
|
|
|
218
220
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">🏰 Features</a> |
|
|
219
221
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">🎛️ Options</a> |
|
|
220
222
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
|
|
221
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md"
|
|
223
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">🪄 Scripts</a> |
|
|
222
224
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mobile_testing.md">📱 Mobile</a>
|
|
223
225
|
<br />
|
|
224
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 API</a> |
|
|
225
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠
|
|
226
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 The API</a> |
|
|
227
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 SyntaxFormats</a> |
|
|
226
228
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
|
|
227
229
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a> |
|
|
228
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
|
|
229
|
-
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">💻 Farm</a>
|
|
230
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
|
|
230
231
|
<br />
|
|
231
232
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
|
|
232
233
|
<a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
|
|
233
234
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
|
|
234
235
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
|
|
235
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a>
|
|
236
|
-
<a href="https://
|
|
236
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
|
|
237
|
+
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
|
|
237
238
|
<br />
|
|
238
239
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
|
|
239
240
|
<a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝 Migration</a> |
|
|
@@ -242,7 +243,7 @@ Dynamic: summary
|
|
|
242
243
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
|
|
243
244
|
<br />
|
|
244
245
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
|
|
245
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md"
|
|
246
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">❇️ JSMgr</a> |
|
|
246
247
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
|
|
247
248
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
|
|
248
249
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
|
|
@@ -352,7 +353,7 @@ class MyTestClass(BaseCase):
|
|
|
352
353
|
|
|
353
354
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
|
|
354
355
|
|
|
355
|
-
> (The default browser is
|
|
356
|
+
> (The default browser is `--chrome` if not set.)
|
|
356
357
|
|
|
357
358
|
--------
|
|
358
359
|
|
|
@@ -516,18 +517,18 @@ finally:
|
|
|
516
517
|
<a id="install_seleniumbase"></a>
|
|
517
518
|
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Install SeleniumBase:</h2>
|
|
518
519
|
|
|
519
|
-
**You can install
|
|
520
|
+
**You can install `seleniumbase` from [PyPI](https://pypi.org/project/seleniumbase/) or [GitHub](https://github.com/seleniumbase/SeleniumBase):**
|
|
520
521
|
|
|
521
|
-
🔵 **How to install
|
|
522
|
+
🔵 **How to install `seleniumbase` from PyPI:**
|
|
522
523
|
|
|
523
524
|
```zsh
|
|
524
525
|
pip install seleniumbase
|
|
525
526
|
```
|
|
526
527
|
|
|
527
|
-
* (Add
|
|
528
|
-
* (Add
|
|
528
|
+
* (Add `--upgrade` OR `-U` to upgrade SeleniumBase.)
|
|
529
|
+
* (Add `--force-reinstall` to upgrade indirect packages.)
|
|
529
530
|
|
|
530
|
-
🔵 **How to install
|
|
531
|
+
🔵 **How to install `seleniumbase` from a GitHub clone:**
|
|
531
532
|
|
|
532
533
|
```zsh
|
|
533
534
|
git clone https://github.com/seleniumbase/SeleniumBase.git
|
|
@@ -542,7 +543,7 @@ git pull
|
|
|
542
543
|
pip install -e .
|
|
543
544
|
```
|
|
544
545
|
|
|
545
|
-
🔵 **Type
|
|
546
|
+
🔵 **Type `seleniumbase` or `sbase` to verify that SeleniumBase was installed successfully:**
|
|
546
547
|
|
|
547
548
|
```zsh
|
|
548
549
|
___ _ _ ___
|
|
@@ -592,7 +593,7 @@ pip install -e .
|
|
|
592
593
|
|
|
593
594
|
<h3>🔵 Downloading webdrivers:</h3>
|
|
594
595
|
|
|
595
|
-
✅ SeleniumBase automatically downloads webdrivers as needed, such as
|
|
596
|
+
✅ SeleniumBase automatically downloads webdrivers as needed, such as `chromedriver`.
|
|
596
597
|
|
|
597
598
|
<div></div>
|
|
598
599
|
<details>
|
|
@@ -725,7 +726,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
|
|
|
725
726
|
self.type("input", "dogs\n") # (The "\n" presses ENTER)
|
|
726
727
|
```
|
|
727
728
|
|
|
728
|
-
Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the
|
|
729
|
+
Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">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>.
|
|
729
730
|
|
|
730
731
|
```zsh
|
|
731
732
|
pytest coffee_cart_tests.py --rs
|
|
@@ -744,10 +745,10 @@ behave calculator.feature -D rs -D dashboard
|
|
|
744
745
|
|
|
745
746
|
<p>✅ <code translate="no">pytest</code> includes automatic test discovery. If you don't specify a specific file or folder to run, <code translate="no">pytest</code> will automatically search through all subdirectories for tests to run based on the following criteria:</p>
|
|
746
747
|
|
|
747
|
-
* Python files that start with
|
|
748
|
-
* Python methods that start with
|
|
748
|
+
* Python files that start with `test_` or end with `_test.py`.
|
|
749
|
+
* Python methods that start with `test_`.
|
|
749
750
|
|
|
750
|
-
With a SeleniumBase [pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/pytest.ini) file present, you can modify default discovery settings. The Python class name can be anything because
|
|
751
|
+
With a SeleniumBase [pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/pytest.ini) file present, you can modify default discovery settings. The Python class name can be anything because `seleniumbase.BaseCase` inherits `unittest.TestCase` to trigger autodiscovery.
|
|
751
752
|
|
|
752
753
|
<p>✅ You can do a pre-flight check to see which tests would get discovered by <code translate="no">pytest</code> before the actual run:</p>
|
|
753
754
|
|
|
@@ -789,7 +790,7 @@ pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
|
|
|
789
790
|
pytest my_first_test.py --demo
|
|
790
791
|
```
|
|
791
792
|
|
|
792
|
-
🔵
|
|
793
|
+
🔵 `time.sleep(seconds)` can be used to make a test wait at a specific spot:
|
|
793
794
|
|
|
794
795
|
```python
|
|
795
796
|
import time; time.sleep(3) # Do nothing for 3 seconds.
|
|
@@ -803,15 +804,15 @@ import pytest; pytest.set_trace()
|
|
|
803
804
|
breakpoint() # Shortcut for "import pdb; pdb.set_trace()"
|
|
804
805
|
```
|
|
805
806
|
|
|
806
|
-
> (
|
|
807
|
+
> (**`pdb`** commands: `n`, `c`, `s`, `u`, `d` => `next`, `continue`, `step`, `up`, `down`)
|
|
807
808
|
|
|
808
|
-
🔵 To pause an active test that throws an exception or error, (*and keep the browser window open while **Debug Mode** begins in the console*), add
|
|
809
|
+
🔵 To pause an active test that throws an exception or error, (*and keep the browser window open while **Debug Mode** begins in the console*), add **`--pdb`** as a `pytest` option:
|
|
809
810
|
|
|
810
811
|
```zsh
|
|
811
812
|
pytest test_fail.py --pdb
|
|
812
813
|
```
|
|
813
814
|
|
|
814
|
-
🔵 To start tests in Debug Mode, add
|
|
815
|
+
🔵 To start tests in Debug Mode, add **`--trace`** as a `pytest` option:
|
|
815
816
|
|
|
816
817
|
```zsh
|
|
817
818
|
pytest test_coffee_cart.py --trace
|
|
@@ -956,7 +957,7 @@ pytest test_coffee_cart.py --trace
|
|
|
956
957
|
|
|
957
958
|
--------
|
|
958
959
|
|
|
959
|
-
🔵 During test failures, logs and screenshots from the most recent test run will get saved to the
|
|
960
|
+
🔵 During test failures, logs and screenshots from the most recent test run will get saved to the `latest_logs/` folder. Those logs will get moved to `archived_logs/` if you add --archive_logs to command-line options, or have `ARCHIVE_EXISTING_LOGS` set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), otherwise log files with be cleaned up at the start of the next test run. The `test_suite.py` collection contains tests that fail on purpose so that you can see how logging works.
|
|
960
961
|
|
|
961
962
|
```zsh
|
|
962
963
|
cd examples/
|
|
@@ -968,18 +969,18 @@ pytest test_suite.py --firefox
|
|
|
968
969
|
|
|
969
970
|
An easy way to override seleniumbase/config/settings.py is by using a custom settings file.
|
|
970
971
|
Here's the command-line option to add to tests: (See [examples/custom_settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/custom_settings.py))
|
|
971
|
-
|
|
972
|
+
`--settings_file=custom_settings.py`
|
|
972
973
|
(Settings include default timeout values, a two-factor auth key, DB credentials, S3 credentials, and other important settings used by tests.)
|
|
973
974
|
|
|
974
|
-
🔵 To pass additional data from the command-line to tests, add
|
|
975
|
-
Inside your tests, you can use
|
|
975
|
+
🔵 To pass additional data from the command-line to tests, add `--data="ANY STRING"`.
|
|
976
|
+
Inside your tests, you can use `self.data` to access that.
|
|
976
977
|
|
|
977
978
|
<a id="directory_configuration"></a>
|
|
978
979
|
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Directory Configuration:</h2>
|
|
979
980
|
|
|
980
|
-
🔵 When running tests with
|
|
981
|
+
🔵 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.
|
|
981
982
|
|
|
982
|
-
🔵
|
|
983
|
+
🔵 `sbase mkdir DIR` creates a folder with config files and sample tests:
|
|
983
984
|
|
|
984
985
|
```zsh
|
|
985
986
|
sbase mkdir ui_tests
|
|
@@ -1011,7 +1012,7 @@ ui_tests/
|
|
|
1011
1012
|
└── swag_labs_test.py
|
|
1012
1013
|
```
|
|
1013
1014
|
|
|
1014
|
-
<b>ProTip™:</b> You can also create a boilerplate folder without any sample tests in it by adding
|
|
1015
|
+
<b>ProTip™:</b> You can also create a boilerplate folder without any sample tests in it by adding `-b` or `--basic` to the `sbase mkdir` command:
|
|
1015
1016
|
|
|
1016
1017
|
```zsh
|
|
1017
1018
|
sbase mkdir ui_tests --basic
|
|
@@ -1027,7 +1028,16 @@ ui_tests/
|
|
|
1027
1028
|
└── setup.cfg
|
|
1028
1029
|
```
|
|
1029
1030
|
|
|
1030
|
-
Of those files, the
|
|
1031
|
+
Of those files, the `pytest.ini` config file is the most important, followed by a blank `__init__.py` file. There's also a `setup.cfg` file (for pynose). Finally, the `requirements.txt` file can be used to help you install seleniumbase into your environments (if it's not already installed).
|
|
1032
|
+
|
|
1033
|
+
<b>ProTip™:</b> Add `--gha` to include a GitHub Actions `.yml` file with default settings:
|
|
1034
|
+
|
|
1035
|
+
```zsh
|
|
1036
|
+
ui_tests/
|
|
1037
|
+
└── .github
|
|
1038
|
+
└── workflows/
|
|
1039
|
+
└── python-package.yml
|
|
1040
|
+
```
|
|
1031
1041
|
|
|
1032
1042
|
--------
|
|
1033
1043
|
|
|
@@ -1047,20 +1057,20 @@ class MyTestClass(BaseCase):
|
|
|
1047
1057
|
self.assert_element("div#ARMY_OF_ROBOTS", timeout=1) # This should fail
|
|
1048
1058
|
```
|
|
1049
1059
|
|
|
1050
|
-
You can run it from the
|
|
1060
|
+
You can run it from the `examples/` folder like this:
|
|
1051
1061
|
|
|
1052
1062
|
```zsh
|
|
1053
1063
|
pytest test_fail.py
|
|
1054
1064
|
```
|
|
1055
1065
|
|
|
1056
|
-
🔵 You'll notice that a logs folder,
|
|
1066
|
+
🔵 You'll notice that a logs folder, `./latest_logs/`, was created to hold information (and screenshots) about the failing test. During test runs, past results get moved to the archived_logs folder if you have ARCHIVE_EXISTING_LOGS set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), or if your run tests with `--archive-logs`. If you choose not to archive existing logs, they will be deleted and replaced by the logs of the latest test run.
|
|
1057
1067
|
|
|
1058
1068
|
--------
|
|
1059
1069
|
|
|
1060
1070
|
<a id="seleniumbase_dashboard"></a>
|
|
1061
1071
|
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> SeleniumBase Dashboard:</h2>
|
|
1062
1072
|
|
|
1063
|
-
🔵 The
|
|
1073
|
+
🔵 The `--dashboard` option for pytest generates a SeleniumBase Dashboard located at `dashboard.html`, which updates automatically as tests run and produce results. Example:
|
|
1064
1074
|
|
|
1065
1075
|
```zsh
|
|
1066
1076
|
pytest --dashboard --rs --headless
|
|
@@ -1068,13 +1078,13 @@ pytest --dashboard --rs --headless
|
|
|
1068
1078
|
|
|
1069
1079
|
<img src="https://seleniumbase.github.io/cdn/img/dashboard_1.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="380" />
|
|
1070
1080
|
|
|
1071
|
-
🔵 Additionally, you can host your own SeleniumBase Dashboard Server on a port of your choice. Here's an example of that using Python's
|
|
1081
|
+
🔵 Additionally, you can host your own SeleniumBase Dashboard Server on a port of your choice. Here's an example of that using Python's `http.server`:
|
|
1072
1082
|
|
|
1073
1083
|
```zsh
|
|
1074
1084
|
python -m http.server 1948
|
|
1075
1085
|
```
|
|
1076
1086
|
|
|
1077
|
-
🔵 Now you can navigate to
|
|
1087
|
+
🔵 Now you can navigate to `http://localhost:1948/dashboard.html` in order to view the dashboard as a web app. This requires two different terminal windows: one for running the server, and another for running the tests, which should be run from the same directory. (Use <kbd>Ctrl+C</kbd> to stop the http server.)
|
|
1078
1088
|
|
|
1079
1089
|
🔵 Here's a full example of what the SeleniumBase Dashboard may look like:
|
|
1080
1090
|
|
|
@@ -1091,7 +1101,7 @@ pytest test_suite.py test_image_saving.py --dashboard --rs --headless
|
|
|
1091
1101
|
|
|
1092
1102
|
<h3>🔵 <code>pytest</code> HTML Reports:</h3>
|
|
1093
1103
|
|
|
1094
|
-
✅ Using
|
|
1104
|
+
✅ Using `--html=report.html` gives you a fancy report of the name specified after your test suite completes.
|
|
1095
1105
|
|
|
1096
1106
|
```zsh
|
|
1097
1107
|
pytest test_suite.py --html=report.html
|
|
@@ -1099,7 +1109,7 @@ pytest test_suite.py --html=report.html
|
|
|
1099
1109
|
|
|
1100
1110
|
<img src="https://seleniumbase.github.io/cdn/img/html_report.png" alt="Example Pytest Report" title="Example Pytest Report" width="520" />
|
|
1101
1111
|
|
|
1102
|
-
✅ When combining pytest html reports with SeleniumBase Dashboard usage, the pie chart from the Dashboard will get added to the html report. Additionally, if you set the html report URL to be the same as the Dashboard URL when also using the dashboard, (example:
|
|
1112
|
+
✅ When combining pytest html reports with SeleniumBase Dashboard usage, the pie chart from the Dashboard will get added to the html report. Additionally, if you set the html report URL to be the same as the Dashboard URL when also using the dashboard, (example: `--dashboard --html=dashboard.html`), then the Dashboard will become an advanced html report when all the tests complete.
|
|
1103
1113
|
|
|
1104
1114
|
✅ Here's an example of an upgraded html report:
|
|
1105
1115
|
|
|
@@ -1111,7 +1121,7 @@ pytest test_suite.py --dashboard --html=report.html
|
|
|
1111
1121
|
|
|
1112
1122
|
If viewing pytest html reports in [Jenkins](https://www.jenkins.io/), you may need to [configure Jenkins settings](https://stackoverflow.com/a/46197356/7058266) for the html to render correctly. This is due to [Jenkins CSP changes](https://www.jenkins.io/doc/book/system-administration/security/configuring-content-security-policy/).
|
|
1113
1123
|
|
|
1114
|
-
You can also use
|
|
1124
|
+
You can also use `--junit-xml=report.xml` to get an xml report instead. Jenkins can use this file to display better reporting for your tests.
|
|
1115
1125
|
|
|
1116
1126
|
```zsh
|
|
1117
1127
|
pytest test_suite.py --junit-xml=report.xml
|
|
@@ -1119,7 +1129,7 @@ pytest test_suite.py --junit-xml=report.xml
|
|
|
1119
1129
|
|
|
1120
1130
|
<h3>🔵 <code>pynose</code> Reports:</h3>
|
|
1121
1131
|
|
|
1122
|
-
The
|
|
1132
|
+
The `--report` option gives you a fancy report after your test suite completes.
|
|
1123
1133
|
|
|
1124
1134
|
```zsh
|
|
1125
1135
|
pynose test_suite.py --report
|
|
@@ -1127,7 +1137,7 @@ pynose test_suite.py --report
|
|
|
1127
1137
|
|
|
1128
1138
|
<img src="https://seleniumbase.github.io/cdn/img/nose_report.png" alt="Example pynose Report" title="Example pynose Report" width="320" />
|
|
1129
1139
|
|
|
1130
|
-
(NOTE: You can add
|
|
1140
|
+
(NOTE: You can add `--show-report` to immediately display pynose reports after the test suite completes. Only use `--show-report` when running tests locally because it pauses the test run.)
|
|
1131
1141
|
|
|
1132
1142
|
<h3>🔵 <code>behave</code> Dashboard & Reports:</h3>
|
|
1133
1143
|
|
|
@@ -1139,7 +1149,7 @@ behave behave_bdd/features/ -D dashboard -D headless
|
|
|
1139
1149
|
|
|
1140
1150
|
<img src="https://seleniumbase.github.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="520">
|
|
1141
1151
|
|
|
1142
|
-
You can also use
|
|
1152
|
+
You can also use `--junit` to get `.xml` reports for each <code translate="no">behave</code> feature. Jenkins can use these files to display better reporting for your tests.
|
|
1143
1153
|
|
|
1144
1154
|
```zsh
|
|
1145
1155
|
behave behave_bdd/features/ --junit -D rs -D headless
|
|
@@ -1149,7 +1159,7 @@ behave behave_bdd/features/ --junit -D rs -D headless
|
|
|
1149
1159
|
|
|
1150
1160
|
See: [https://allurereport.org/docs/pytest/](https://allurereport.org/docs/pytest/)
|
|
1151
1161
|
|
|
1152
|
-
SeleniumBase no longer includes
|
|
1162
|
+
SeleniumBase no longer includes `allure-pytest` as part of installed dependencies. If you want to use it, install it first:
|
|
1153
1163
|
|
|
1154
1164
|
```zsh
|
|
1155
1165
|
pip install allure-pytest
|
|
@@ -1165,7 +1175,7 @@ pytest test_suite.py --alluredir=allure_results
|
|
|
1165
1175
|
|
|
1166
1176
|
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Using a Proxy Server:</h3>
|
|
1167
1177
|
|
|
1168
|
-
If you wish to use a proxy server for your browser tests (Chromium or Firefox), you can add
|
|
1178
|
+
If you wish to use a proxy server for your browser tests (Chromium or Firefox), you can add `--proxy=IP_ADDRESS:PORT` as an argument on the command line.
|
|
1169
1179
|
|
|
1170
1180
|
```zsh
|
|
1171
1181
|
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
|
|
@@ -1185,7 +1195,7 @@ pytest proxy_test.py --proxy="socks4://IP_ADDRESS:PORT"
|
|
|
1185
1195
|
pytest proxy_test.py --proxy="socks5://IP_ADDRESS:PORT"
|
|
1186
1196
|
```
|
|
1187
1197
|
|
|
1188
|
-
To make things easier, you can add your frequently-used proxies to PROXY_LIST in [proxy_list.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/proxy_list.py), and then use
|
|
1198
|
+
To make things easier, you can add your frequently-used proxies to PROXY_LIST in [proxy_list.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/proxy_list.py), and then use `--proxy=KEY_FROM_PROXY_LIST` to use the IP_ADDRESS:PORT of that key.
|
|
1189
1199
|
|
|
1190
1200
|
```zsh
|
|
1191
1201
|
pytest proxy_test.py --proxy=proxy1
|
|
@@ -1194,7 +1204,7 @@ pytest proxy_test.py --proxy=proxy1
|
|
|
1194
1204
|
|
|
1195
1205
|
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Changing the User-Agent:</h3>
|
|
1196
1206
|
|
|
1197
|
-
🔵 If you wish to change the User-Agent for your browser tests (Chromium and Firefox only), you can add
|
|
1207
|
+
🔵 If you wish to change the User-Agent for your browser tests (Chromium and Firefox only), you can add `--agent="USER AGENT STRING"` as an argument on the command-line.
|
|
1198
1208
|
|
|
1199
1209
|
```zsh
|
|
1200
1210
|
pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU"
|
|
@@ -1208,7 +1218,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
|
|
|
1208
1218
|
|
|
1209
1219
|
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Building Guided Tours for Websites:</h3>
|
|
1210
1220
|
|
|
1211
|
-
🔵 Learn about <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">SeleniumBase Interactive Walkthroughs</a> (in the
|
|
1221
|
+
🔵 Learn about <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">SeleniumBase Interactive Walkthroughs</a> (in the `examples/tour_examples/` folder). It's great for prototyping a website onboarding experience.
|
|
1212
1222
|
|
|
1213
1223
|
|
|
1214
1224
|
<a id="utilizing_advanced_features"></a>
|
|
@@ -1277,7 +1287,7 @@ To click an element on the page:
|
|
|
1277
1287
|
self.click("div#my_id")
|
|
1278
1288
|
```
|
|
1279
1289
|
|
|
1280
|
-
**ProTip™:** In most web browsers, you can right-click on a page and select
|
|
1290
|
+
**ProTip™:** In most web browsers, you can right-click on a page and select `Inspect Element` to see the CSS selector details that you'll need to create your own scripts.
|
|
1281
1291
|
|
|
1282
1292
|
🔵 **Typing Text:**
|
|
1283
1293
|
|
|
@@ -1307,7 +1317,7 @@ attribute = self.get_attribute("#comic img", "title")
|
|
|
1307
1317
|
self.wait_for_element_present("div.my_class", timeout=10)
|
|
1308
1318
|
```
|
|
1309
1319
|
|
|
1310
|
-
(NOTE: You can also use:
|
|
1320
|
+
(NOTE: You can also use: `self.assert_element_present(ELEMENT)`)
|
|
1311
1321
|
|
|
1312
1322
|
🔵 **Asserting visibility of an element on a page within some number of seconds:**
|
|
1313
1323
|
|
|
@@ -1315,9 +1325,9 @@ self.wait_for_element_present("div.my_class", timeout=10)
|
|
|
1315
1325
|
self.wait_for_element_visible("a.my_class", timeout=5)
|
|
1316
1326
|
```
|
|
1317
1327
|
|
|
1318
|
-
(NOTE: The short versions of that are
|
|
1328
|
+
(NOTE: The short versions of that are `self.find_element(ELEMENT)` and `self.assert_element(ELEMENT)`. The `find_element()` version returns the element.)
|
|
1319
1329
|
|
|
1320
|
-
Since the line above returns the element, you can combine that with
|
|
1330
|
+
Since the line above returns the element, you can combine that with `.click()` as shown below:
|
|
1321
1331
|
|
|
1322
1332
|
```python
|
|
1323
1333
|
self.find_element("a.my_class", timeout=5).click()
|
|
@@ -1327,9 +1337,9 @@ self.find_element("a.my_class", timeout=5).click()
|
|
|
1327
1337
|
self.click("a.my_class") # DO IT THIS WAY!
|
|
1328
1338
|
```
|
|
1329
1339
|
|
|
1330
|
-
**ProTip™:** You can use dots to signify class names (Ex:
|
|
1340
|
+
**ProTip™:** You can use dots to signify class names (Ex: `div.class_name`) as a simplified version of `div[class="class_name"]` within a CSS selector.
|
|
1331
1341
|
|
|
1332
|
-
You can also use
|
|
1342
|
+
You can also use `*=` to search for any partial value in a CSS selector as shown below:
|
|
1333
1343
|
|
|
1334
1344
|
```python
|
|
1335
1345
|
self.click('a[name*="partial_name"]')
|
|
@@ -1342,7 +1352,7 @@ self.assert_text("Make it so!", "div#trek div.picard div.quotes")
|
|
|
1342
1352
|
self.assert_text("Tea. Earl Grey. Hot.", "div#trek div.picard div.quotes", timeout=3)
|
|
1343
1353
|
```
|
|
1344
1354
|
|
|
1345
|
-
(NOTE:
|
|
1355
|
+
(NOTE: `self.find_text(TEXT, ELEMENT)` and `self.wait_for_text(TEXT, ELEMENT)` also do this. For backwards compatibility, older method names were kept, but the default timeout may be different.)
|
|
1346
1356
|
|
|
1347
1357
|
🔵 **Asserting Anything:**
|
|
1348
1358
|
|
|
@@ -1356,14 +1366,14 @@ self.assert_equal(var1, var2)
|
|
|
1356
1366
|
|
|
1357
1367
|
🔵 **Useful Conditional Statements: (with creative examples)**
|
|
1358
1368
|
|
|
1359
|
-
❓
|
|
1369
|
+
❓ `is_element_visible(selector):` (visible on the page)
|
|
1360
1370
|
|
|
1361
1371
|
```python
|
|
1362
1372
|
if self.is_element_visible('div#warning'):
|
|
1363
1373
|
print("Red Alert: Something bad might be happening!")
|
|
1364
1374
|
```
|
|
1365
1375
|
|
|
1366
|
-
❓
|
|
1376
|
+
❓ `is_element_present(selector):` (present in the HTML)
|
|
1367
1377
|
|
|
1368
1378
|
```python
|
|
1369
1379
|
if self.is_element_present('div#top_secret img.tracking_cookie'):
|
|
@@ -1380,7 +1390,7 @@ def is_there_a_cloaked_klingon_ship_on_this_page():
|
|
|
1380
1390
|
return False
|
|
1381
1391
|
```
|
|
1382
1392
|
|
|
1383
|
-
❓
|
|
1393
|
+
❓ `is_text_visible(text, selector):` (text visible on element)
|
|
1384
1394
|
|
|
1385
1395
|
```python
|
|
1386
1396
|
if self.is_text_visible("You Shall Not Pass!", "h1"):
|
|
@@ -1420,7 +1430,7 @@ def get_mirror_universe_captain_picard_superbowl_ad(superbowl_year):
|
|
|
1420
1430
|
|
|
1421
1431
|
</details>
|
|
1422
1432
|
|
|
1423
|
-
❓
|
|
1433
|
+
❓ `is_link_text_visible(link_text):`
|
|
1424
1434
|
|
|
1425
1435
|
```python
|
|
1426
1436
|
if self.is_link_text_visible("Stop! Hammer time!"):
|
|
@@ -1445,7 +1455,7 @@ self.switch_to_frame("iframe")
|
|
|
1445
1455
|
self.switch_to_parent_frame() # Exit the current iframe
|
|
1446
1456
|
```
|
|
1447
1457
|
|
|
1448
|
-
To exit from multiple iframes, use
|
|
1458
|
+
To exit from multiple iframes, use `self.switch_to_default_content()`. (If inside a single iframe, this has the same effect as `self.switch_to_parent_frame()`.)
|
|
1449
1459
|
|
|
1450
1460
|
```python
|
|
1451
1461
|
self.switch_to_frame('iframe[name="frame1"]')
|
|
@@ -1518,7 +1528,7 @@ self.execute_script("return jQuery('textarea')[2].value") # Returns the css "va
|
|
|
1518
1528
|
|
|
1519
1529
|
<h3>🔵 How to handle a restrictive CSP:</h3>
|
|
1520
1530
|
|
|
1521
|
-
❗ 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
|
|
1531
|
+
❗ 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.
|
|
1522
1532
|
|
|
1523
1533
|
<h3>🔵 More JavaScript fun:</h3>
|
|
1524
1534
|
|