seleniumbase 4.57.1__tar.gz → 4.58.0__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.
Files changed (164) hide show
  1. {seleniumbase-4.57.1/seleniumbase.egg-info → seleniumbase-4.58.0}/PKG-INFO +42 -31
  2. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/README.md +33 -20
  3. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/requirements.txt +6 -6
  4. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/browser_launcher.py +35 -28
  6. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/sb_cdp.py +20 -4
  7. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/base_case.py +22 -1
  8. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/shared_utils.py +20 -1
  9. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/driver_manager.py +8 -0
  10. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/pytest_plugin.py +16 -0
  11. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/sb_manager.py +9 -1
  12. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/selenium_plugin.py +16 -0
  13. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/browser.py +3 -0
  14. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/cdp_util.py +11 -3
  15. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/config.py +16 -2
  16. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/element.py +93 -50
  17. {seleniumbase-4.57.1 → seleniumbase-4.58.0/seleniumbase.egg-info}/PKG-INFO +42 -31
  18. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/requires.txt +8 -14
  19. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/setup.py +8 -10
  20. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/.gitignore +0 -0
  21. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/LICENSE +0 -0
  22. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/MANIFEST.in +0 -0
  23. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/install.sh +0 -0
  24. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/mcp_servers/__init__.py +0 -0
  25. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/mcp_servers/server.py +0 -0
  26. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/pyproject.toml +0 -0
  27. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/pytest.ini +0 -0
  28. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/sbase/__init__.py +0 -0
  29. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/sbase/__main__.py +0 -0
  30. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/sbase/steps.py +0 -0
  31. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/__init__.py +0 -0
  32. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/__main__.py +0 -0
  33. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/behave/__init__.py +0 -0
  34. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/behave/behave_helper.py +0 -0
  35. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/behave/behave_sb.py +0 -0
  36. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/behave/steps.py +0 -0
  37. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/__init__.py +0 -0
  38. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/decorators.py +0 -0
  39. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/encryption.py +0 -0
  40. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/exceptions.py +0 -0
  41. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/obfuscate.py +0 -0
  42. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/unobfuscate.py +0 -0
  43. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/config/__init__.py +0 -0
  44. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/config/ad_block_list.py +0 -0
  45. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/config/proxy_list.py +0 -0
  46. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/config/settings.py +0 -0
  47. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/__init__.py +0 -0
  48. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/logo_helper.py +0 -0
  49. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/rich_helper.py +0 -0
  50. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/run.py +0 -0
  51. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  52. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  53. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_commander.py +0 -0
  54. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_install.py +0 -0
  55. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  56. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  57. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  58. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  59. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  60. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  61. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_print.py +0 -0
  62. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  63. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/__init__.py +0 -0
  64. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/application_manager.py +0 -0
  65. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/capabilities_parser.py +0 -0
  66. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/colored_traceback.py +0 -0
  67. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/create_db_tables.sql +0 -0
  68. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/detect_b_ver.py +0 -0
  69. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/download_helper.py +0 -0
  70. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/encoded_images.py +0 -0
  71. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/jqc_helper.py +0 -0
  72. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/log_helper.py +0 -0
  73. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/mysql.py +0 -0
  74. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/nest_asyncio.py +0 -0
  75. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/proxy_helper.py +0 -0
  76. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/recorder_helper.py +0 -0
  77. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/report_helper.py +0 -0
  78. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/s3_manager.py +0 -0
  79. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/sb_driver.py +0 -0
  80. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/session_helper.py +0 -0
  81. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/settings_parser.py +0 -0
  82. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/style_sheet.py +0 -0
  83. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/testcase_manager.py +0 -0
  84. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/tour_helper.py +0 -0
  85. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/visual_helper.py +0 -0
  86. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/__init__.py +0 -0
  87. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  88. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  89. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  90. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  91. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  92. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  93. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/__init__.py +0 -0
  94. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/ad_block.zip +0 -0
  95. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/disable_csp.zip +0 -0
  96. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/recorder.zip +0 -0
  97. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/sbase_ext.zip +0 -0
  98. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/__init__.py +0 -0
  99. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/constants.py +0 -0
  100. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  101. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/errors.py +0 -0
  102. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/js_utils.py +0 -0
  103. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/page_actions.py +0 -0
  104. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/page_utils.py +0 -0
  105. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/unittest_helper.py +0 -0
  106. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/words.py +0 -0
  107. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  108. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/js_code/__init__.py +0 -0
  109. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/js_code/active_css_js.py +0 -0
  110. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/js_code/live_js.py +0 -0
  111. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/js_code/recorder_js.py +0 -0
  112. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/masterqa/__init__.py +0 -0
  113. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/masterqa/master_qa.py +0 -0
  114. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/__init__.py +0 -0
  115. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/base_plugin.py +0 -0
  116. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/basic_test_info.py +0 -0
  117. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  118. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/page_source.py +0 -0
  119. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  120. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/screen_shots.py +0 -0
  121. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/resources/__init__.py +0 -0
  122. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/__init__.py +0 -0
  123. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/chinese.py +0 -0
  124. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/dutch.py +0 -0
  125. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/french.py +0 -0
  126. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/italian.py +0 -0
  127. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/japanese.py +0 -0
  128. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/korean.py +0 -0
  129. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/master_dict.py +0 -0
  130. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/portuguese.py +0 -0
  131. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/russian.py +0 -0
  132. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/spanish.py +0 -0
  133. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/translator.py +0 -0
  134. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/__init__.py +0 -0
  135. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp.py +0 -0
  136. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  137. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  138. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  139. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/setup.cfg +0 -0
  164. {seleniumbase-4.57.1 → seleniumbase-4.58.0}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.57.1
3
+ Version: 4.58.0
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
@@ -68,7 +68,7 @@ Requires-Dist: exceptiongroup>=1.3.1
68
68
  Requires-Dist: websockets~=16.1.1; python_version == "3.10"
69
69
  Requires-Dist: websockets>=17.4; python_version >= "3.11"
70
70
  Requires-Dist: filelock==4.1.0; python_version == "3.10"
71
- Requires-Dist: filelock>=4.2.9; python_version >= "3.11"
71
+ Requires-Dist: filelock>=4.2.10; python_version >= "3.11"
72
72
  Requires-Dist: fasteners>=0.20
73
73
  Requires-Dist: mycdp>=1.4.0
74
74
  Requires-Dist: pynose>=1.5.5
@@ -85,7 +85,7 @@ Requires-Dist: pyyaml>=6.0.3
85
85
  Requires-Dist: pygments>=2.20.1
86
86
  Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
87
87
  Requires-Dist: tabcompleter>=1.4.1
88
- Requires-Dist: pdbp>=1.8.3
88
+ Requires-Dist: pdbp>=1.9.0
89
89
  Requires-Dist: idna>=3.20
90
90
  Requires-Dist: charset-normalizer<4,>=3.5.2
91
91
  Requires-Dist: urllib3<3,>=2.8.0
@@ -116,12 +116,12 @@ Requires-Dist: pytest-xdist==3.8.0
116
116
  Requires-Dist: parameterized==0.9.0
117
117
  Requires-Dist: behave==1.2.6
118
118
  Requires-Dist: soupsieve~=2.10.0; python_version < "3.11.5"
119
- Requires-Dist: soupsieve~=4.0.1; python_version >= "3.11.5"
119
+ Requires-Dist: soupsieve~=4.1.1; python_version >= "3.11.5"
120
120
  Requires-Dist: beautifulsoup4~=4.15.0
121
- Requires-Dist: pyotp~=2.10.0
121
+ Requires-Dist: pyotp~=2.11.2
122
122
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
123
123
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system == "Linux"
124
- Requires-Dist: markdown-it-py==4.2.0
124
+ Requires-Dist: markdown-it-py==4.3.0
125
125
  Requires-Dist: mdurl==0.1.2
126
126
  Requires-Dist: rich<16,>=15.0.0
127
127
  Provides-Extra: allure
@@ -130,7 +130,7 @@ Requires-Dist: allure-python-commons>=2.16.0; extra == "allure"
130
130
  Requires-Dist: allure-behave>=2.16.0; extra == "allure"
131
131
  Provides-Extra: coverage
132
132
  Requires-Dist: coverage>=7.16.2; python_version == "3.10" and extra == "coverage"
133
- Requires-Dist: coverage>=7.17.2; python_version >= "3.11" and extra == "coverage"
133
+ Requires-Dist: coverage>=7.17.3; python_version >= "3.11" and extra == "coverage"
134
134
  Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
135
135
  Provides-Extra: flake8
136
136
  Requires-Dist: flake8==7.4.1; python_version == "3.10" and extra == "flake8"
@@ -157,14 +157,12 @@ Requires-Dist: pip-system-certs>=4.0; platform_system == "Windows" and extra ==
157
157
  Provides-Extra: proxy
158
158
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
159
159
  Provides-Extra: playwright
160
- Requires-Dist: playwright>=1.64.1; extra == "playwright"
160
+ Requires-Dist: playwright>=1.65.2; extra == "playwright"
161
161
  Requires-Dist: greenlet>=3.5.6; extra == "playwright"
162
- Requires-Dist: pyee>=13.0.1; python_version < "3.12" and extra == "playwright"
163
- Requires-Dist: pyee>=14.0.0; python_version >= "3.12" and extra == "playwright"
164
162
  Provides-Extra: pyautogui
165
163
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
166
164
  Provides-Extra: uv
167
- Requires-Dist: uv>=0.13.7; extra == "uv"
165
+ Requires-Dist: uv>=0.13.8; extra == "uv"
168
166
  Dynamic: author
169
167
  Dynamic: author-email
170
168
  Dynamic: classifier
@@ -189,13 +187,10 @@ Dynamic: summary
189
187
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
190
188
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
191
189
 
192
- <h1 align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="520" style="max-width: 100% !important; height: auto !important;" /></a></h1>
193
-
194
- <h3 align="center">Browser Automation, Web Scraping, and End-to-End Testing.<br /></h3>
190
+ <h3 align="center" class="hero__title"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" title="SeleniumBase" width="450" /></a><br /><b>A Complete Browser Automation Experience:<br />Web Crawling / Testing / Scraping / Stealth</b></h3>
195
191
 
196
192
  <p align="center">
197
- <a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://img.shields.io/github/actions/workflow/status/seleniumbase/SeleniumBase/python-package.yml?branch=master&style=flat-square&label=CI" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33A6C6.svg?style=flat-square" title="SeleniumBase" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_info-7C6EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a><br />
198
- <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://www.facebook.com/SeleniumBase/" target="_blank" rel="noopener"> <img src="https://img.shields.io/badge/Facebook-4K_followers-1877F2?style=flat-square&logo=facebook&logoColor=white" alt="SeleniumBase Facebook Followers" height="20" /></a> <a href="https://x.com/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=555555" alt="SeleniumBase X Followers" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://img.shields.io/discord/727927627830001734?style=flat-square&color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
193
+ <a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://flat.badgen.net/github/checks/seleniumbase/SeleniumBase/master?label=CI&" alt="CI Status" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33A6C6.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_info-7C6EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
199
194
  </p>
200
195
 
201
196
  <p align="center">
@@ -233,6 +228,27 @@ Dynamic: summary
233
228
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
234
229
  </p>
235
230
 
231
+ <h4>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</h4>
232
+
233
+ --------
234
+
235
+ 📚 Learn from [**over 200 examples** in **SeleniumBase/examples/**](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
236
+
237
+ <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank" rel="noopener"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Google Search" title="SeleniumBase Google Search" width="480" /></a></p>
238
+
239
+ --------
240
+
241
+ <h3 align="left"><img src="https://seleniumbase.io/img/logo6.png" title="SeleniumBase" width="32" /> SeleniumBase Chromium architecture and modes:</h3>
242
+
243
+ <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="600" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
244
+
245
+ > (*Note that "Regular Mode" also supports Safari/WebKit and Firefox/Gecko.*)
246
+
247
+ <ul>
248
+ <li>🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> <b>bypasses bot-detection with Chromium-based browsers.</b></li>
249
+ <li>🎭 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a> <b>extends CDP Mode's stealth to Playwright.</b></li>
250
+ </ul>
251
+
236
252
  --------
237
253
 
238
254
  🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
@@ -252,21 +268,21 @@ Dynamic: summary
252
268
  ```python
253
269
  from seleniumbase import sb_cdp
254
270
 
255
- sb = sb_cdp.Chrome() # Launches a stealth browser
271
+ sb = sb_cdp.Chrome() # Launch a stealth browser
256
272
  sb.goto("https://www.planetminecraft.com/account")
257
273
  sb.type('[name="email"]', "Test123")
258
274
  sb.type('[name="password"]', "Pass")
259
- sb.click("input#autologin") # Unchecks a checkbox
260
- sb.solve_captcha() # (as backup if not automatic)
275
+ sb.click("input#autologin") # Uncheck a checkbox
276
+ sb.solve_captcha() # (fallback if not automatic)
261
277
  sb.assert_element('input[name="login"]')
262
278
  sb.assert_element_not_visible("input[disabled]")
263
- sb.sleep(1) # (only to slow down the live demo)
264
- sb.quit() # (otherwise quits automatically at end)
279
+ sb.sleep(1) # (see the live demo more easily)
280
+ sb.quit()
265
281
  ```
266
282
 
267
283
  <p align="left">
268
- <img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="542" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
269
- <br /><em>(Note that the click action only unchecked the "Stay signed in" checkbox.)</em>
284
+ <img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="572" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
285
+ <br /><em>(Note: In this example, the click only unchecks the "Stay signed in" checkbox.)</em>
270
286
  </p>
271
287
 
272
288
  --------
@@ -346,12 +362,6 @@ sb = sb_cdp.Chrome(use_chromium=True)
346
362
 
347
363
  --------
348
364
 
349
- <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
350
-
351
- <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
352
-
353
- --------
354
-
355
365
  <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
356
366
 
357
367
  <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank" rel="noopener">This script</a> tests an e-commerce site: (Runs with <b><code>pytest</code></b>):</p>
@@ -440,7 +450,7 @@ pytest test_demo_site.py
440
450
 
441
451
  --------
442
452
 
443
- <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="232" /></a></p>
453
+ <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="248" /></a></p>
444
454
 
445
455
  <blockquote>
446
456
  <p dir="auto"><strong>Explore the README:</strong></p>
@@ -994,6 +1004,7 @@ pytest test_coffee_cart.py --trace
994
1004
  --rs | --reuse-session # (Reuse browser session for all tests.)
995
1005
  --rcs | --reuse-class-session # (Reuse session for tests in class.)
996
1006
  --crumbs # (Delete all cookies between tests reusing a session.)
1007
+ --no-tt # (Skips "--test-type" when using Proxy Mode. Adds stealth.)
997
1008
  --disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
998
1009
  --window-position=X,Y # (Set the browser's starting window position.)
999
1010
  --window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
@@ -1670,7 +1681,7 @@ pytest --reruns=1 --reruns-delay=1
1670
1681
 
1671
1682
  <p><div><b><a href="https://github.com/mdmintz" target="_blank" rel="noopener">https://github.com/mdmintz</a></b></div></p>
1672
1683
 
1673
- <div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="310" style="max-width: 100% !important; height: auto !important;" /></a></div>
1684
+ <div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb6.png" title="SeleniumBase" width="310" style="max-width: 100% !important; height: auto !important;" /></a></div>
1674
1685
  <div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1675
1686
  <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" height="20" /></a> </div>
1676
1687
  <div align="left"></div>
@@ -8,13 +8,10 @@
8
8
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
9
9
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
10
10
 
11
- <h1 align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="520" style="max-width: 100% !important; height: auto !important;" /></a></h1>
12
-
13
- <h3 align="center">Browser Automation, Web Scraping, and End-to-End Testing.<br /></h3>
11
+ <h3 align="center" class="hero__title"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" title="SeleniumBase" width="450" /></a><br /><b>A Complete Browser Automation Experience:<br />Web Crawling / Testing / Scraping / Stealth</b></h3>
14
12
 
15
13
  <p align="center">
16
- <a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://img.shields.io/github/actions/workflow/status/seleniumbase/SeleniumBase/python-package.yml?branch=master&style=flat-square&label=CI" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33A6C6.svg?style=flat-square" title="SeleniumBase" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_info-7C6EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a><br />
17
- <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://www.facebook.com/SeleniumBase/" target="_blank" rel="noopener"> <img src="https://img.shields.io/badge/Facebook-4K_followers-1877F2?style=flat-square&logo=facebook&logoColor=white" alt="SeleniumBase Facebook Followers" height="20" /></a> <a href="https://x.com/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=555555" alt="SeleniumBase X Followers" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://img.shields.io/discord/727927627830001734?style=flat-square&color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
14
+ <a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://flat.badgen.net/github/checks/seleniumbase/SeleniumBase/master?label=CI&" alt="CI Status" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33A6C6.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_info-7C6EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
18
15
  </p>
19
16
 
20
17
  <p align="center">
@@ -52,6 +49,27 @@
52
49
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
53
50
  </p>
54
51
 
52
+ <h4>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</h4>
53
+
54
+ --------
55
+
56
+ 📚 Learn from [**over 200 examples** in **SeleniumBase/examples/**](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
57
+
58
+ <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank" rel="noopener"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Google Search" title="SeleniumBase Google Search" width="480" /></a></p>
59
+
60
+ --------
61
+
62
+ <h3 align="left"><img src="https://seleniumbase.io/img/logo6.png" title="SeleniumBase" width="32" /> SeleniumBase Chromium architecture and modes:</h3>
63
+
64
+ <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="600" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
65
+
66
+ > (*Note that "Regular Mode" also supports Safari/WebKit and Firefox/Gecko.*)
67
+
68
+ <ul>
69
+ <li>🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> <b>bypasses bot-detection with Chromium-based browsers.</b></li>
70
+ <li>🎭 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a> <b>extends CDP Mode's stealth to Playwright.</b></li>
71
+ </ul>
72
+
55
73
  --------
56
74
 
57
75
  🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
@@ -71,21 +89,21 @@
71
89
  ```python
72
90
  from seleniumbase import sb_cdp
73
91
 
74
- sb = sb_cdp.Chrome() # Launches a stealth browser
92
+ sb = sb_cdp.Chrome() # Launch a stealth browser
75
93
  sb.goto("https://www.planetminecraft.com/account")
76
94
  sb.type('[name="email"]', "Test123")
77
95
  sb.type('[name="password"]', "Pass")
78
- sb.click("input#autologin") # Unchecks a checkbox
79
- sb.solve_captcha() # (as backup if not automatic)
96
+ sb.click("input#autologin") # Uncheck a checkbox
97
+ sb.solve_captcha() # (fallback if not automatic)
80
98
  sb.assert_element('input[name="login"]')
81
99
  sb.assert_element_not_visible("input[disabled]")
82
- sb.sleep(1) # (only to slow down the live demo)
83
- sb.quit() # (otherwise quits automatically at end)
100
+ sb.sleep(1) # (see the live demo more easily)
101
+ sb.quit()
84
102
  ```
85
103
 
86
104
  <p align="left">
87
- <img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="542" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
88
- <br /><em>(Note that the click action only unchecked the "Stay signed in" checkbox.)</em>
105
+ <img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="572" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
106
+ <br /><em>(Note: In this example, the click only unchecks the "Stay signed in" checkbox.)</em>
89
107
  </p>
90
108
 
91
109
  --------
@@ -165,12 +183,6 @@ sb = sb_cdp.Chrome(use_chromium=True)
165
183
 
166
184
  --------
167
185
 
168
- <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
169
-
170
- <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
171
-
172
- --------
173
-
174
186
  <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
175
187
 
176
188
  <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank" rel="noopener">This script</a> tests an e-commerce site: (Runs with <b><code>pytest</code></b>):</p>
@@ -259,7 +271,7 @@ pytest test_demo_site.py
259
271
 
260
272
  --------
261
273
 
262
- <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="232" /></a></p>
274
+ <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="248" /></a></p>
263
275
 
264
276
  <blockquote>
265
277
  <p dir="auto"><strong>Explore the README:</strong></p>
@@ -813,6 +825,7 @@ pytest test_coffee_cart.py --trace
813
825
  --rs | --reuse-session # (Reuse browser session for all tests.)
814
826
  --rcs | --reuse-class-session # (Reuse session for tests in class.)
815
827
  --crumbs # (Delete all cookies between tests reusing a session.)
828
+ --no-tt # (Skips "--test-type" when using Proxy Mode. Adds stealth.)
816
829
  --disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
817
830
  --window-position=X,Y # (Set the browser's starting window position.)
818
831
  --window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
@@ -1489,7 +1502,7 @@ pytest --reruns=1 --reruns-delay=1
1489
1502
 
1490
1503
  <p><div><b><a href="https://github.com/mdmintz" target="_blank" rel="noopener">https://github.com/mdmintz</a></b></div></p>
1491
1504
 
1492
- <div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="310" style="max-width: 100% !important; height: auto !important;" /></a></div>
1505
+ <div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb6.png" title="SeleniumBase" width="310" style="max-width: 100% !important; height: auto !important;" /></a></div>
1493
1506
  <div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1494
1507
  <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" height="20" /></a> </div>
1495
1508
  <div align="left"></div>
@@ -8,7 +8,7 @@ exceptiongroup>=1.3.1
8
8
  websockets~=16.1.1;python_version=="3.10"
9
9
  websockets>=17.4;python_version>="3.11"
10
10
  filelock==4.1.0;python_version=="3.10"
11
- filelock>=4.2.9;python_version>="3.11"
11
+ filelock>=4.2.10;python_version>="3.11"
12
12
  fasteners>=0.20
13
13
  mycdp>=1.4.0
14
14
  pynose>=1.5.5
@@ -25,7 +25,7 @@ pyyaml>=6.0.3
25
25
  pygments>=2.20.1
26
26
  pyreadline3>=3.5.4;platform_system=="Windows"
27
27
  tabcompleter>=1.4.1
28
- pdbp>=1.8.3
28
+ pdbp>=1.9.0
29
29
  idna>=3.20
30
30
  charset-normalizer>=3.5.2,<4
31
31
  urllib3>=2.8.0,<3
@@ -56,12 +56,12 @@ pytest-xdist==3.8.0
56
56
  parameterized==0.9.0
57
57
  behave==1.2.6
58
58
  soupsieve~=2.10.0;python_version<"3.11.5"
59
- soupsieve~=4.0.1;python_version>="3.11.5"
59
+ soupsieve~=4.1.1;python_version>="3.11.5"
60
60
  beautifulsoup4~=4.15.0
61
- pyotp~=2.10.0
61
+ pyotp~=2.11.2
62
62
  python-xlib==0.33;platform_system=="Linux"
63
63
  PyAutoGUI>=0.9.54;platform_system=="Linux"
64
- markdown-it-py==4.2.0
64
+ markdown-it-py==4.3.0
65
65
  mdurl==0.1.2
66
66
  rich>=15.0.0,<16
67
67
 
@@ -69,7 +69,7 @@ rich>=15.0.0,<16
69
69
  # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
70
70
 
71
71
  coverage>=7.16.2;python_version=="3.10"
72
- coverage>=7.17.2;python_version>="3.11"
72
+ coverage>=7.17.3;python_version>="3.11"
73
73
  pytest-cov>=7.1.0
74
74
  flake8==7.4.1;python_version=="3.10"
75
75
  flake8==7.5.0;python_version>="3.11"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.57.1"
2
+ __version__ = "4.58.0"
@@ -929,6 +929,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
929
929
  cdp.enter_mfa_code = CDPM.enter_mfa_code
930
930
  cdp.flash = CDPM.flash
931
931
  cdp.highlight = CDPM.highlight
932
+ cdp.highlight_if_visible = CDPM.highlight_if_visible
932
933
  cdp.focus = CDPM.focus
933
934
  cdp.highlight_overlay = CDPM.highlight_overlay
934
935
  cdp.get_window_position = CDPM.get_window_position
@@ -2373,7 +2374,8 @@ def _set_chrome_options(
2373
2374
  device_pixel_ratio,
2374
2375
  ):
2375
2376
  chrome_options = webdriver.ChromeOptions()
2376
- if is_using_uc(undetectable, browser_name):
2377
+ is_uc = is_using_uc(undetectable, browser_name)
2378
+ if is_uc:
2377
2379
  from seleniumbase import undetected
2378
2380
  chrome_options = undetected.ChromeOptions()
2379
2381
  elif browser_name == constants.Browser.EDGE:
@@ -2457,7 +2459,7 @@ def _set_chrome_options(
2457
2459
  chrome_options.add_argument(
2458
2460
  "--host-resolver-rules=%s" % host_resolver_rules
2459
2461
  )
2460
- if mobile_emulator and not is_using_uc(undetectable, browser_name):
2462
+ if mobile_emulator and not is_uc:
2461
2463
  emulator_settings = {}
2462
2464
  device_metrics = {}
2463
2465
  if (
@@ -2555,7 +2557,7 @@ def _set_chrome_options(
2555
2557
  pass
2556
2558
  if dark_mode:
2557
2559
  chrome_options.add_argument("--enable-features=WebContentsForceDark")
2558
- if user_data_dir and not is_using_uc(undetectable, browser_name):
2560
+ if user_data_dir and not is_uc:
2559
2561
  abs_path = os.path.abspath(user_data_dir)
2560
2562
  chrome_options.add_argument("--user-data-dir=%s" % abs_path)
2561
2563
  if extension_zip:
@@ -2646,7 +2648,7 @@ def _set_chrome_options(
2646
2648
  if proxy_string:
2647
2649
  if proxy_auth:
2648
2650
  zip_it = True
2649
- if is_using_uc(undetectable, browser_name):
2651
+ if is_uc:
2650
2652
  zip_it = False # undetected-chromedriver needs a folder ext
2651
2653
  chrome_options = _add_chrome_proxy_extension(
2652
2654
  chrome_options,
@@ -2666,7 +2668,7 @@ def _set_chrome_options(
2666
2668
  elif proxy_pac_url:
2667
2669
  if proxy_auth:
2668
2670
  zip_it = True # undetected-chromedriver needs a folder ext
2669
- if is_using_uc(undetectable, browser_name):
2671
+ if is_uc:
2670
2672
  zip_it = False
2671
2673
  chrome_options = _add_chrome_proxy_extension(
2672
2674
  chrome_options,
@@ -2679,18 +2681,14 @@ def _set_chrome_options(
2679
2681
  multi_proxy,
2680
2682
  )
2681
2683
  chrome_options.add_argument("--proxy-pac-url=%s" % proxy_pac_url)
2682
- if (
2683
- not is_using_uc(undetectable, browser_name)
2684
- or not enable_ws
2685
- or proxy_string
2686
- ):
2684
+ if not is_uc or not enable_ws or proxy_string:
2687
2685
  chrome_options.add_argument("--ignore-certificate-errors")
2688
2686
  chrome_options.add_argument("--ignore-ssl-errors=yes")
2689
2687
  if not enable_ws:
2690
2688
  chrome_options.add_argument("--disable-web-security")
2691
2689
  if (
2692
2690
  IS_LINUX
2693
- or (IS_MAC and not is_using_uc(undetectable, browser_name))
2691
+ or (IS_MAC and not is_uc)
2694
2692
  ):
2695
2693
  chrome_options.add_argument("--no-sandbox")
2696
2694
  if remote_debug:
@@ -2705,13 +2703,10 @@ def _set_chrome_options(
2705
2703
  if swiftshader:
2706
2704
  chrome_options.add_argument("--use-gl=angle")
2707
2705
  chrome_options.add_argument("--use-angle=swiftshader-webgl")
2708
- elif (
2709
- not is_using_uc(undetectable, browser_name)
2710
- and not enable_3d_apis
2711
- ):
2706
+ elif not is_uc and not enable_3d_apis:
2712
2707
  chrome_options.add_argument("--disable-gpu")
2713
2708
  if (
2714
- (not IS_LINUX and is_using_uc(undetectable, browser_name))
2709
+ (not IS_LINUX and is_uc)
2715
2710
  or (
2716
2711
  IS_MAC
2717
2712
  and binary_location
@@ -2722,7 +2717,7 @@ def _set_chrome_options(
2722
2717
  chrome_options.add_argument("--disable-application-cache")
2723
2718
  if IS_LINUX:
2724
2719
  chrome_options.add_argument("--disable-dev-shm-usage")
2725
- if is_using_uc(undetectable, browser_name):
2720
+ if is_uc:
2726
2721
  chrome_options.add_argument("--disable-application-cache")
2727
2722
  chrome_options.add_argument("--disable-setuid-sandbox")
2728
2723
  if not binary_location:
@@ -2762,9 +2757,7 @@ def _set_chrome_options(
2762
2757
  )
2763
2758
  if "set-binary" in chromium_arg_item and not binary_location:
2764
2759
  br_app = "google-chrome"
2765
- binary_loc = detect_b_ver.get_binary_location(
2766
- br_app, is_using_uc(undetectable, browser_name)
2767
- )
2760
+ binary_loc = detect_b_ver.get_binary_location(br_app, is_uc)
2768
2761
  if os.path.exists(binary_loc):
2769
2762
  binary_location = binary_loc
2770
2763
  elif "disable-features=" in chromium_arg_item:
@@ -2789,9 +2782,9 @@ def _set_chrome_options(
2789
2782
  chrome_options.add_argument("--disable-translate")
2790
2783
  if binary_location:
2791
2784
  chrome_options.binary_location = binary_location
2792
- if not enable_3d_apis and not is_using_uc(undetectable, browser_name):
2785
+ if not enable_3d_apis and not is_uc:
2793
2786
  chrome_options.add_argument("--disable-3d-apis")
2794
- if headless or headless2 or is_using_uc(undetectable, browser_name):
2787
+ if headless or headless2 or is_uc:
2795
2788
  chrome_options.add_argument("--disable-renderer-backgrounding")
2796
2789
  chrome_options.add_argument("--disable-background-networking")
2797
2790
  chrome_options.add_argument("--disable-backgrounding-occluded-windows")
@@ -2805,7 +2798,10 @@ def _set_chrome_options(
2805
2798
  chrome_options.add_argument(
2806
2799
  '--simulate-outdated-no-au="Tue, 31 Dec 2099 23:59:59 GMT"'
2807
2800
  )
2808
- chrome_options.add_argument("--disable-ipc-flooding-protection")
2801
+ if not is_uc or __is_using_fast_mode():
2802
+ # Since disabling IPC FP is detectable by sites that look for it,
2803
+ # we'll now keep it enabled in UC Mode / CDP Mode, unless "fast".
2804
+ chrome_options.add_argument("--disable-ipc-flooding-protection")
2809
2805
  chrome_options.add_argument("--disable-password-generation")
2810
2806
  chrome_options.add_argument("--disable-domain-reliability")
2811
2807
  chrome_options.add_argument("--disable-breakpad")
@@ -2830,7 +2826,7 @@ def _set_chrome_options(
2830
2826
  included_disabled_features.append("PasskeyAuth")
2831
2827
  included_disabled_features.append("DialMediaRouteProvider")
2832
2828
  included_disabled_features.append("WebRtcHideLocalIpsWithMdns")
2833
- if is_using_uc(undetectable, browser_name):
2829
+ if is_uc:
2834
2830
  included_disabled_features.append("IsolateOrigins")
2835
2831
  included_disabled_features.append("site-per-process")
2836
2832
  for item in extra_disabled_features:
@@ -2839,20 +2835,30 @@ def _set_chrome_options(
2839
2835
  d_f_string = ",".join(included_disabled_features)
2840
2836
  chrome_options.add_argument("--disable-features=%s" % d_f_string)
2841
2837
  chrome_options.add_argument("--enable-unsafe-extension-debugging")
2838
+ if is_uc and binary_location and "cft_drivers" in binary_location:
2839
+ chrome_options.add_argument("--disable-infobars")
2842
2840
  if (
2843
2841
  hasattr(sb_config, "_cdp_browser")
2844
2842
  and sb_config._cdp_browser == "brave"
2845
2843
  ):
2846
2844
  pass # Looks like "--test-type" breaks Brave now
2847
2845
  else:
2848
- chrome_options.add_argument("--test-type")
2846
+ if not is_uc or (
2847
+ proxy_string and not (
2848
+ hasattr(sb_config, "_no_tt") and sb_config._no_tt
2849
+ )
2850
+ ):
2851
+ # Since --test-type is detectable by sites that look for it,
2852
+ # there's a new no_tt option to skip it in UC Mode / CDP Mode
2853
+ # when using a proxy. Not used anymore if no proxy otherwise.
2854
+ chrome_options.add_argument("--test-type")
2849
2855
  if proxy_auth or sb_config._ext_dirs:
2850
- if not is_using_uc(undetectable, browser_name):
2856
+ if not is_uc:
2851
2857
  chrome_options.add_argument("--remote-debugging-pipe")
2852
2858
  chrome_options.enable_webextensions = True
2853
2859
  chrome_options.enable_bidi = True
2854
2860
  if (
2855
- is_using_uc(undetectable, browser_name)
2861
+ is_uc
2856
2862
  and (
2857
2863
  not headless
2858
2864
  or IS_LINUX # switches to Xvfb (non-headless)
@@ -2866,7 +2872,8 @@ def _set_chrome_options(
2866
2872
  chrome_options.add_argument("--disable-auto-reload")
2867
2873
  chrome_options.add_argument("--disable-background-timer-throttling")
2868
2874
  # Prevent new tabs opened by Selenium from being blocked:
2869
- chrome_options.add_argument("--disable-popup-blocking")
2875
+ # (Option might not be needed anymore. Removing for now.)
2876
+ # chrome_options.add_argument("--disable-popup-blocking")
2870
2877
  # Skip remaining options that trigger anti-bot services
2871
2878
  return chrome_options
2872
2879
  chrome_options.add_argument("--log-level=3")
@@ -257,12 +257,15 @@ class CDPMethods():
257
257
  that SeleniumBase methods can be called from Playwright
258
258
  without encountering event loop error messages such as:
259
259
  Cannot run the event loop while another loop is running.
260
+ Also fixes a NodeJS compatibility issue on old versions
261
+ of macOS when using Playwright versions 1.65.0 or newer.
260
262
  Also sets an environment variable to hide this warning:
261
263
  Deprecation: "url.parse() behavior is not standardized".
262
264
  (github.com/microsoft/playwright-python/issues/3016)"""
263
265
  from seleniumbase.core import nest_asyncio
264
266
  nest_asyncio.apply()
265
267
  os.environ["NODE_NO_WARNINGS"] = "1"
268
+ shared_utils.fix_playwright_node_compatibility()
266
269
  driver = self.driver
267
270
  if hasattr(driver, "cdp_base"):
268
271
  driver = driver.cdp_base
@@ -1249,6 +1252,19 @@ class CDPMethods():
1249
1252
  element.flash(0.30, "44CC88", x_offset, y_offset)
1250
1253
  time.sleep(0.30)
1251
1254
 
1255
+ def highlight_if_visible(self, selector, scroll=True, timeout=0):
1256
+ if self.is_element_visible(selector):
1257
+ with suppress(Exception):
1258
+ self.highlight(selector, scroll=scroll, timeout=1)
1259
+ elif timeout == 0:
1260
+ return
1261
+ else:
1262
+ with suppress(Exception):
1263
+ self.find_element(selector, timeout=timeout)
1264
+ self.sleep(0.1)
1265
+ if self.is_element_visible(selector):
1266
+ self.highlight(selector, scroll=scroll, timeout=1)
1267
+
1252
1268
  def focus(self, selector, timeout=None):
1253
1269
  if not timeout:
1254
1270
  timeout = settings.SMALL_TIMEOUT
@@ -2463,8 +2479,8 @@ class CDPMethods():
2463
2479
  self.loop.run_until_complete(self.page.wait(0.05))
2464
2480
  if (
2465
2481
  self.is_element_visible(
2466
- 'body > iframe[src*="/geo.captcha-delivery.com/captcha/"], '
2467
- 'body > iframe[src*="/geo.captcha-delivery.com/interstitial/"]'
2482
+ 'iframe[src*="/geo.captcha-delivery.com/captcha/"], '
2483
+ 'iframe[src*="/geo.captcha-delivery.com/interstitial/"]'
2468
2484
  )
2469
2485
  ):
2470
2486
  return True
@@ -2551,8 +2567,8 @@ class CDPMethods():
2551
2567
 
2552
2568
  def __gui_slide_datadome_captcha(self):
2553
2569
  iframe = (
2554
- 'body > iframe[src*="/geo.captcha-delivery.com/captcha/"], '
2555
- 'body > iframe[src*="/geo.captcha-delivery.com/interstitial/"]'
2570
+ 'iframe[src*="/geo.captcha-delivery.com/captcha/"], '
2571
+ 'iframe[src*="/geo.captcha-delivery.com/interstitial/"]'
2556
2572
  )
2557
2573
  if not self.is_element_visible(iframe):
2558
2574
  return False