seleniumbase 4.50.1__tar.gz → 4.50.2__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.50.1/seleniumbase.egg-info → seleniumbase-4.50.2}/PKG-INFO +3 -3
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/requirements.txt +2 -2
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/sb_cdp.py +6 -1
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/base_case.py +4 -4
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/browser.py +66 -13
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/cdp_util.py +2 -8
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/config.py +1 -1
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/element.py +25 -11
- {seleniumbase-4.50.1 → seleniumbase-4.50.2/seleniumbase.egg-info}/PKG-INFO +3 -3
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/requires.txt +2 -2
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/setup.py +2 -2
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/.gitignore +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/LICENSE +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/MANIFEST.in +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/README.md +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/install.sh +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/pyproject.toml +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/pytest.ini +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/sbase/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/sbase/__main__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/sbase/steps.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/browser_launcher.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/setup.cfg +0 -0
- {seleniumbase-4.50.1 → seleniumbase-4.50.2}/virtualenv_install.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.50.
|
|
3
|
+
Version: 4.50.2
|
|
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
|
|
@@ -117,7 +117,7 @@ Requires-Dist: iniconfig==2.1.0; python_version < "3.10"
|
|
|
117
117
|
Requires-Dist: iniconfig==2.3.0; python_version >= "3.10"
|
|
118
118
|
Requires-Dist: pluggy==1.6.0
|
|
119
119
|
Requires-Dist: pytest==8.4.2; python_version < "3.11"
|
|
120
|
-
Requires-Dist: pytest==9.1.
|
|
120
|
+
Requires-Dist: pytest==9.1.1; python_version >= "3.11"
|
|
121
121
|
Requires-Dist: pytest-html==4.0.2
|
|
122
122
|
Requires-Dist: pytest-metadata==3.1.1
|
|
123
123
|
Requires-Dist: pytest-ordering==0.6
|
|
@@ -141,7 +141,7 @@ Requires-Dist: allure-python-commons>=2.16.0; extra == "allure"
|
|
|
141
141
|
Requires-Dist: allure-behave>=2.16.0; extra == "allure"
|
|
142
142
|
Provides-Extra: coverage
|
|
143
143
|
Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
|
|
144
|
-
Requires-Dist: coverage>=7.14.
|
|
144
|
+
Requires-Dist: coverage>=7.14.3; python_version >= "3.10" and extra == "coverage"
|
|
145
145
|
Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
|
|
146
146
|
Provides-Extra: flake8
|
|
147
147
|
Requires-Dist: flake8==7.3.0; extra == "flake8"
|
|
@@ -56,7 +56,7 @@ iniconfig==2.1.0;python_version<"3.10"
|
|
|
56
56
|
iniconfig==2.3.0;python_version>="3.10"
|
|
57
57
|
pluggy==1.6.0
|
|
58
58
|
pytest==8.4.2;python_version<"3.11"
|
|
59
|
-
pytest==9.1.
|
|
59
|
+
pytest==9.1.1;python_version>="3.11"
|
|
60
60
|
pytest-html==4.0.2
|
|
61
61
|
pytest-metadata==3.1.1
|
|
62
62
|
pytest-ordering==0.6
|
|
@@ -79,7 +79,7 @@ rich>=15.0.0,<16
|
|
|
79
79
|
# ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
|
|
80
80
|
|
|
81
81
|
coverage>=7.10.7;python_version<"3.10"
|
|
82
|
-
coverage>=7.14.
|
|
82
|
+
coverage>=7.14.3;python_version>="3.10"
|
|
83
83
|
pytest-cov>=7.1.0
|
|
84
84
|
flake8==7.3.0
|
|
85
85
|
mccabe==0.7.0
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.50.
|
|
2
|
+
__version__ = "4.50.2"
|
|
@@ -2163,6 +2163,10 @@ class CDPMethods():
|
|
|
2163
2163
|
self.__slow_mode_pause_if_set()
|
|
2164
2164
|
self.loop.run_until_complete(self.page.wait(0.2))
|
|
2165
2165
|
|
|
2166
|
+
def stop(self):
|
|
2167
|
+
"""Same as quit()"""
|
|
2168
|
+
self.quit()
|
|
2169
|
+
|
|
2166
2170
|
def quit(self):
|
|
2167
2171
|
"""Quit the browser in the Pure CDP Mode Sync format."""
|
|
2168
2172
|
driver = self.driver
|
|
@@ -3544,8 +3548,9 @@ class Chrome(CDPMethods):
|
|
|
3544
3548
|
def __init__(self, url=None, **kwargs):
|
|
3545
3549
|
if not url:
|
|
3546
3550
|
url = "about:blank"
|
|
3547
|
-
driver = cdp_util.start_sync(**kwargs)
|
|
3548
3551
|
loop = asyncio.new_event_loop()
|
|
3552
|
+
kwargs["loop"] = loop
|
|
3553
|
+
driver = cdp_util.start_sync(**kwargs)
|
|
3549
3554
|
page = loop.run_until_complete(driver.get(url))
|
|
3550
3555
|
wait_timeout = 30.0
|
|
3551
3556
|
if hasattr(sb_config, "_cdp_proxy") and sb_config._cdp_proxy:
|
|
@@ -16841,13 +16841,13 @@ class BaseCase(unittest.TestCase):
|
|
|
16841
16841
|
'<thead id="results-table-head">'
|
|
16842
16842
|
'<tr style="background-color: #F7F7FD;">'
|
|
16843
16843
|
'<th style="background-color: #FFF8F8; color: #FF2222;">'
|
|
16844
|
-
'Failed: %s</th>'
|
|
16844
|
+
'Failed: %s </th>'
|
|
16845
16845
|
'<th style="background-color: #FEFEF9; color: #FFA500;">'
|
|
16846
|
-
'Skipped: %s</th>'
|
|
16846
|
+
'Skipped: %s </th>'
|
|
16847
16847
|
'<th style="background-color: #F8FFF8; color: #12A212;">'
|
|
16848
|
-
'Passed: %s</th>'
|
|
16848
|
+
'Passed: %s </th>'
|
|
16849
16849
|
'<th style="background-color: #F9F9F9; color: #8C8C8C;">'
|
|
16850
|
-
'Untested: %s</th>'
|
|
16850
|
+
'Untested: %s </th>'
|
|
16851
16851
|
'<th style="background-color: #F4F4FF; color: #575792;">'
|
|
16852
16852
|
'Total: %s</th>'
|
|
16853
16853
|
"</tr></thead></table>"
|
|
@@ -50,23 +50,29 @@ def deconstruct_browser():
|
|
|
50
50
|
_.config.user_data_dir, ignore_errors=False
|
|
51
51
|
)
|
|
52
52
|
if not os.path.exists(_.config.user_data_dir):
|
|
53
|
+
logger.debug(
|
|
54
|
+
"Temp profile %s was removed."
|
|
55
|
+
% _.config.user_data_dir
|
|
56
|
+
)
|
|
53
57
|
break
|
|
54
58
|
else:
|
|
55
59
|
time.sleep(0.12)
|
|
56
60
|
except FileNotFoundError:
|
|
61
|
+
logger.debug(
|
|
62
|
+
"Temp profile %s was removed." % _.config.user_data_dir
|
|
63
|
+
)
|
|
57
64
|
break
|
|
58
65
|
except (PermissionError, OSError) as e:
|
|
59
66
|
if attempt == max_attempts - 1:
|
|
60
67
|
logger.debug(
|
|
61
|
-
"Problem removing data dir %s
|
|
68
|
+
"Problem removing data dir %s.\n"
|
|
62
69
|
"Consider checking whether it's there "
|
|
63
|
-
"and remove it by hand
|
|
70
|
+
"and remove it by hand.\nError: %s"
|
|
64
71
|
% (_.config.user_data_dir, e)
|
|
65
72
|
)
|
|
66
73
|
break
|
|
67
74
|
time.sleep(0.12)
|
|
68
75
|
continue
|
|
69
|
-
logging.debug("Temp profile %s was removed." % _.config.user_data_dir)
|
|
70
76
|
|
|
71
77
|
|
|
72
78
|
class Browser:
|
|
@@ -940,10 +946,12 @@ class Browser:
|
|
|
940
946
|
logger.debug("Closed the connection using asyncio.run()")
|
|
941
947
|
except Exception:
|
|
942
948
|
pass
|
|
949
|
+
procs = []
|
|
943
950
|
for _ in range(3):
|
|
944
951
|
try:
|
|
945
952
|
if connection_id not in sb_config._closed_connection_ids:
|
|
946
953
|
self._process.terminate()
|
|
954
|
+
procs.append(psutil.Process(self._process.pid))
|
|
947
955
|
logger.debug(
|
|
948
956
|
"Terminated browser with pid %d successfully."
|
|
949
957
|
% self._process.pid
|
|
@@ -955,20 +963,33 @@ class Browser:
|
|
|
955
963
|
except (Exception,):
|
|
956
964
|
try:
|
|
957
965
|
self._process.kill()
|
|
966
|
+
procs.append(psutil.Process(self._process.pid))
|
|
958
967
|
logger.debug(
|
|
959
968
|
"Killed browser with pid %d successfully."
|
|
960
969
|
% self._process.pid
|
|
961
970
|
)
|
|
971
|
+
if connection_id:
|
|
972
|
+
sb_config._closed_connection_ids.append(connection_id)
|
|
973
|
+
close_success = True
|
|
962
974
|
break
|
|
963
975
|
except (Exception,):
|
|
964
976
|
try:
|
|
965
|
-
if hasattr(self, "
|
|
977
|
+
if hasattr(self, "_process_pid") and self._process_pid:
|
|
966
978
|
os.kill(self._process_pid, 15)
|
|
979
|
+
try:
|
|
980
|
+
procs.append(psutil.Process(self._process_pid))
|
|
981
|
+
except Exception:
|
|
982
|
+
pass
|
|
967
983
|
logger.debug(
|
|
968
984
|
"Killed browser with pid %d "
|
|
969
985
|
"using signal 15 successfully."
|
|
970
|
-
% self.
|
|
986
|
+
% self._process_pid
|
|
971
987
|
)
|
|
988
|
+
if connection_id:
|
|
989
|
+
sb_config._closed_connection_ids.append(
|
|
990
|
+
connection_id
|
|
991
|
+
)
|
|
992
|
+
close_success = True
|
|
972
993
|
break
|
|
973
994
|
except (TypeError,):
|
|
974
995
|
logger.info("TypeError", exc_info=True)
|
|
@@ -976,16 +997,33 @@ class Browser:
|
|
|
976
997
|
except (PermissionError,):
|
|
977
998
|
logger.info(
|
|
978
999
|
"Browser already stopped, "
|
|
979
|
-
"or no permission to kill.
|
|
1000
|
+
"or no permission to kill."
|
|
980
1001
|
)
|
|
981
1002
|
pass
|
|
982
1003
|
except (ProcessLookupError,):
|
|
983
1004
|
logger.info("ProcessLookupError")
|
|
984
|
-
|
|
1005
|
+
break
|
|
985
1006
|
except (Exception,):
|
|
986
1007
|
raise
|
|
987
|
-
|
|
988
|
-
|
|
1008
|
+
self._process = None
|
|
1009
|
+
self._process_pid = None
|
|
1010
|
+
if procs:
|
|
1011
|
+
with suppress(Exception):
|
|
1012
|
+
gone, alive = psutil.wait_procs(procs, timeout=0.8)
|
|
1013
|
+
for p in gone:
|
|
1014
|
+
logger.debug("Process has been terminated: %d." % p.pid)
|
|
1015
|
+
for p in alive:
|
|
1016
|
+
logger.debug("Process is still alive: %d." % p.pid)
|
|
1017
|
+
if self.config.user_data_dir and not self.config.uses_custom_data_dir:
|
|
1018
|
+
for _ in range(3):
|
|
1019
|
+
try:
|
|
1020
|
+
time.sleep(0.005)
|
|
1021
|
+
if os.path.exists(self.config.user_data_dir):
|
|
1022
|
+
time.sleep(0.005)
|
|
1023
|
+
shutil.rmtree(self.config.user_data_dir)
|
|
1024
|
+
break
|
|
1025
|
+
except Exception:
|
|
1026
|
+
time.sleep(0.12)
|
|
989
1027
|
if (
|
|
990
1028
|
hasattr(sb_config, "_xvfb_users")
|
|
991
1029
|
and isinstance(sb_config._xvfb_users, int)
|
|
@@ -1025,18 +1063,33 @@ class Browser:
|
|
|
1025
1063
|
def silence_pipe_destruction_errors(unraisable):
|
|
1026
1064
|
exc_type = unraisable.exc_type
|
|
1027
1065
|
exc_value = unraisable.exc_value
|
|
1066
|
+
exc_value_str = str(exc_value) if exc_value else ""
|
|
1028
1067
|
if (
|
|
1029
1068
|
exc_type is ValueError
|
|
1030
|
-
and "I/O operation on closed pipe" in
|
|
1069
|
+
and "I/O operation on closed pipe" in exc_value_str
|
|
1070
|
+
):
|
|
1071
|
+
return
|
|
1072
|
+
if (
|
|
1073
|
+
exc_type is RuntimeError
|
|
1074
|
+
and "Event loop is closed" in exc_value_str
|
|
1031
1075
|
):
|
|
1032
1076
|
return
|
|
1033
1077
|
default_unraisablehook(unraisable)
|
|
1034
1078
|
|
|
1035
1079
|
sys.unraisablehook = silence_pipe_destruction_errors
|
|
1036
1080
|
# Automatically restore Python's default behavior at program exit
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1081
|
+
# (Looks like this isn't needed, but I'm saving it for reference)
|
|
1082
|
+
# atexit.register(
|
|
1083
|
+
# lambda: setattr(
|
|
1084
|
+
# sys, "unraisablehook", default_unraisablehook
|
|
1085
|
+
# )
|
|
1086
|
+
# )
|
|
1087
|
+
|
|
1088
|
+
# Custom user_data_dirs should be saved while temp ones are removed
|
|
1089
|
+
if os.path.exists("%s" % self.config.user_data_dir):
|
|
1090
|
+
logger.debug("%s still exists." % self.config.user_data_dir)
|
|
1091
|
+
else:
|
|
1092
|
+
logger.debug("%s was removed." % self.config.user_data_dir)
|
|
1040
1093
|
|
|
1041
1094
|
def quit(self):
|
|
1042
1095
|
self.stop()
|
|
@@ -764,14 +764,8 @@ async def start_async(*args, **kwargs) -> Browser:
|
|
|
764
764
|
|
|
765
765
|
|
|
766
766
|
def start_sync(*args, **kwargs) -> Browser:
|
|
767
|
-
loop = None
|
|
768
|
-
if (
|
|
769
|
-
"loop" in kwargs
|
|
770
|
-
and kwargs["loop"]
|
|
771
|
-
and hasattr(kwargs["loop"], "create_task")
|
|
772
|
-
):
|
|
773
|
-
loop = kwargs["loop"]
|
|
774
|
-
else:
|
|
767
|
+
loop = kwargs.pop("loop", None)
|
|
768
|
+
if not (loop and hasattr(loop, "create_task")):
|
|
775
769
|
loop = asyncio.new_event_loop()
|
|
776
770
|
return loop.run_until_complete(start(*args, **kwargs))
|
|
777
771
|
|
|
@@ -25,7 +25,7 @@ __all__ = [
|
|
|
25
25
|
]
|
|
26
26
|
|
|
27
27
|
logger = logging.getLogger(__name__)
|
|
28
|
-
is_posix = sys.platform.startswith(("darwin", "cygwin", "linux"
|
|
28
|
+
is_posix = sys.platform.startswith(("darwin", "cygwin", "linux"))
|
|
29
29
|
|
|
30
30
|
PathLike = Union[str, pathlib.Path]
|
|
31
31
|
AUTO = None
|
|
@@ -372,12 +372,17 @@ class Element:
|
|
|
372
372
|
arguments = [cdp.runtime.CallArgument(
|
|
373
373
|
object_id=self._remote_object.object_id
|
|
374
374
|
)]
|
|
375
|
-
|
|
375
|
+
# The next part may be getting detected. Comment-out for now.
|
|
376
|
+
'''script1 = 'sessionStorage.getItem("pxsid") !== null;'
|
|
377
|
+
script2 = 'sessionStorage.getItem("PIM-SESSION-ID") !== null;'
|
|
376
378
|
using_px = True
|
|
379
|
+
using_pim = True
|
|
377
380
|
with suppress(Exception):
|
|
378
|
-
using_px = await self.tab.evaluate(
|
|
379
|
-
|
|
380
|
-
await self.
|
|
381
|
+
using_px = await self.tab.evaluate(script1)
|
|
382
|
+
with suppress(Exception):
|
|
383
|
+
using_pim = await self.tab.evaluate(script2)
|
|
384
|
+
if not using_px and not using_pim:
|
|
385
|
+
await self.flash_async(0.25)'''
|
|
381
386
|
await self._tab.send(
|
|
382
387
|
cdp.runtime.call_function_on(
|
|
383
388
|
"(el) => el.click()",
|
|
@@ -506,12 +511,17 @@ class Element:
|
|
|
506
511
|
logger.warning("Could not calculate box model for %s", self)
|
|
507
512
|
return
|
|
508
513
|
logger.debug("Clicking on location: %.2f, %.2f" % center)
|
|
509
|
-
|
|
514
|
+
# The next part may be getting detected. Comment-out for now.
|
|
515
|
+
'''script1 = 'sessionStorage.getItem("pxsid") !== null;'
|
|
516
|
+
script2 = 'sessionStorage.getItem("PIM-SESSION-ID") !== null;'
|
|
510
517
|
using_px = True
|
|
518
|
+
using_pim = True
|
|
519
|
+
with suppress(Exception):
|
|
520
|
+
using_px = await self.tab.evaluate(script1)
|
|
511
521
|
with suppress(Exception):
|
|
512
|
-
|
|
513
|
-
if not using_px:
|
|
514
|
-
asyncio.create_task(self.flash_async(0.25))
|
|
522
|
+
using_pim = await self.tab.evaluate(script2)
|
|
523
|
+
if not using_px and not using_pim:
|
|
524
|
+
asyncio.create_task(self.flash_async(0.25))'''
|
|
515
525
|
asyncio.create_task(
|
|
516
526
|
self._tab.send(
|
|
517
527
|
cdp.input_.dispatch_mouse_event(
|
|
@@ -570,11 +580,15 @@ class Element:
|
|
|
570
580
|
logger.debug("Clicking on location: %.2f, %.2f" % center_pos)
|
|
571
581
|
else:
|
|
572
582
|
logger.debug("Clicking on location: %.2f, %.2f" % (x_pos, y_pos))
|
|
573
|
-
|
|
583
|
+
script1 = 'sessionStorage.getItem("pxsid") !== null;'
|
|
584
|
+
script2 = 'sessionStorage.getItem("PIM-SESSION-ID") !== null;'
|
|
574
585
|
using_px = True
|
|
586
|
+
using_pim = True
|
|
587
|
+
with suppress(Exception):
|
|
588
|
+
using_px = await self.tab.evaluate(script1)
|
|
575
589
|
with suppress(Exception):
|
|
576
|
-
|
|
577
|
-
if not using_px:
|
|
590
|
+
using_pim = await self.tab.evaluate(script2)
|
|
591
|
+
if not using_px and not using_pim:
|
|
578
592
|
asyncio.create_task(
|
|
579
593
|
self.flash_async(
|
|
580
594
|
x_offset=x_offset - (width / 2),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.50.
|
|
3
|
+
Version: 4.50.2
|
|
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
|
|
@@ -117,7 +117,7 @@ Requires-Dist: iniconfig==2.1.0; python_version < "3.10"
|
|
|
117
117
|
Requires-Dist: iniconfig==2.3.0; python_version >= "3.10"
|
|
118
118
|
Requires-Dist: pluggy==1.6.0
|
|
119
119
|
Requires-Dist: pytest==8.4.2; python_version < "3.11"
|
|
120
|
-
Requires-Dist: pytest==9.1.
|
|
120
|
+
Requires-Dist: pytest==9.1.1; python_version >= "3.11"
|
|
121
121
|
Requires-Dist: pytest-html==4.0.2
|
|
122
122
|
Requires-Dist: pytest-metadata==3.1.1
|
|
123
123
|
Requires-Dist: pytest-ordering==0.6
|
|
@@ -141,7 +141,7 @@ Requires-Dist: allure-python-commons>=2.16.0; extra == "allure"
|
|
|
141
141
|
Requires-Dist: allure-behave>=2.16.0; extra == "allure"
|
|
142
142
|
Provides-Extra: coverage
|
|
143
143
|
Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
|
|
144
|
-
Requires-Dist: coverage>=7.14.
|
|
144
|
+
Requires-Dist: coverage>=7.14.3; python_version >= "3.10" and extra == "coverage"
|
|
145
145
|
Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
|
|
146
146
|
Provides-Extra: flake8
|
|
147
147
|
Requires-Dist: flake8==7.3.0; extra == "flake8"
|
|
@@ -85,7 +85,7 @@ pytest-rerunfailures==16.3
|
|
|
85
85
|
markdown-it-py==4.2.0
|
|
86
86
|
|
|
87
87
|
[:python_version >= "3.11"]
|
|
88
|
-
pytest==9.1.
|
|
88
|
+
pytest==9.1.1
|
|
89
89
|
|
|
90
90
|
[allure]
|
|
91
91
|
allure-pytest>=2.16.0
|
|
@@ -99,7 +99,7 @@ pytest-cov>=7.1.0
|
|
|
99
99
|
coverage>=7.10.7
|
|
100
100
|
|
|
101
101
|
[coverage:python_version >= "3.10"]
|
|
102
|
-
coverage>=7.14.
|
|
102
|
+
coverage>=7.14.3
|
|
103
103
|
|
|
104
104
|
[flake8]
|
|
105
105
|
flake8==7.3.0
|
|
@@ -220,7 +220,7 @@ setup(
|
|
|
220
220
|
'iniconfig==2.3.0;python_version>="3.10"',
|
|
221
221
|
'pluggy==1.6.0',
|
|
222
222
|
'pytest==8.4.2;python_version<"3.11"',
|
|
223
|
-
'pytest==9.1.
|
|
223
|
+
'pytest==9.1.1;python_version>="3.11"',
|
|
224
224
|
'pytest-html==4.0.2', # Newer ones had issues
|
|
225
225
|
'pytest-metadata==3.1.1',
|
|
226
226
|
'pytest-ordering==0.6',
|
|
@@ -252,7 +252,7 @@ setup(
|
|
|
252
252
|
# Usage: coverage run -m pytest; coverage html; coverage report
|
|
253
253
|
"coverage": [
|
|
254
254
|
'coverage>=7.10.7;python_version<"3.10"',
|
|
255
|
-
'coverage>=7.14.
|
|
255
|
+
'coverage>=7.14.3;python_version>="3.10"',
|
|
256
256
|
'pytest-cov>=7.1.0',
|
|
257
257
|
],
|
|
258
258
|
# pip install -e .[flake8]
|
|
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
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.50.1 → seleniumbase-4.50.2}/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.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/_contradict.py
RENAMED
|
File without changes
|
{seleniumbase-4.50.1 → seleniumbase-4.50.2}/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.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid_hub.py
RENAMED
|
File without changes
|
{seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid_node.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat
RENAMED
|
File without changes
|
{seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh
RENAMED
|
File without changes
|
|
File without changes
|
{seleniumbase-4.50.1 → seleniumbase-4.50.2}/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
|