seleniumbase 4.45.6__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.6 → seleniumbase-4.45.12}/LICENSE +1 -1
- {seleniumbase-4.45.6/seleniumbase.egg-info → seleniumbase-4.45.12}/PKG-INFO +72 -61
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/README.md +62 -53
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/requirements.txt +6 -5
- seleniumbase-4.45.12/seleniumbase/__version__.py +2 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/run.py +1 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_install.py +9 -1
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkdir.py +70 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/browser_launcher.py +40 -16
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/sb_cdp.py +109 -25
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/base_case.py +43 -1
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/js_utils.py +6 -2
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/browser.py +79 -28
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/cdp_util.py +31 -6
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/config.py +0 -1
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/connection.py +16 -7
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/element.py +17 -8
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/tab.py +35 -2
- {seleniumbase-4.45.6 → seleniumbase-4.45.12/seleniumbase.egg-info}/PKG-INFO +72 -61
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/requires.txt +13 -7
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/setup.py +9 -7
- seleniumbase-4.45.6/seleniumbase/__version__.py +0 -2
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/.gitignore +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/MANIFEST.in +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/install.sh +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/pyproject.toml +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/pytest.ini +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/sbase/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/sbase/__main__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/sbase/steps.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/setup.cfg +0 -0
- {seleniumbase-4.45.6 → seleniumbase-4.45.12}/virtualenv_install.sh +0 -0
|
@@ -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
|
|
@@ -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
|
|
@@ -351,7 +353,7 @@ class MyTestClass(BaseCase):
|
|
|
351
353
|
|
|
352
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>
|
|
353
355
|
|
|
354
|
-
> (The default browser is
|
|
356
|
+
> (The default browser is `--chrome` if not set.)
|
|
355
357
|
|
|
356
358
|
--------
|
|
357
359
|
|
|
@@ -515,18 +517,18 @@ finally:
|
|
|
515
517
|
<a id="install_seleniumbase"></a>
|
|
516
518
|
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Install SeleniumBase:</h2>
|
|
517
519
|
|
|
518
|
-
**You can install
|
|
520
|
+
**You can install `seleniumbase` from [PyPI](https://pypi.org/project/seleniumbase/) or [GitHub](https://github.com/seleniumbase/SeleniumBase):**
|
|
519
521
|
|
|
520
|
-
🔵 **How to install
|
|
522
|
+
🔵 **How to install `seleniumbase` from PyPI:**
|
|
521
523
|
|
|
522
524
|
```zsh
|
|
523
525
|
pip install seleniumbase
|
|
524
526
|
```
|
|
525
527
|
|
|
526
|
-
* (Add
|
|
527
|
-
* (Add
|
|
528
|
+
* (Add `--upgrade` OR `-U` to upgrade SeleniumBase.)
|
|
529
|
+
* (Add `--force-reinstall` to upgrade indirect packages.)
|
|
528
530
|
|
|
529
|
-
🔵 **How to install
|
|
531
|
+
🔵 **How to install `seleniumbase` from a GitHub clone:**
|
|
530
532
|
|
|
531
533
|
```zsh
|
|
532
534
|
git clone https://github.com/seleniumbase/SeleniumBase.git
|
|
@@ -541,7 +543,7 @@ git pull
|
|
|
541
543
|
pip install -e .
|
|
542
544
|
```
|
|
543
545
|
|
|
544
|
-
🔵 **Type
|
|
546
|
+
🔵 **Type `seleniumbase` or `sbase` to verify that SeleniumBase was installed successfully:**
|
|
545
547
|
|
|
546
548
|
```zsh
|
|
547
549
|
___ _ _ ___
|
|
@@ -591,7 +593,7 @@ pip install -e .
|
|
|
591
593
|
|
|
592
594
|
<h3>🔵 Downloading webdrivers:</h3>
|
|
593
595
|
|
|
594
|
-
✅ SeleniumBase automatically downloads webdrivers as needed, such as
|
|
596
|
+
✅ SeleniumBase automatically downloads webdrivers as needed, such as `chromedriver`.
|
|
595
597
|
|
|
596
598
|
<div></div>
|
|
597
599
|
<details>
|
|
@@ -724,7 +726,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
|
|
|
724
726
|
self.type("input", "dogs\n") # (The "\n" presses ENTER)
|
|
725
727
|
```
|
|
726
728
|
|
|
727
|
-
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>.
|
|
728
730
|
|
|
729
731
|
```zsh
|
|
730
732
|
pytest coffee_cart_tests.py --rs
|
|
@@ -743,10 +745,10 @@ behave calculator.feature -D rs -D dashboard
|
|
|
743
745
|
|
|
744
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>
|
|
745
747
|
|
|
746
|
-
* Python files that start with
|
|
747
|
-
* Python methods that start with
|
|
748
|
+
* Python files that start with `test_` or end with `_test.py`.
|
|
749
|
+
* Python methods that start with `test_`.
|
|
748
750
|
|
|
749
|
-
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.
|
|
750
752
|
|
|
751
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>
|
|
752
754
|
|
|
@@ -788,7 +790,7 @@ pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
|
|
|
788
790
|
pytest my_first_test.py --demo
|
|
789
791
|
```
|
|
790
792
|
|
|
791
|
-
🔵
|
|
793
|
+
🔵 `time.sleep(seconds)` can be used to make a test wait at a specific spot:
|
|
792
794
|
|
|
793
795
|
```python
|
|
794
796
|
import time; time.sleep(3) # Do nothing for 3 seconds.
|
|
@@ -802,15 +804,15 @@ import pytest; pytest.set_trace()
|
|
|
802
804
|
breakpoint() # Shortcut for "import pdb; pdb.set_trace()"
|
|
803
805
|
```
|
|
804
806
|
|
|
805
|
-
> (
|
|
807
|
+
> (**`pdb`** commands: `n`, `c`, `s`, `u`, `d` => `next`, `continue`, `step`, `up`, `down`)
|
|
806
808
|
|
|
807
|
-
🔵 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:
|
|
808
810
|
|
|
809
811
|
```zsh
|
|
810
812
|
pytest test_fail.py --pdb
|
|
811
813
|
```
|
|
812
814
|
|
|
813
|
-
🔵 To start tests in Debug Mode, add
|
|
815
|
+
🔵 To start tests in Debug Mode, add **`--trace`** as a `pytest` option:
|
|
814
816
|
|
|
815
817
|
```zsh
|
|
816
818
|
pytest test_coffee_cart.py --trace
|
|
@@ -955,7 +957,7 @@ pytest test_coffee_cart.py --trace
|
|
|
955
957
|
|
|
956
958
|
--------
|
|
957
959
|
|
|
958
|
-
🔵 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.
|
|
959
961
|
|
|
960
962
|
```zsh
|
|
961
963
|
cd examples/
|
|
@@ -967,18 +969,18 @@ pytest test_suite.py --firefox
|
|
|
967
969
|
|
|
968
970
|
An easy way to override seleniumbase/config/settings.py is by using a custom settings file.
|
|
969
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))
|
|
970
|
-
|
|
972
|
+
`--settings_file=custom_settings.py`
|
|
971
973
|
(Settings include default timeout values, a two-factor auth key, DB credentials, S3 credentials, and other important settings used by tests.)
|
|
972
974
|
|
|
973
|
-
🔵 To pass additional data from the command-line to tests, add
|
|
974
|
-
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.
|
|
975
977
|
|
|
976
978
|
<a id="directory_configuration"></a>
|
|
977
979
|
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Directory Configuration:</h2>
|
|
978
980
|
|
|
979
|
-
🔵 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.
|
|
980
982
|
|
|
981
|
-
🔵
|
|
983
|
+
🔵 `sbase mkdir DIR` creates a folder with config files and sample tests:
|
|
982
984
|
|
|
983
985
|
```zsh
|
|
984
986
|
sbase mkdir ui_tests
|
|
@@ -1010,7 +1012,7 @@ ui_tests/
|
|
|
1010
1012
|
└── swag_labs_test.py
|
|
1011
1013
|
```
|
|
1012
1014
|
|
|
1013
|
-
<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:
|
|
1014
1016
|
|
|
1015
1017
|
```zsh
|
|
1016
1018
|
sbase mkdir ui_tests --basic
|
|
@@ -1026,7 +1028,16 @@ ui_tests/
|
|
|
1026
1028
|
└── setup.cfg
|
|
1027
1029
|
```
|
|
1028
1030
|
|
|
1029
|
-
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
|
+
```
|
|
1030
1041
|
|
|
1031
1042
|
--------
|
|
1032
1043
|
|
|
@@ -1046,20 +1057,20 @@ class MyTestClass(BaseCase):
|
|
|
1046
1057
|
self.assert_element("div#ARMY_OF_ROBOTS", timeout=1) # This should fail
|
|
1047
1058
|
```
|
|
1048
1059
|
|
|
1049
|
-
You can run it from the
|
|
1060
|
+
You can run it from the `examples/` folder like this:
|
|
1050
1061
|
|
|
1051
1062
|
```zsh
|
|
1052
1063
|
pytest test_fail.py
|
|
1053
1064
|
```
|
|
1054
1065
|
|
|
1055
|
-
🔵 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.
|
|
1056
1067
|
|
|
1057
1068
|
--------
|
|
1058
1069
|
|
|
1059
1070
|
<a id="seleniumbase_dashboard"></a>
|
|
1060
1071
|
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> SeleniumBase Dashboard:</h2>
|
|
1061
1072
|
|
|
1062
|
-
🔵 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:
|
|
1063
1074
|
|
|
1064
1075
|
```zsh
|
|
1065
1076
|
pytest --dashboard --rs --headless
|
|
@@ -1067,13 +1078,13 @@ pytest --dashboard --rs --headless
|
|
|
1067
1078
|
|
|
1068
1079
|
<img src="https://seleniumbase.github.io/cdn/img/dashboard_1.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="380" />
|
|
1069
1080
|
|
|
1070
|
-
🔵 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`:
|
|
1071
1082
|
|
|
1072
1083
|
```zsh
|
|
1073
1084
|
python -m http.server 1948
|
|
1074
1085
|
```
|
|
1075
1086
|
|
|
1076
|
-
🔵 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.)
|
|
1077
1088
|
|
|
1078
1089
|
🔵 Here's a full example of what the SeleniumBase Dashboard may look like:
|
|
1079
1090
|
|
|
@@ -1090,7 +1101,7 @@ pytest test_suite.py test_image_saving.py --dashboard --rs --headless
|
|
|
1090
1101
|
|
|
1091
1102
|
<h3>🔵 <code>pytest</code> HTML Reports:</h3>
|
|
1092
1103
|
|
|
1093
|
-
✅ Using
|
|
1104
|
+
✅ Using `--html=report.html` gives you a fancy report of the name specified after your test suite completes.
|
|
1094
1105
|
|
|
1095
1106
|
```zsh
|
|
1096
1107
|
pytest test_suite.py --html=report.html
|
|
@@ -1098,7 +1109,7 @@ pytest test_suite.py --html=report.html
|
|
|
1098
1109
|
|
|
1099
1110
|
<img src="https://seleniumbase.github.io/cdn/img/html_report.png" alt="Example Pytest Report" title="Example Pytest Report" width="520" />
|
|
1100
1111
|
|
|
1101
|
-
✅ 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.
|
|
1102
1113
|
|
|
1103
1114
|
✅ Here's an example of an upgraded html report:
|
|
1104
1115
|
|
|
@@ -1110,7 +1121,7 @@ pytest test_suite.py --dashboard --html=report.html
|
|
|
1110
1121
|
|
|
1111
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/).
|
|
1112
1123
|
|
|
1113
|
-
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.
|
|
1114
1125
|
|
|
1115
1126
|
```zsh
|
|
1116
1127
|
pytest test_suite.py --junit-xml=report.xml
|
|
@@ -1118,7 +1129,7 @@ pytest test_suite.py --junit-xml=report.xml
|
|
|
1118
1129
|
|
|
1119
1130
|
<h3>🔵 <code>pynose</code> Reports:</h3>
|
|
1120
1131
|
|
|
1121
|
-
The
|
|
1132
|
+
The `--report` option gives you a fancy report after your test suite completes.
|
|
1122
1133
|
|
|
1123
1134
|
```zsh
|
|
1124
1135
|
pynose test_suite.py --report
|
|
@@ -1126,7 +1137,7 @@ pynose test_suite.py --report
|
|
|
1126
1137
|
|
|
1127
1138
|
<img src="https://seleniumbase.github.io/cdn/img/nose_report.png" alt="Example pynose Report" title="Example pynose Report" width="320" />
|
|
1128
1139
|
|
|
1129
|
-
(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.)
|
|
1130
1141
|
|
|
1131
1142
|
<h3>🔵 <code>behave</code> Dashboard & Reports:</h3>
|
|
1132
1143
|
|
|
@@ -1138,7 +1149,7 @@ behave behave_bdd/features/ -D dashboard -D headless
|
|
|
1138
1149
|
|
|
1139
1150
|
<img src="https://seleniumbase.github.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="520">
|
|
1140
1151
|
|
|
1141
|
-
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.
|
|
1142
1153
|
|
|
1143
1154
|
```zsh
|
|
1144
1155
|
behave behave_bdd/features/ --junit -D rs -D headless
|
|
@@ -1148,7 +1159,7 @@ behave behave_bdd/features/ --junit -D rs -D headless
|
|
|
1148
1159
|
|
|
1149
1160
|
See: [https://allurereport.org/docs/pytest/](https://allurereport.org/docs/pytest/)
|
|
1150
1161
|
|
|
1151
|
-
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:
|
|
1152
1163
|
|
|
1153
1164
|
```zsh
|
|
1154
1165
|
pip install allure-pytest
|
|
@@ -1164,7 +1175,7 @@ pytest test_suite.py --alluredir=allure_results
|
|
|
1164
1175
|
|
|
1165
1176
|
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Using a Proxy Server:</h3>
|
|
1166
1177
|
|
|
1167
|
-
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.
|
|
1168
1179
|
|
|
1169
1180
|
```zsh
|
|
1170
1181
|
pytest proxy_test.py --proxy=IP_ADDRESS:PORT
|
|
@@ -1184,7 +1195,7 @@ pytest proxy_test.py --proxy="socks4://IP_ADDRESS:PORT"
|
|
|
1184
1195
|
pytest proxy_test.py --proxy="socks5://IP_ADDRESS:PORT"
|
|
1185
1196
|
```
|
|
1186
1197
|
|
|
1187
|
-
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.
|
|
1188
1199
|
|
|
1189
1200
|
```zsh
|
|
1190
1201
|
pytest proxy_test.py --proxy=proxy1
|
|
@@ -1193,7 +1204,7 @@ pytest proxy_test.py --proxy=proxy1
|
|
|
1193
1204
|
|
|
1194
1205
|
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Changing the User-Agent:</h3>
|
|
1195
1206
|
|
|
1196
|
-
🔵 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.
|
|
1197
1208
|
|
|
1198
1209
|
```zsh
|
|
1199
1210
|
pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU"
|
|
@@ -1207,7 +1218,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
|
|
|
1207
1218
|
|
|
1208
1219
|
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Building Guided Tours for Websites:</h3>
|
|
1209
1220
|
|
|
1210
|
-
🔵 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.
|
|
1211
1222
|
|
|
1212
1223
|
|
|
1213
1224
|
<a id="utilizing_advanced_features"></a>
|
|
@@ -1276,7 +1287,7 @@ To click an element on the page:
|
|
|
1276
1287
|
self.click("div#my_id")
|
|
1277
1288
|
```
|
|
1278
1289
|
|
|
1279
|
-
**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.
|
|
1280
1291
|
|
|
1281
1292
|
🔵 **Typing Text:**
|
|
1282
1293
|
|
|
@@ -1306,7 +1317,7 @@ attribute = self.get_attribute("#comic img", "title")
|
|
|
1306
1317
|
self.wait_for_element_present("div.my_class", timeout=10)
|
|
1307
1318
|
```
|
|
1308
1319
|
|
|
1309
|
-
(NOTE: You can also use:
|
|
1320
|
+
(NOTE: You can also use: `self.assert_element_present(ELEMENT)`)
|
|
1310
1321
|
|
|
1311
1322
|
🔵 **Asserting visibility of an element on a page within some number of seconds:**
|
|
1312
1323
|
|
|
@@ -1314,9 +1325,9 @@ self.wait_for_element_present("div.my_class", timeout=10)
|
|
|
1314
1325
|
self.wait_for_element_visible("a.my_class", timeout=5)
|
|
1315
1326
|
```
|
|
1316
1327
|
|
|
1317
|
-
(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.)
|
|
1318
1329
|
|
|
1319
|
-
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:
|
|
1320
1331
|
|
|
1321
1332
|
```python
|
|
1322
1333
|
self.find_element("a.my_class", timeout=5).click()
|
|
@@ -1326,9 +1337,9 @@ self.find_element("a.my_class", timeout=5).click()
|
|
|
1326
1337
|
self.click("a.my_class") # DO IT THIS WAY!
|
|
1327
1338
|
```
|
|
1328
1339
|
|
|
1329
|
-
**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.
|
|
1330
1341
|
|
|
1331
|
-
You can also use
|
|
1342
|
+
You can also use `*=` to search for any partial value in a CSS selector as shown below:
|
|
1332
1343
|
|
|
1333
1344
|
```python
|
|
1334
1345
|
self.click('a[name*="partial_name"]')
|
|
@@ -1341,7 +1352,7 @@ self.assert_text("Make it so!", "div#trek div.picard div.quotes")
|
|
|
1341
1352
|
self.assert_text("Tea. Earl Grey. Hot.", "div#trek div.picard div.quotes", timeout=3)
|
|
1342
1353
|
```
|
|
1343
1354
|
|
|
1344
|
-
(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.)
|
|
1345
1356
|
|
|
1346
1357
|
🔵 **Asserting Anything:**
|
|
1347
1358
|
|
|
@@ -1355,14 +1366,14 @@ self.assert_equal(var1, var2)
|
|
|
1355
1366
|
|
|
1356
1367
|
🔵 **Useful Conditional Statements: (with creative examples)**
|
|
1357
1368
|
|
|
1358
|
-
❓
|
|
1369
|
+
❓ `is_element_visible(selector):` (visible on the page)
|
|
1359
1370
|
|
|
1360
1371
|
```python
|
|
1361
1372
|
if self.is_element_visible('div#warning'):
|
|
1362
1373
|
print("Red Alert: Something bad might be happening!")
|
|
1363
1374
|
```
|
|
1364
1375
|
|
|
1365
|
-
❓
|
|
1376
|
+
❓ `is_element_present(selector):` (present in the HTML)
|
|
1366
1377
|
|
|
1367
1378
|
```python
|
|
1368
1379
|
if self.is_element_present('div#top_secret img.tracking_cookie'):
|
|
@@ -1379,7 +1390,7 @@ def is_there_a_cloaked_klingon_ship_on_this_page():
|
|
|
1379
1390
|
return False
|
|
1380
1391
|
```
|
|
1381
1392
|
|
|
1382
|
-
❓
|
|
1393
|
+
❓ `is_text_visible(text, selector):` (text visible on element)
|
|
1383
1394
|
|
|
1384
1395
|
```python
|
|
1385
1396
|
if self.is_text_visible("You Shall Not Pass!", "h1"):
|
|
@@ -1419,7 +1430,7 @@ def get_mirror_universe_captain_picard_superbowl_ad(superbowl_year):
|
|
|
1419
1430
|
|
|
1420
1431
|
</details>
|
|
1421
1432
|
|
|
1422
|
-
❓
|
|
1433
|
+
❓ `is_link_text_visible(link_text):`
|
|
1423
1434
|
|
|
1424
1435
|
```python
|
|
1425
1436
|
if self.is_link_text_visible("Stop! Hammer time!"):
|
|
@@ -1444,7 +1455,7 @@ self.switch_to_frame("iframe")
|
|
|
1444
1455
|
self.switch_to_parent_frame() # Exit the current iframe
|
|
1445
1456
|
```
|
|
1446
1457
|
|
|
1447
|
-
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()`.)
|
|
1448
1459
|
|
|
1449
1460
|
```python
|
|
1450
1461
|
self.switch_to_frame('iframe[name="frame1"]')
|
|
@@ -1517,7 +1528,7 @@ self.execute_script("return jQuery('textarea')[2].value") # Returns the css "va
|
|
|
1517
1528
|
|
|
1518
1529
|
<h3>🔵 How to handle a restrictive CSP:</h3>
|
|
1519
1530
|
|
|
1520
|
-
❗ 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.
|
|
1521
1532
|
|
|
1522
1533
|
<h3>🔵 More JavaScript fun:</h3>
|
|
1523
1534
|
|