seleniumbase 4.49.9__tar.gz → 4.49.11__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.49.9/seleniumbase.egg-info → seleniumbase-4.49.11}/PKG-INFO +11 -10
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/README.md +8 -7
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/requirements.txt +1 -1
- seleniumbase-4.49.11/seleniumbase/__version__.py +2 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/browser_launcher.py +10 -10
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/sb_cdp.py +47 -10
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/base_case.py +52 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/browser.py +3 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/element.py +9 -3
- {seleniumbase-4.49.9 → seleniumbase-4.49.11/seleniumbase.egg-info}/PKG-INFO +11 -10
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase.egg-info/requires.txt +2 -2
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/setup.py +2 -2
- seleniumbase-4.49.9/seleniumbase/__version__.py +0 -2
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/.gitignore +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/LICENSE +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/MANIFEST.in +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/install.sh +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/pyproject.toml +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/pytest.ini +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/sbase/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/sbase/__main__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/sbase/steps.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/setup.cfg +0 -0
- {seleniumbase-4.49.9 → seleniumbase-4.49.11}/virtualenv_install.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.49.
|
|
3
|
+
Version: 4.49.11
|
|
4
4
|
Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -73,7 +73,7 @@ Requires-Dist: websockets>=16.0; python_version >= "3.10"
|
|
|
73
73
|
Requires-Dist: filelock~=3.19.1; python_version < "3.10"
|
|
74
74
|
Requires-Dist: filelock>=3.29.3; python_version >= "3.10"
|
|
75
75
|
Requires-Dist: fasteners>=0.20
|
|
76
|
-
Requires-Dist: mycdp>=1.
|
|
76
|
+
Requires-Dist: mycdp>=1.4.0
|
|
77
77
|
Requires-Dist: pynose>=1.5.5
|
|
78
78
|
Requires-Dist: platformdirs~=4.4.0; python_version < "3.10"
|
|
79
79
|
Requires-Dist: platformdirs>=4.10.0; python_version >= "3.10"
|
|
@@ -153,7 +153,7 @@ Requires-Dist: mss==10.2.0; extra == "mss"
|
|
|
153
153
|
Provides-Extra: pdfminer
|
|
154
154
|
Requires-Dist: pdfminer.six==20251107; python_version < "3.10" and extra == "pdfminer"
|
|
155
155
|
Requires-Dist: pdfminer.six==20260107; python_version >= "3.10" and extra == "pdfminer"
|
|
156
|
-
Requires-Dist: cryptography==
|
|
156
|
+
Requires-Dist: cryptography==49.0.0; extra == "pdfminer"
|
|
157
157
|
Requires-Dist: cffi==2.0.0; extra == "pdfminer"
|
|
158
158
|
Requires-Dist: pycparser==2.23; python_version < "3.10" and extra == "pdfminer"
|
|
159
159
|
Requires-Dist: pycparser==3.0; python_version >= "3.10" and extra == "pdfminer"
|
|
@@ -187,8 +187,8 @@ Dynamic: summary
|
|
|
187
187
|
<!-- SeleniumBase Docs -->
|
|
188
188
|
|
|
189
189
|
<meta property="og:site_name" content="SeleniumBase">
|
|
190
|
-
<meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation and E2E Testing
|
|
191
|
-
<meta property="og:description" content="Stealthy Chromium Automation and
|
|
190
|
+
<meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation with Python; and E2E Testing." />
|
|
191
|
+
<meta property="og:description" content="Stealthy Chromium Automation, including fast, easy, and reliable Web/UI testing with Python." />
|
|
192
192
|
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots, playwright, stealth, CAPTCHA">
|
|
193
193
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
194
194
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo6.png" />
|
|
@@ -306,8 +306,8 @@ sb.quit()
|
|
|
306
306
|
```python
|
|
307
307
|
from seleniumbase import sb_cdp
|
|
308
308
|
|
|
309
|
-
|
|
310
|
-
sb
|
|
309
|
+
sb = sb_cdp.Chrome()
|
|
310
|
+
sb.goto("https://news.ycombinator.com/submitted?id=seleniumbase")
|
|
311
311
|
elements = sb.find_elements("span.titleline > a")
|
|
312
312
|
for element in elements:
|
|
313
313
|
print("* " + element.text)
|
|
@@ -346,7 +346,7 @@ Google Chrome is the default browser. Only unbranded Chromium and Chrome-for-Tes
|
|
|
346
346
|
The Chromium browser can also be set via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
|
|
347
347
|
|
|
348
348
|
```python
|
|
349
|
-
sb = sb_cdp.Chrome(
|
|
349
|
+
sb = sb_cdp.Chrome(use_chromium=True)
|
|
350
350
|
```
|
|
351
351
|
|
|
352
352
|
--------
|
|
@@ -404,12 +404,13 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
404
404
|
```python
|
|
405
405
|
from seleniumbase import sb_cdp
|
|
406
406
|
|
|
407
|
-
|
|
408
|
-
sb
|
|
407
|
+
sb = sb_cdp.Chrome(incognito=True)
|
|
408
|
+
sb.goto("https://gitlab.com/users/sign_in")
|
|
409
409
|
sb.sleep(2)
|
|
410
410
|
sb.solve_captcha()
|
|
411
411
|
sb.highlight('h1:contains("GitLab")')
|
|
412
412
|
sb.highlight('button:contains("Sign in")')
|
|
413
|
+
sb.quit()
|
|
413
414
|
```
|
|
414
415
|
|
|
415
416
|
--------
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<!-- SeleniumBase Docs -->
|
|
2
2
|
|
|
3
3
|
<meta property="og:site_name" content="SeleniumBase">
|
|
4
|
-
<meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation and E2E Testing
|
|
5
|
-
<meta property="og:description" content="Stealthy Chromium Automation and
|
|
4
|
+
<meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation with Python; and E2E Testing." />
|
|
5
|
+
<meta property="og:description" content="Stealthy Chromium Automation, including fast, easy, and reliable Web/UI testing with Python." />
|
|
6
6
|
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots, playwright, stealth, CAPTCHA">
|
|
7
7
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
8
8
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo6.png" />
|
|
@@ -120,8 +120,8 @@ sb.quit()
|
|
|
120
120
|
```python
|
|
121
121
|
from seleniumbase import sb_cdp
|
|
122
122
|
|
|
123
|
-
|
|
124
|
-
sb
|
|
123
|
+
sb = sb_cdp.Chrome()
|
|
124
|
+
sb.goto("https://news.ycombinator.com/submitted?id=seleniumbase")
|
|
125
125
|
elements = sb.find_elements("span.titleline > a")
|
|
126
126
|
for element in elements:
|
|
127
127
|
print("* " + element.text)
|
|
@@ -160,7 +160,7 @@ Google Chrome is the default browser. Only unbranded Chromium and Chrome-for-Tes
|
|
|
160
160
|
The Chromium browser can also be set via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
|
|
161
161
|
|
|
162
162
|
```python
|
|
163
|
-
sb = sb_cdp.Chrome(
|
|
163
|
+
sb = sb_cdp.Chrome(use_chromium=True)
|
|
164
164
|
```
|
|
165
165
|
|
|
166
166
|
--------
|
|
@@ -218,12 +218,13 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
218
218
|
```python
|
|
219
219
|
from seleniumbase import sb_cdp
|
|
220
220
|
|
|
221
|
-
|
|
222
|
-
sb
|
|
221
|
+
sb = sb_cdp.Chrome(incognito=True)
|
|
222
|
+
sb.goto("https://gitlab.com/users/sign_in")
|
|
223
223
|
sb.sleep(2)
|
|
224
224
|
sb.solve_captcha()
|
|
225
225
|
sb.highlight('h1:contains("GitLab")')
|
|
226
226
|
sb.highlight('button:contains("Sign in")')
|
|
227
|
+
sb.quit()
|
|
227
228
|
```
|
|
228
229
|
|
|
229
230
|
--------
|
|
@@ -12,7 +12,7 @@ websockets>=16.0;python_version>="3.10"
|
|
|
12
12
|
filelock~=3.19.1;python_version<"3.10"
|
|
13
13
|
filelock>=3.29.3;python_version>="3.10"
|
|
14
14
|
fasteners>=0.20
|
|
15
|
-
mycdp>=1.
|
|
15
|
+
mycdp>=1.4.0
|
|
16
16
|
pynose>=1.5.5
|
|
17
17
|
platformdirs~=4.4.0;python_version<"3.10"
|
|
18
18
|
platformdirs>=4.10.0;python_version>="3.10"
|
|
@@ -18,11 +18,7 @@ from selenium.common.exceptions import ElementClickInterceptedException
|
|
|
18
18
|
from selenium.common.exceptions import InvalidSessionIdException
|
|
19
19
|
from selenium.common.exceptions import SessionNotCreatedException
|
|
20
20
|
from selenium.webdriver.chrome.service import Service as ChromeService
|
|
21
|
-
from selenium.webdriver.common
|
|
22
|
-
from selenium.webdriver.common.service import utils as service_utils
|
|
23
|
-
from selenium.webdriver.edge.service import Service as EdgeService
|
|
24
|
-
from selenium.webdriver.firefox.service import Service as FirefoxService
|
|
25
|
-
from selenium.webdriver.safari.service import Service as SafariService
|
|
21
|
+
from selenium.webdriver.common import utils as common_utils
|
|
26
22
|
from seleniumbase import config as sb_config
|
|
27
23
|
from seleniumbase import decorators
|
|
28
24
|
from seleniumbase import drivers # webdriver storage folder for SeleniumBase
|
|
@@ -2674,7 +2670,7 @@ def _set_chrome_options(
|
|
|
2674
2670
|
args = " ".join(sys.argv)
|
|
2675
2671
|
debug_port = 9222
|
|
2676
2672
|
if ("-n" in sys.argv or " -n=" in args or args == "-c"):
|
|
2677
|
-
debug_port =
|
|
2673
|
+
debug_port = common_utils.free_port()
|
|
2678
2674
|
chrome_options.add_argument("--remote-debugging-port=%s" % debug_port)
|
|
2679
2675
|
if swiftshader:
|
|
2680
2676
|
chrome_options.add_argument("--use-gl=angle")
|
|
@@ -3678,6 +3674,7 @@ def get_remote_driver(
|
|
|
3678
3674
|
device_height,
|
|
3679
3675
|
device_pixel_ratio,
|
|
3680
3676
|
):
|
|
3677
|
+
from selenium.webdriver.common.options import ArgOptions
|
|
3681
3678
|
# Construct the address for connecting to a Selenium Grid
|
|
3682
3679
|
if servername.startswith("https://"):
|
|
3683
3680
|
protocol = "https"
|
|
@@ -4136,6 +4133,7 @@ def get_local_driver(
|
|
|
4136
4133
|
b_path = binary_location
|
|
4137
4134
|
use_uc = is_using_uc(undetectable, browser_name)
|
|
4138
4135
|
if browser_name == constants.Browser.FIREFOX:
|
|
4136
|
+
from selenium.webdriver.firefox.service import Service as FFService
|
|
4139
4137
|
firefox_options = _set_firefox_options(
|
|
4140
4138
|
downloads_path,
|
|
4141
4139
|
headless,
|
|
@@ -4190,7 +4188,7 @@ def get_local_driver(
|
|
|
4190
4188
|
sys.argv = sys_args # Put back original sys args
|
|
4191
4189
|
# Launch Firefox
|
|
4192
4190
|
if os.path.exists(local_geckodriver):
|
|
4193
|
-
service =
|
|
4191
|
+
service = FFService(
|
|
4194
4192
|
executable_path=local_geckodriver,
|
|
4195
4193
|
log_output=os.devnull,
|
|
4196
4194
|
)
|
|
@@ -4235,7 +4233,7 @@ def get_local_driver(
|
|
|
4235
4233
|
else:
|
|
4236
4234
|
raise # Not an obvious fix.
|
|
4237
4235
|
else:
|
|
4238
|
-
service =
|
|
4236
|
+
service = FFService(log_output=os.devnull)
|
|
4239
4237
|
try:
|
|
4240
4238
|
driver = webdriver.Firefox(
|
|
4241
4239
|
service=service,
|
|
@@ -4343,6 +4341,7 @@ def get_local_driver(
|
|
|
4343
4341
|
driver = webdriver.Ie(service=service, options=ie_options)
|
|
4344
4342
|
return extend_driver(driver)
|
|
4345
4343
|
elif browser_name == constants.Browser.EDGE:
|
|
4344
|
+
from selenium.webdriver.edge.service import Service as EdgeService
|
|
4346
4345
|
prefs = {
|
|
4347
4346
|
"download.default_directory": downloads_path,
|
|
4348
4347
|
"download.directory_upgrade": True,
|
|
@@ -4762,7 +4761,7 @@ def get_local_driver(
|
|
|
4762
4761
|
args = " ".join(sys.argv)
|
|
4763
4762
|
free_port = 9222
|
|
4764
4763
|
if ("-n" in sys.argv or " -n=" in args or args == "-c"):
|
|
4765
|
-
free_port =
|
|
4764
|
+
free_port = common_utils.free_port()
|
|
4766
4765
|
edge_options.add_argument("--remote-debugging-port=%s" % free_port)
|
|
4767
4766
|
if swiftshader:
|
|
4768
4767
|
edge_options.add_argument("--use-gl=angle")
|
|
@@ -4872,7 +4871,7 @@ def get_local_driver(
|
|
|
4872
4871
|
args = " ".join(sys.argv)
|
|
4873
4872
|
free_port = 9222
|
|
4874
4873
|
if ("-n" in sys.argv or " -n=" in args or args == "-c"):
|
|
4875
|
-
free_port =
|
|
4874
|
+
free_port = common_utils.free_port()
|
|
4876
4875
|
edge_options.add_argument(
|
|
4877
4876
|
"--remote-debugging-port=%s" % free_port
|
|
4878
4877
|
)
|
|
@@ -4910,6 +4909,7 @@ def get_local_driver(
|
|
|
4910
4909
|
raise Exception("Can't run Safari tests in multithreaded mode!")
|
|
4911
4910
|
warnings.simplefilter("ignore", category=DeprecationWarning)
|
|
4912
4911
|
from selenium.webdriver.safari.options import Options as SafariOptions
|
|
4912
|
+
from selenium.webdriver.safari.service import Service as SafariService
|
|
4913
4913
|
service = SafariService(quiet=False)
|
|
4914
4914
|
options = SafariOptions()
|
|
4915
4915
|
if (
|
|
@@ -152,6 +152,17 @@ class CDPMethods():
|
|
|
152
152
|
except Exception:
|
|
153
153
|
pass
|
|
154
154
|
|
|
155
|
+
def activate_cdp_mode(self, url=None, **kwargs):
|
|
156
|
+
"""If calling this method from here, then it was likely done
|
|
157
|
+
by accident because CDP Mode is already active at this point.
|
|
158
|
+
If URL, then navigate there with any kwargs that were passed.
|
|
159
|
+
If no URL (but kwargs are included) then refresh with kwargs.
|
|
160
|
+
If no URL and no kwargs either, then do nothing."""
|
|
161
|
+
if url:
|
|
162
|
+
self.get(url, **kwargs)
|
|
163
|
+
elif kwargs:
|
|
164
|
+
self.get(self.get_current_url(), **kwargs)
|
|
165
|
+
|
|
155
166
|
def open(self, url, **kwargs):
|
|
156
167
|
self.get(url, **kwargs)
|
|
157
168
|
|
|
@@ -1386,10 +1397,15 @@ class CDPMethods():
|
|
|
1386
1397
|
return self.find_element(selector).text_all
|
|
1387
1398
|
|
|
1388
1399
|
def get_title(self):
|
|
1400
|
+
"""Returns the title of the current web page."""
|
|
1389
1401
|
return self.loop.run_until_complete(
|
|
1390
1402
|
self.page.evaluate("document.title")
|
|
1391
1403
|
)
|
|
1392
1404
|
|
|
1405
|
+
def get_page_title(self):
|
|
1406
|
+
"""Same as get_title(), which returns the current page title."""
|
|
1407
|
+
return self.get_title()
|
|
1408
|
+
|
|
1393
1409
|
def get_current_url(self):
|
|
1394
1410
|
return self.loop.run_until_complete(
|
|
1395
1411
|
self.page.evaluate("window.location.href")
|
|
@@ -3322,7 +3338,7 @@ class CDPMethods():
|
|
|
3322
3338
|
def assert_true(self, expression, msg=None):
|
|
3323
3339
|
if not expression:
|
|
3324
3340
|
if not msg:
|
|
3325
|
-
raise AssertionError("%s is not true" % expression)
|
|
3341
|
+
raise AssertionError("%s is not true." % expression)
|
|
3326
3342
|
else:
|
|
3327
3343
|
raise AssertionError(
|
|
3328
3344
|
"%s is not true. (%s)" % (expression, msg)
|
|
@@ -3331,27 +3347,48 @@ class CDPMethods():
|
|
|
3331
3347
|
def assert_false(self, expression, msg=None):
|
|
3332
3348
|
if expression:
|
|
3333
3349
|
if not msg:
|
|
3334
|
-
raise AssertionError("%s is not false" % expression)
|
|
3350
|
+
raise AssertionError("%s is not false." % expression)
|
|
3335
3351
|
else:
|
|
3336
3352
|
raise AssertionError(
|
|
3337
3353
|
"%s is not false. (%s)" % (expression, msg)
|
|
3338
3354
|
)
|
|
3339
3355
|
|
|
3340
|
-
def assert_equal(self, first, second):
|
|
3356
|
+
def assert_equal(self, first, second, msg=None):
|
|
3341
3357
|
if first != second:
|
|
3342
|
-
|
|
3358
|
+
if not msg:
|
|
3359
|
+
raise AssertionError(
|
|
3360
|
+
"%s is not equal to %s." % (first, second)
|
|
3361
|
+
)
|
|
3362
|
+
else:
|
|
3363
|
+
raise AssertionError(
|
|
3364
|
+
"%s is not equal to %s. (%s)" % (first, second, msg))
|
|
3343
3365
|
|
|
3344
|
-
def assert_not_equal(self, first, second):
|
|
3366
|
+
def assert_not_equal(self, first, second, msg=None):
|
|
3345
3367
|
if first == second:
|
|
3346
|
-
|
|
3368
|
+
if not msg:
|
|
3369
|
+
raise AssertionError("%s is equal to %s." % (first, second))
|
|
3370
|
+
else:
|
|
3371
|
+
raise AssertionError(
|
|
3372
|
+
"%s is equal to %s. (%s)" % (first, second, msg)
|
|
3373
|
+
)
|
|
3347
3374
|
|
|
3348
|
-
def assert_in(self, first, second):
|
|
3375
|
+
def assert_in(self, first, second, msg=None):
|
|
3349
3376
|
if first not in second:
|
|
3350
|
-
|
|
3377
|
+
if not msg:
|
|
3378
|
+
raise AssertionError("%s is not in %s." % (first, second))
|
|
3379
|
+
else:
|
|
3380
|
+
raise AssertionError(
|
|
3381
|
+
"%s is not in %s. (%s)" % (first, second, msg)
|
|
3382
|
+
)
|
|
3351
3383
|
|
|
3352
|
-
def assert_not_in(self, first, second):
|
|
3384
|
+
def assert_not_in(self, first, second, msg=None):
|
|
3353
3385
|
if first in second:
|
|
3354
|
-
|
|
3386
|
+
if not msg:
|
|
3387
|
+
raise AssertionError("%s is in %s." % (first, second))
|
|
3388
|
+
else:
|
|
3389
|
+
raise AssertionError(
|
|
3390
|
+
"%s is in %s. (%s)" % (first, second, msg)
|
|
3391
|
+
)
|
|
3355
3392
|
|
|
3356
3393
|
def js_scroll_into_view(self, selector):
|
|
3357
3394
|
css_selector = self.__convert_to_css_if_xpath(selector)
|
|
@@ -5101,16 +5101,48 @@ class BaseCase(unittest.TestCase):
|
|
|
5101
5101
|
self.close_active_tab = self.cdp.close_active_tab
|
|
5102
5102
|
if hasattr(self.cdp, "find_element_by_text"):
|
|
5103
5103
|
self.find_element_by_text = self.cdp.find_element_by_text
|
|
5104
|
+
if hasattr(self.cdp, "find_elements_by_text"):
|
|
5105
|
+
self.find_elements_by_text = self.cdp.find_elements_by_text
|
|
5104
5106
|
if hasattr(self.cdp, "get_active_tab"):
|
|
5105
5107
|
self.get_active_tab = self.cdp.get_active_tab
|
|
5108
|
+
if hasattr(self.cdp, "get_all_cookies"):
|
|
5109
|
+
self.get_all_cookies = self.cdp.get_all_cookies
|
|
5106
5110
|
if hasattr(self.cdp, "get_all_urls"):
|
|
5107
5111
|
self.get_all_urls = self.cdp.get_all_urls
|
|
5112
|
+
if hasattr(self.cdp, "get_document"):
|
|
5113
|
+
self.get_document = self.cdp.get_document
|
|
5114
|
+
if hasattr(self.cdp, "get_element_attribute"):
|
|
5115
|
+
self.get_element_attribute = self.cdp.get_element_attribute
|
|
5116
|
+
if hasattr(self.cdp, "get_element_attributes"):
|
|
5117
|
+
self.get_element_attributes = self.cdp.get_element_attributes
|
|
5118
|
+
if hasattr(self.cdp, "get_element_html"):
|
|
5119
|
+
self.get_element_html = self.cdp.get_element_html
|
|
5108
5120
|
if hasattr(self.cdp, "get_endpoint_url"):
|
|
5109
5121
|
self.get_endpoint_url = self.cdp.get_endpoint_url
|
|
5110
5122
|
if hasattr(self.cdp, "get_event_loop"):
|
|
5111
5123
|
self.get_event_loop = self.cdp.get_event_loop
|
|
5124
|
+
if hasattr(self.cdp, "get_flattened_document"):
|
|
5125
|
+
self.get_flattened_document = self.cdp.get_flattened_document
|
|
5126
|
+
if hasattr(self.cdp, "get_navigation_history"):
|
|
5127
|
+
self.get_navigation_history = self.cdp.get_navigation_history
|
|
5128
|
+
if hasattr(self.cdp, "get_nested_element"):
|
|
5129
|
+
self.get_nested_element = self.cdp.get_nested_element
|
|
5130
|
+
if hasattr(self.cdp, "get_port"):
|
|
5131
|
+
self.get_port = self.cdp.get_port
|
|
5132
|
+
if hasattr(self.cdp, "get_rd_host"):
|
|
5133
|
+
self.get_rd_host = self.cdp.get_rd_host
|
|
5134
|
+
if hasattr(self.cdp, "get_rd_port"):
|
|
5135
|
+
self.get_rd_port = self.cdp.get_rd_port
|
|
5136
|
+
if hasattr(self.cdp, "get_rd_url"):
|
|
5137
|
+
self.get_rd_url = self.cdp.get_rd_url
|
|
5112
5138
|
if hasattr(self.cdp, "get_tabs"):
|
|
5113
5139
|
self.get_tabs = self.cdp.get_tabs
|
|
5140
|
+
if hasattr(self.cdp, "get_websocket_url"):
|
|
5141
|
+
self.get_websocket_url = self.cdp.get_websocket_url
|
|
5142
|
+
if hasattr(self.cdp, "grant_all_permissions"):
|
|
5143
|
+
self.grant_all_permissions = self.cdp.grant_all_permissions
|
|
5144
|
+
if hasattr(self.cdp, "grant_permissions"):
|
|
5145
|
+
self.grant_permissions = self.cdp.grant_permissions
|
|
5114
5146
|
if hasattr(self.cdp, "gui_click_and_hold"):
|
|
5115
5147
|
self.gui_click_and_hold = self.cdp.gui_click_and_hold
|
|
5116
5148
|
if hasattr(self.cdp, "gui_click_element"):
|
|
@@ -5121,6 +5153,26 @@ class BaseCase(unittest.TestCase):
|
|
|
5121
5153
|
self.gui_drag_drop_points = self.cdp.gui_drag_drop_points
|
|
5122
5154
|
if hasattr(self.cdp, "highlight_overlay"):
|
|
5123
5155
|
self.highlight_overlay = self.cdp.highlight_overlay
|
|
5156
|
+
if hasattr(self.cdp, "js_dumps"):
|
|
5157
|
+
self.js_dumps = self.cdp.js_dumps
|
|
5158
|
+
if hasattr(self.cdp, "js_scroll_into_view"):
|
|
5159
|
+
self.js_scroll_into_view = self.cdp.js_scroll_into_view
|
|
5160
|
+
if hasattr(self.cdp, "medimize"):
|
|
5161
|
+
self.medimize = self.cdp.medimize
|
|
5162
|
+
if hasattr(self.cdp, "mouse_click"):
|
|
5163
|
+
self.mouse_click = self.cdp.mouse_click
|
|
5164
|
+
if hasattr(self.cdp, "nested_click"):
|
|
5165
|
+
self.nested_click = self.cdp.nested_click
|
|
5166
|
+
if hasattr(self.cdp, "remove_from_dom"):
|
|
5167
|
+
self.remove_from_dom = self.cdp.remove_from_dom
|
|
5168
|
+
if hasattr(self.cdp, "reset_permissions"):
|
|
5169
|
+
self.reset_permissions = self.cdp.reset_permissions
|
|
5170
|
+
if hasattr(self.cdp, "set_all_cookies"):
|
|
5171
|
+
self.set_all_cookies = self.cdp.set_all_cookies
|
|
5172
|
+
if hasattr(self.cdp, "tile_windows"):
|
|
5173
|
+
self.tile_windows = self.cdp.tile_windows
|
|
5174
|
+
if hasattr(self.cdp, "get_window"):
|
|
5175
|
+
self.get_window = self.cdp.get_window
|
|
5124
5176
|
if getattr(self.driver, "_is_using_auth", None):
|
|
5125
5177
|
with suppress(Exception):
|
|
5126
5178
|
self.cdp.loop.run_until_complete(self.cdp.page.wait(0.25))
|
|
@@ -373,7 +373,9 @@ class Element:
|
|
|
373
373
|
object_id=self._remote_object.object_id
|
|
374
374
|
)]
|
|
375
375
|
script = 'sessionStorage.getItem("pxsid") !== null;'
|
|
376
|
-
using_px =
|
|
376
|
+
using_px = True
|
|
377
|
+
with suppress(Exception):
|
|
378
|
+
using_px = await self.tab.evaluate(script)
|
|
377
379
|
if not using_px:
|
|
378
380
|
await self.flash_async(0.25)
|
|
379
381
|
await self._tab.send(
|
|
@@ -505,7 +507,9 @@ class Element:
|
|
|
505
507
|
return
|
|
506
508
|
logger.debug("Clicking on location: %.2f, %.2f" % center)
|
|
507
509
|
script = 'sessionStorage.getItem("pxsid") !== null;'
|
|
508
|
-
using_px =
|
|
510
|
+
using_px = True
|
|
511
|
+
with suppress(Exception):
|
|
512
|
+
using_px = await self.tab.evaluate(script)
|
|
509
513
|
if not using_px:
|
|
510
514
|
asyncio.create_task(self.flash_async(0.25))
|
|
511
515
|
asyncio.create_task(
|
|
@@ -567,7 +571,9 @@ class Element:
|
|
|
567
571
|
else:
|
|
568
572
|
logger.debug("Clicking on location: %.2f, %.2f" % (x_pos, y_pos))
|
|
569
573
|
script = 'sessionStorage.getItem("pxsid") !== null;'
|
|
570
|
-
using_px =
|
|
574
|
+
using_px = True
|
|
575
|
+
with suppress(Exception):
|
|
576
|
+
using_px = await self.tab.evaluate(script)
|
|
571
577
|
if not using_px:
|
|
572
578
|
asyncio.create_task(
|
|
573
579
|
self.flash_async(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.49.
|
|
3
|
+
Version: 4.49.11
|
|
4
4
|
Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -73,7 +73,7 @@ Requires-Dist: websockets>=16.0; python_version >= "3.10"
|
|
|
73
73
|
Requires-Dist: filelock~=3.19.1; python_version < "3.10"
|
|
74
74
|
Requires-Dist: filelock>=3.29.3; python_version >= "3.10"
|
|
75
75
|
Requires-Dist: fasteners>=0.20
|
|
76
|
-
Requires-Dist: mycdp>=1.
|
|
76
|
+
Requires-Dist: mycdp>=1.4.0
|
|
77
77
|
Requires-Dist: pynose>=1.5.5
|
|
78
78
|
Requires-Dist: platformdirs~=4.4.0; python_version < "3.10"
|
|
79
79
|
Requires-Dist: platformdirs>=4.10.0; python_version >= "3.10"
|
|
@@ -153,7 +153,7 @@ Requires-Dist: mss==10.2.0; extra == "mss"
|
|
|
153
153
|
Provides-Extra: pdfminer
|
|
154
154
|
Requires-Dist: pdfminer.six==20251107; python_version < "3.10" and extra == "pdfminer"
|
|
155
155
|
Requires-Dist: pdfminer.six==20260107; python_version >= "3.10" and extra == "pdfminer"
|
|
156
|
-
Requires-Dist: cryptography==
|
|
156
|
+
Requires-Dist: cryptography==49.0.0; extra == "pdfminer"
|
|
157
157
|
Requires-Dist: cffi==2.0.0; extra == "pdfminer"
|
|
158
158
|
Requires-Dist: pycparser==2.23; python_version < "3.10" and extra == "pdfminer"
|
|
159
159
|
Requires-Dist: pycparser==3.0; python_version >= "3.10" and extra == "pdfminer"
|
|
@@ -187,8 +187,8 @@ Dynamic: summary
|
|
|
187
187
|
<!-- SeleniumBase Docs -->
|
|
188
188
|
|
|
189
189
|
<meta property="og:site_name" content="SeleniumBase">
|
|
190
|
-
<meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation and E2E Testing
|
|
191
|
-
<meta property="og:description" content="Stealthy Chromium Automation and
|
|
190
|
+
<meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation with Python; and E2E Testing." />
|
|
191
|
+
<meta property="og:description" content="Stealthy Chromium Automation, including fast, easy, and reliable Web/UI testing with Python." />
|
|
192
192
|
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots, playwright, stealth, CAPTCHA">
|
|
193
193
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
194
194
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo6.png" />
|
|
@@ -306,8 +306,8 @@ sb.quit()
|
|
|
306
306
|
```python
|
|
307
307
|
from seleniumbase import sb_cdp
|
|
308
308
|
|
|
309
|
-
|
|
310
|
-
sb
|
|
309
|
+
sb = sb_cdp.Chrome()
|
|
310
|
+
sb.goto("https://news.ycombinator.com/submitted?id=seleniumbase")
|
|
311
311
|
elements = sb.find_elements("span.titleline > a")
|
|
312
312
|
for element in elements:
|
|
313
313
|
print("* " + element.text)
|
|
@@ -346,7 +346,7 @@ Google Chrome is the default browser. Only unbranded Chromium and Chrome-for-Tes
|
|
|
346
346
|
The Chromium browser can also be set via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
|
|
347
347
|
|
|
348
348
|
```python
|
|
349
|
-
sb = sb_cdp.Chrome(
|
|
349
|
+
sb = sb_cdp.Chrome(use_chromium=True)
|
|
350
350
|
```
|
|
351
351
|
|
|
352
352
|
--------
|
|
@@ -404,12 +404,13 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
404
404
|
```python
|
|
405
405
|
from seleniumbase import sb_cdp
|
|
406
406
|
|
|
407
|
-
|
|
408
|
-
sb
|
|
407
|
+
sb = sb_cdp.Chrome(incognito=True)
|
|
408
|
+
sb.goto("https://gitlab.com/users/sign_in")
|
|
409
409
|
sb.sleep(2)
|
|
410
410
|
sb.solve_captcha()
|
|
411
411
|
sb.highlight('h1:contains("GitLab")')
|
|
412
412
|
sb.highlight('button:contains("Sign in")')
|
|
413
|
+
sb.quit()
|
|
413
414
|
```
|
|
414
415
|
|
|
415
416
|
--------
|
|
@@ -4,7 +4,7 @@ attrs>=26.1.0
|
|
|
4
4
|
certifi>=2026.5.20
|
|
5
5
|
exceptiongroup>=1.3.1
|
|
6
6
|
fasteners>=0.20
|
|
7
|
-
mycdp>=1.
|
|
7
|
+
mycdp>=1.4.0
|
|
8
8
|
pynose>=1.5.5
|
|
9
9
|
typing-extensions>=4.15.0
|
|
10
10
|
sbvirtualdisplay>=1.4.0
|
|
@@ -111,7 +111,7 @@ pycodestyle==2.14.0
|
|
|
111
111
|
mss==10.2.0
|
|
112
112
|
|
|
113
113
|
[pdfminer]
|
|
114
|
-
cryptography==
|
|
114
|
+
cryptography==49.0.0
|
|
115
115
|
cffi==2.0.0
|
|
116
116
|
|
|
117
117
|
[pdfminer:python_version < "3.10"]
|
|
@@ -176,7 +176,7 @@ setup(
|
|
|
176
176
|
'filelock~=3.19.1;python_version<"3.10"',
|
|
177
177
|
'filelock>=3.29.3;python_version>="3.10"',
|
|
178
178
|
'fasteners>=0.20',
|
|
179
|
-
'mycdp>=1.
|
|
179
|
+
'mycdp>=1.4.0',
|
|
180
180
|
'pynose>=1.5.5',
|
|
181
181
|
'platformdirs~=4.4.0;python_version<"3.10"',
|
|
182
182
|
'platformdirs>=4.10.0;python_version>="3.10"',
|
|
@@ -273,7 +273,7 @@ setup(
|
|
|
273
273
|
"pdfminer": [
|
|
274
274
|
'pdfminer.six==20251107;python_version<"3.10"',
|
|
275
275
|
'pdfminer.six==20260107;python_version>="3.10"',
|
|
276
|
-
'cryptography==
|
|
276
|
+
'cryptography==49.0.0',
|
|
277
277
|
'cffi==2.0.0',
|
|
278
278
|
'pycparser==2.23;python_version<"3.10"',
|
|
279
279
|
'pycparser==3.0;python_version>="3.10"',
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/drivers/chromium_drivers/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/_contradict.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/undetected/cdp_driver/connection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/font_color
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/grid_hub.py
RENAMED
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/grid_node.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat
RENAMED
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh
RENAMED
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_ide/__init__.py
RENAMED
|
File without changes
|
{seleniumbase-4.49.9 → seleniumbase-4.49.11}/seleniumbase/utilities/selenium_ide/convert_ide.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|