seleniumbase 4.56.3__tar.gz → 4.56.5__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.56.3/seleniumbase.egg-info → seleniumbase-4.56.5}/PKG-INFO +43 -59
  2. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/README.md +28 -48
  3. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/requirements.txt +8 -5
  4. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/sb_cdp.py +1 -1
  6. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/base_case.py +1 -1
  7. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/page_utils.py +1 -1
  8. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp_driver/element.py +2 -1
  9. {seleniumbase-4.56.3 → seleniumbase-4.56.5/seleniumbase.egg-info}/PKG-INFO +43 -59
  10. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase.egg-info/requires.txt +25 -9
  11. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/setup.py +15 -11
  12. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/.gitignore +0 -0
  13. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/LICENSE +0 -0
  14. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/MANIFEST.in +0 -0
  15. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/install.sh +0 -0
  16. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/mcp_servers/__init__.py +0 -0
  17. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/mcp_servers/server.py +0 -0
  18. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/pyproject.toml +0 -0
  19. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/pytest.ini +0 -0
  20. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/sbase/__init__.py +0 -0
  21. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/sbase/__main__.py +0 -0
  22. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/sbase/steps.py +0 -0
  23. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/__init__.py +0 -0
  24. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/__main__.py +0 -0
  25. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/behave/__init__.py +0 -0
  26. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/behave/behave_helper.py +0 -0
  27. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/behave/behave_sb.py +0 -0
  28. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/behave/steps.py +0 -0
  29. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/common/__init__.py +0 -0
  30. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/common/decorators.py +0 -0
  31. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/common/encryption.py +0 -0
  32. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/common/exceptions.py +0 -0
  33. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/common/obfuscate.py +0 -0
  34. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/common/unobfuscate.py +0 -0
  35. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/config/__init__.py +0 -0
  36. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/config/ad_block_list.py +0 -0
  37. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/config/proxy_list.py +0 -0
  38. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/config/settings.py +0 -0
  39. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/__init__.py +0 -0
  40. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/logo_helper.py +0 -0
  41. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/rich_helper.py +0 -0
  42. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/run.py +0 -0
  43. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  44. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  45. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_commander.py +0 -0
  46. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_install.py +0 -0
  47. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  48. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  49. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  50. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  51. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  52. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  53. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_print.py +0 -0
  54. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  55. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/__init__.py +0 -0
  56. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/application_manager.py +0 -0
  57. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/browser_launcher.py +0 -0
  58. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/capabilities_parser.py +0 -0
  59. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/colored_traceback.py +0 -0
  60. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/create_db_tables.sql +0 -0
  61. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/detect_b_ver.py +0 -0
  62. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/download_helper.py +0 -0
  63. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/encoded_images.py +0 -0
  64. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/jqc_helper.py +0 -0
  65. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/log_helper.py +0 -0
  66. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/mysql.py +0 -0
  67. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/nest_asyncio.py +0 -0
  68. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/proxy_helper.py +0 -0
  69. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/recorder_helper.py +0 -0
  70. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/report_helper.py +0 -0
  71. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/s3_manager.py +0 -0
  72. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/sb_driver.py +0 -0
  73. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/session_helper.py +0 -0
  74. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/settings_parser.py +0 -0
  75. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/style_sheet.py +0 -0
  76. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/testcase_manager.py +0 -0
  77. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/tour_helper.py +0 -0
  78. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/core/visual_helper.py +0 -0
  79. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/drivers/__init__.py +0 -0
  80. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  81. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  82. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  83. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  84. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  85. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  86. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/extensions/__init__.py +0 -0
  87. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/extensions/ad_block.zip +0 -0
  88. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/extensions/disable_csp.zip +0 -0
  89. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/extensions/recorder.zip +0 -0
  90. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/extensions/sbase_ext.zip +0 -0
  91. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/__init__.py +0 -0
  92. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/constants.py +0 -0
  93. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  94. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/errors.py +0 -0
  95. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/js_utils.py +0 -0
  96. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/page_actions.py +0 -0
  97. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/shared_utils.py +0 -0
  98. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/unittest_helper.py +0 -0
  99. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/words.py +0 -0
  100. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  101. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/js_code/__init__.py +0 -0
  102. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/js_code/active_css_js.py +0 -0
  103. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/js_code/live_js.py +0 -0
  104. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/js_code/recorder_js.py +0 -0
  105. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/masterqa/__init__.py +0 -0
  106. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/masterqa/master_qa.py +0 -0
  107. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/__init__.py +0 -0
  108. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/base_plugin.py +0 -0
  109. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/basic_test_info.py +0 -0
  110. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  111. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/driver_manager.py +0 -0
  112. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/page_source.py +0 -0
  113. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/pytest_plugin.py +0 -0
  114. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  115. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/sb_manager.py +0 -0
  116. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/screen_shots.py +0 -0
  117. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/plugins/selenium_plugin.py +0 -0
  118. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/resources/__init__.py +0 -0
  119. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/__init__.py +0 -0
  120. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/chinese.py +0 -0
  121. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/dutch.py +0 -0
  122. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/french.py +0 -0
  123. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/italian.py +0 -0
  124. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/japanese.py +0 -0
  125. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/korean.py +0 -0
  126. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/master_dict.py +0 -0
  127. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/portuguese.py +0 -0
  128. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/russian.py +0 -0
  129. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/spanish.py +0 -0
  130. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/translate/translator.py +0 -0
  131. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/__init__.py +0 -0
  132. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp.py +0 -0
  133. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  134. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  135. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  136. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  137. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  138. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  139. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/setup.cfg +0 -0
  164. {seleniumbase-4.56.3 → seleniumbase-4.56.5}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.56.3
3
+ Version: 4.56.5
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
@@ -63,7 +63,7 @@ Requires-Dist: packaging>=26.3
63
63
  Requires-Dist: setuptools>=84.2.1
64
64
  Requires-Dist: wheel>=0.48.0
65
65
  Requires-Dist: attrs>=26.1.0
66
- Requires-Dist: certifi>=2026.10.19
66
+ Requires-Dist: certifi>=2026.10.23
67
67
  Requires-Dist: exceptiongroup>=1.3.1
68
68
  Requires-Dist: websockets~=16.1.1; python_version == "3.10"
69
69
  Requires-Dist: websockets>=17.3; python_version >= "3.11"
@@ -116,7 +116,7 @@ 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~=3.0.3; python_version >= "3.11.5"
119
+ Requires-Dist: soupsieve~=3.0.4; python_version >= "3.11.5"
120
120
  Requires-Dist: beautifulsoup4~=4.15.0
121
121
  Requires-Dist: pyotp~=2.10.0
122
122
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
@@ -129,12 +129,15 @@ Requires-Dist: allure-pytest>=2.16.0; extra == "allure"
129
129
  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
- Requires-Dist: coverage>=7.16.2; extra == "coverage"
132
+ Requires-Dist: coverage>=7.16.2; python_version == "3.10" and extra == "coverage"
133
+ Requires-Dist: coverage>=7.17.0; python_version >= "3.11" and extra == "coverage"
133
134
  Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
134
135
  Provides-Extra: flake8
135
- Requires-Dist: flake8==7.4.1; extra == "flake8"
136
+ Requires-Dist: flake8==7.4.1; python_version == "3.10" and extra == "flake8"
137
+ Requires-Dist: flake8==7.5.0; python_version >= "3.11" and extra == "flake8"
136
138
  Requires-Dist: mccabe==0.7.0; extra == "flake8"
137
- Requires-Dist: pyflakes==4.0.3; extra == "flake8"
139
+ Requires-Dist: pyflakes==4.0.3; python_version == "3.10" and extra == "flake8"
140
+ Requires-Dist: pyflakes==4.1.0; python_version >= "3.11" and extra == "flake8"
138
141
  Requires-Dist: pycodestyle==2.15.0; extra == "flake8"
139
142
  Provides-Extra: mcp
140
143
  Requires-Dist: mcp[cli]<3.0.0,>=2.3.0; extra == "mcp"
@@ -142,9 +145,10 @@ Provides-Extra: mss
142
145
  Requires-Dist: mss==10.2.0; extra == "mss"
143
146
  Provides-Extra: pdfminer
144
147
  Requires-Dist: pdfminer.six==20260107; extra == "pdfminer"
145
- Requires-Dist: cryptography==50.0.2; extra == "pdfminer"
146
- Requires-Dist: cffi==2.1.1; extra == "pdfminer"
147
- Requires-Dist: pycparser==3.11; extra == "pdfminer"
148
+ Requires-Dist: cryptography~=50.0.2; extra == "pdfminer"
149
+ Requires-Dist: cffi~=2.1.1; extra == "pdfminer"
150
+ Requires-Dist: pycparser==3.11; python_version == "3.10" and extra == "pdfminer"
151
+ Requires-Dist: pycparser~=3.12; python_version >= "3.11" and extra == "pdfminer"
148
152
  Provides-Extra: pillow
149
153
  Requires-Dist: Pillow>=12.3.0; python_version == "3.10" and extra == "pillow"
150
154
  Requires-Dist: Pillow>=13.0.0; python_version >= "3.11" and extra == "pillow"
@@ -153,14 +157,14 @@ Requires-Dist: pip-system-certs>=4.0; platform_system == "Windows" and extra ==
153
157
  Provides-Extra: proxy
154
158
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
155
159
  Provides-Extra: playwright
156
- Requires-Dist: playwright>=1.64.0; extra == "playwright"
160
+ Requires-Dist: playwright>=1.64.1; extra == "playwright"
157
161
  Requires-Dist: greenlet>=3.5.6; extra == "playwright"
158
162
  Requires-Dist: pyee>=13.0.1; python_version < "3.12" and extra == "playwright"
159
163
  Requires-Dist: pyee>=14.0.0; python_version >= "3.12" and extra == "playwright"
160
164
  Provides-Extra: pyautogui
161
165
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
162
166
  Provides-Extra: uv
163
- Requires-Dist: uv>=0.13.4; extra == "uv"
167
+ Requires-Dist: uv>=0.13.6; extra == "uv"
164
168
  Dynamic: author
165
169
  Dynamic: author-email
166
170
  Dynamic: classifier
@@ -192,7 +196,7 @@ Dynamic: summary
192
196
  <p align="center"><b align="center">Includes stealth options for bypassing bot-detection and CAPTCHAs.<br /></b></p>
193
197
 
194
198
  <p align="center">
195
- <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_catalog-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 />
199
+ <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 />
196
200
  <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>
197
201
  </p>
198
202
 
@@ -243,20 +247,30 @@ Dynamic: summary
243
247
 
244
248
  --------
245
249
 
246
- 📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_cdp_mode.py">an example</a> with <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp"><i>Pure CDP Mode</i></a>):<br /><em>(It bypasses both BrowserScan AND Sannysoft Bot-Detection)</em>
250
+ 📝 [This example](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_cdp_mode.py) uses <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (*[Pure CDP Mode](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#Pure_CDP_Mode)*):<br /><em>(It bypasses BrowserScan, Sannysoft, and Cloudflare bot-detection)</em>
247
251
 
248
252
  ```python
249
253
  from seleniumbase import sb_cdp
250
254
 
251
- sb = sb_cdp.Chrome()
255
+ sb = sb_cdp.Chrome() # Launch a stealth browser
252
256
  sb.goto("https://browserscan.net/bot-detection")
253
257
  sb.assert_element('strong:contains("Normal")')
254
258
  sb.sleep(1)
259
+
255
260
  sb.goto("https://bot.sannysoft.com/")
256
261
  sb.assert_element(".passed")
257
262
  sb.assert_element_not_visible(".failed")
258
263
  sb.sleep(1)
259
- sb.quit()
264
+
265
+ sb.goto("https://www.planetminecraft.com/account")
266
+ sb.type('[name="email"]', "Name123")
267
+ sb.type('[name="password"]', "Pass")
268
+ sb.click("input#autologin")
269
+ sb.solve_captcha() # Works on different CAPTCHAs
270
+ sb.assert_element('input[name="login"]')
271
+ sb.assert_element_not_visible("input[disabled]")
272
+ sb.sleep(1)
273
+ sb.quit() # Quit browser before end-of-program
260
274
  ```
261
275
 
262
276
  <p align="center">
@@ -269,37 +283,16 @@ sb.quit()
269
283
  <br /><em>(All Sannysoft bot-detection tests passed successfully)</em>
270
284
  </p>
271
285
 
272
- --------
273
-
274
- 📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py">another example</a> with <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp"><i>Pure CDP Mode</i></a>):<br />(It performs various browser actions and bypasses a Cloudflare Turnstile)
275
-
276
- ```python
277
- from seleniumbase import sb_cdp
278
-
279
- sb = sb_cdp.Chrome(incognito=True)
280
- sb.goto("https://www.planetminecraft.com/account")
281
- sb.assert_element('input[name="login"]')
282
- sb.type('input[name="email"]', "test@example.com")
283
- sb.type('input[name="password"]', "Fake_Password")
284
- sb.click("input#autologin") # The checkbox
285
- if sb.is_element_visible("input[disabled]"):
286
- sb.solve_captcha() # Enables the input
287
- sb.assert_element_absent("input[disabled]")
288
- sb.sleep(1.5)
289
- sb.quit()
290
- ```
291
-
292
- ```
293
- python raw_cdp_planetmc.py
294
- ```
295
-
296
- <p align="left">
286
+ <p align="center">
297
287
  <img src="https://seleniumbase.github.io/other/pmc_captcha_2.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
288
+ <br /><em>(Cloudflare Turnstile bypassed successfully on Planet Minecraft)</em>
298
289
  </p>
299
290
 
291
+ --------
292
+
300
293
  ✅ <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If called when there's no CAPTCHA on the page, then nothing happens / no-op.)
301
294
 
302
- ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition to occur.
295
+ ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition.<br />(Raises an exception if the condition isn't met in time.)
303
296
 
304
297
  --------
305
298
 
@@ -812,7 +805,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
812
805
  self.type("input", "dogs\n") # (The "\n" presses ENTER)
813
806
  ```
814
807
 
815
- Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the `sb` pytest fixture can only be run with `pytest`. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank" rel="noopener">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
808
+ Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the `sb` pytest fixture can only be run with `pytest`. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/latest/gherkin/" target="_blank" rel="noopener">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
816
809
 
817
810
  ```zsh
818
811
  pytest coffee_cart_tests.py --rs
@@ -974,10 +967,15 @@ pytest test_coffee_cart.py --trace
974
967
  --sjw # (Skip JS Waits for readyState to be "complete" or Angular to load.)
975
968
  --wfa # (Wait for AngularJS to be done loading after specific web actions.)
976
969
  --pls=PLS # (Set pageLoadStrategy on Chrome: "normal", "eager", or "none".)
977
- --headless # (The default headless mode. Linux uses this mode by default.)
978
- --headless1 # (Use Chrome's old headless mode. Fast, but has limitations.)
979
- --headless2 # (Use Chrome's new headless mode, which supports extensions.)
970
+ --headless # (Use headless mode. Linux uses this mode by default.)
971
+ --chs # (Use Chrome-Headless-Shell, a limited Chrome without stealth.)
980
972
  --headed # (Run tests in headed/GUI mode on Linux OS, where not default.)
973
+ --incognito # (Enable Chrome's Incognito mode.)
974
+ --guest # (Enable Chrome's Guest mode.)
975
+ --uc # (Use undetected-chromedriver to evade bot-detection.)
976
+ --uc-cdp-events # (Capture CDP events in UC Mode. NOT related to CDP Mode.)
977
+ --log-cdp # ("goog:loggingPrefs", {"performance": "ALL", "browser": "ALL"})
978
+ --remote-debug # (Sync to Chrome Remote Debugger chrome://inspect/#devices)
981
979
  --xvfb # (Run tests using the Xvfb virtual display server on Linux OS.)
982
980
  --xvfb-metrics=STRING # (Set Xvfb display size on Linux: "Width,Height".)
983
981
  --locale=LOCALE_CODE # (Set the Language Locale Code for the web browser.)
@@ -1011,17 +1009,11 @@ pytest test_coffee_cart.py --trace
1011
1009
  --disable-ws # (Disable Web Security on Chromium-based browsers.)
1012
1010
  --enable-ws # (Enable Web Security on Chromium-based browsers.)
1013
1011
  --enable-sync # (Enable "Chrome Sync" on websites.)
1014
- --uc | --undetected # (Use undetected-chromedriver to evade bot-detection.)
1015
- --uc-cdp-events # (Capture CDP events when running in "--undetected" mode.)
1016
- --log-cdp # ("goog:loggingPrefs", {"performance": "ALL", "browser": "ALL"})
1017
- --remote-debug # (Sync to Chrome Remote Debugger chrome://inspect/#devices)
1018
1012
  --ftrace | --final-trace # (Debug Mode after each test. Don't use with CI!)
1019
1013
  --dashboard # (Enable the SeleniumBase Dashboard. Saved at: dashboard.html)
1020
1014
  --dash-title=STRING # (Set the title shown for the generated dashboard.)
1021
1015
  --enable-3d-apis # (Enables WebGL and 3D APIs.)
1022
1016
  --swiftshader # (Chrome "--use-gl=angle" / "--use-angle=swiftshader-webgl")
1023
- --incognito # (Enable Chrome's Incognito mode.)
1024
- --guest # (Enable Chrome's Guest mode.)
1025
1017
  --dark # (Enable Chrome's Dark mode.)
1026
1018
  --devtools # (Open Chrome's DevTools when the browser opens.)
1027
1019
  --rs | --reuse-session # (Reuse browser session for all tests.)
@@ -1590,21 +1582,13 @@ self.activate_jquery()
1590
1582
 
1591
1583
  ```python
1592
1584
  self.execute_script("jQuery, window.scrollTo(0, 600)") # Scrolling the page
1593
-
1594
1585
  self.execute_script("jQuery('#annoying-widget').hide()") # Hiding elements on a page
1595
-
1596
1586
  self.execute_script("jQuery('#hidden-widget').show(0)") # Showing hidden elements on a page
1597
-
1598
1587
  self.execute_script("jQuery('#annoying-button a').remove()") # Removing elements on a page
1599
-
1600
1588
  self.execute_script("jQuery('%s').mouseover()" % (mouse_over_item)) # Mouse-over elements on a page
1601
-
1602
1589
  self.execute_script("jQuery('input#the_id').val('my_text')") # Fast text input on a page
1603
-
1604
1590
  self.execute_script("jQuery('div#dropdown a.link').click()") # Click elements on a page
1605
-
1606
1591
  self.execute_script("return jQuery('div#amazing')[0].text") # Returns the css "text" of the element given
1607
-
1608
1592
  self.execute_script("return jQuery('textarea')[2].value") # Returns the css "value" of the 3rd textarea element on the page
1609
1593
  ```
1610
1594
 
@@ -15,7 +15,7 @@
15
15
  <p align="center"><b align="center">Includes stealth options for bypassing bot-detection and CAPTCHAs.<br /></b></p>
16
16
 
17
17
  <p align="center">
18
- <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_catalog-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 />
18
+ <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 />
19
19
  <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>
20
20
  </p>
21
21
 
@@ -66,20 +66,30 @@
66
66
 
67
67
  --------
68
68
 
69
- 📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_cdp_mode.py">an example</a> with <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp"><i>Pure CDP Mode</i></a>):<br /><em>(It bypasses both BrowserScan AND Sannysoft Bot-Detection)</em>
69
+ 📝 [This example](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_cdp_mode.py) uses <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (*[Pure CDP Mode](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#Pure_CDP_Mode)*):<br /><em>(It bypasses BrowserScan, Sannysoft, and Cloudflare bot-detection)</em>
70
70
 
71
71
  ```python
72
72
  from seleniumbase import sb_cdp
73
73
 
74
- sb = sb_cdp.Chrome()
74
+ sb = sb_cdp.Chrome() # Launch a stealth browser
75
75
  sb.goto("https://browserscan.net/bot-detection")
76
76
  sb.assert_element('strong:contains("Normal")')
77
77
  sb.sleep(1)
78
+
78
79
  sb.goto("https://bot.sannysoft.com/")
79
80
  sb.assert_element(".passed")
80
81
  sb.assert_element_not_visible(".failed")
81
82
  sb.sleep(1)
82
- sb.quit()
83
+
84
+ sb.goto("https://www.planetminecraft.com/account")
85
+ sb.type('[name="email"]', "Name123")
86
+ sb.type('[name="password"]', "Pass")
87
+ sb.click("input#autologin")
88
+ sb.solve_captcha() # Works on different CAPTCHAs
89
+ sb.assert_element('input[name="login"]')
90
+ sb.assert_element_not_visible("input[disabled]")
91
+ sb.sleep(1)
92
+ sb.quit() # Quit browser before end-of-program
83
93
  ```
84
94
 
85
95
  <p align="center">
@@ -92,37 +102,16 @@ sb.quit()
92
102
  <br /><em>(All Sannysoft bot-detection tests passed successfully)</em>
93
103
  </p>
94
104
 
95
- --------
96
-
97
- 📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py">another example</a> with <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp"><i>Pure CDP Mode</i></a>):<br />(It performs various browser actions and bypasses a Cloudflare Turnstile)
98
-
99
- ```python
100
- from seleniumbase import sb_cdp
101
-
102
- sb = sb_cdp.Chrome(incognito=True)
103
- sb.goto("https://www.planetminecraft.com/account")
104
- sb.assert_element('input[name="login"]')
105
- sb.type('input[name="email"]', "test@example.com")
106
- sb.type('input[name="password"]', "Fake_Password")
107
- sb.click("input#autologin") # The checkbox
108
- if sb.is_element_visible("input[disabled]"):
109
- sb.solve_captcha() # Enables the input
110
- sb.assert_element_absent("input[disabled]")
111
- sb.sleep(1.5)
112
- sb.quit()
113
- ```
114
-
115
- ```
116
- python raw_cdp_planetmc.py
117
- ```
118
-
119
- <p align="left">
105
+ <p align="center">
120
106
  <img src="https://seleniumbase.github.io/other/pmc_captcha_2.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
107
+ <br /><em>(Cloudflare Turnstile bypassed successfully on Planet Minecraft)</em>
121
108
  </p>
122
109
 
110
+ --------
111
+
123
112
  ✅ <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If called when there's no CAPTCHA on the page, then nothing happens / no-op.)
124
113
 
125
- ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition to occur.
114
+ ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition.<br />(Raises an exception if the condition isn't met in time.)
126
115
 
127
116
  --------
128
117
 
@@ -635,7 +624,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
635
624
  self.type("input", "dogs\n") # (The "\n" presses ENTER)
636
625
  ```
637
626
 
638
- Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the `sb` pytest fixture can only be run with `pytest`. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank" rel="noopener">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
627
+ Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the `sb` pytest fixture can only be run with `pytest`. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/latest/gherkin/" target="_blank" rel="noopener">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
639
628
 
640
629
  ```zsh
641
630
  pytest coffee_cart_tests.py --rs
@@ -797,10 +786,15 @@ pytest test_coffee_cart.py --trace
797
786
  --sjw # (Skip JS Waits for readyState to be "complete" or Angular to load.)
798
787
  --wfa # (Wait for AngularJS to be done loading after specific web actions.)
799
788
  --pls=PLS # (Set pageLoadStrategy on Chrome: "normal", "eager", or "none".)
800
- --headless # (The default headless mode. Linux uses this mode by default.)
801
- --headless1 # (Use Chrome's old headless mode. Fast, but has limitations.)
802
- --headless2 # (Use Chrome's new headless mode, which supports extensions.)
789
+ --headless # (Use headless mode. Linux uses this mode by default.)
790
+ --chs # (Use Chrome-Headless-Shell, a limited Chrome without stealth.)
803
791
  --headed # (Run tests in headed/GUI mode on Linux OS, where not default.)
792
+ --incognito # (Enable Chrome's Incognito mode.)
793
+ --guest # (Enable Chrome's Guest mode.)
794
+ --uc # (Use undetected-chromedriver to evade bot-detection.)
795
+ --uc-cdp-events # (Capture CDP events in UC Mode. NOT related to CDP Mode.)
796
+ --log-cdp # ("goog:loggingPrefs", {"performance": "ALL", "browser": "ALL"})
797
+ --remote-debug # (Sync to Chrome Remote Debugger chrome://inspect/#devices)
804
798
  --xvfb # (Run tests using the Xvfb virtual display server on Linux OS.)
805
799
  --xvfb-metrics=STRING # (Set Xvfb display size on Linux: "Width,Height".)
806
800
  --locale=LOCALE_CODE # (Set the Language Locale Code for the web browser.)
@@ -834,17 +828,11 @@ pytest test_coffee_cart.py --trace
834
828
  --disable-ws # (Disable Web Security on Chromium-based browsers.)
835
829
  --enable-ws # (Enable Web Security on Chromium-based browsers.)
836
830
  --enable-sync # (Enable "Chrome Sync" on websites.)
837
- --uc | --undetected # (Use undetected-chromedriver to evade bot-detection.)
838
- --uc-cdp-events # (Capture CDP events when running in "--undetected" mode.)
839
- --log-cdp # ("goog:loggingPrefs", {"performance": "ALL", "browser": "ALL"})
840
- --remote-debug # (Sync to Chrome Remote Debugger chrome://inspect/#devices)
841
831
  --ftrace | --final-trace # (Debug Mode after each test. Don't use with CI!)
842
832
  --dashboard # (Enable the SeleniumBase Dashboard. Saved at: dashboard.html)
843
833
  --dash-title=STRING # (Set the title shown for the generated dashboard.)
844
834
  --enable-3d-apis # (Enables WebGL and 3D APIs.)
845
835
  --swiftshader # (Chrome "--use-gl=angle" / "--use-angle=swiftshader-webgl")
846
- --incognito # (Enable Chrome's Incognito mode.)
847
- --guest # (Enable Chrome's Guest mode.)
848
836
  --dark # (Enable Chrome's Dark mode.)
849
837
  --devtools # (Open Chrome's DevTools when the browser opens.)
850
838
  --rs | --reuse-session # (Reuse browser session for all tests.)
@@ -1413,21 +1401,13 @@ self.activate_jquery()
1413
1401
 
1414
1402
  ```python
1415
1403
  self.execute_script("jQuery, window.scrollTo(0, 600)") # Scrolling the page
1416
-
1417
1404
  self.execute_script("jQuery('#annoying-widget').hide()") # Hiding elements on a page
1418
-
1419
1405
  self.execute_script("jQuery('#hidden-widget').show(0)") # Showing hidden elements on a page
1420
-
1421
1406
  self.execute_script("jQuery('#annoying-button a').remove()") # Removing elements on a page
1422
-
1423
1407
  self.execute_script("jQuery('%s').mouseover()" % (mouse_over_item)) # Mouse-over elements on a page
1424
-
1425
1408
  self.execute_script("jQuery('input#the_id').val('my_text')") # Fast text input on a page
1426
-
1427
1409
  self.execute_script("jQuery('div#dropdown a.link').click()") # Click elements on a page
1428
-
1429
1410
  self.execute_script("return jQuery('div#amazing')[0].text") # Returns the css "text" of the element given
1430
-
1431
1411
  self.execute_script("return jQuery('textarea')[2].value") # Returns the css "value" of the 3rd textarea element on the page
1432
1412
  ```
1433
1413
 
@@ -3,7 +3,7 @@ packaging>=26.3
3
3
  setuptools>=84.2.1
4
4
  wheel>=0.48.0
5
5
  attrs>=26.1.0
6
- certifi>=2026.10.19
6
+ certifi>=2026.10.23
7
7
  exceptiongroup>=1.3.1
8
8
  websockets~=16.1.1;python_version=="3.10"
9
9
  websockets>=17.3;python_version>="3.11"
@@ -56,7 +56,7 @@ 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~=3.0.3;python_version>="3.11.5"
59
+ soupsieve~=3.0.4;python_version>="3.11.5"
60
60
  beautifulsoup4~=4.15.0
61
61
  pyotp~=2.10.0
62
62
  python-xlib==0.33;platform_system=="Linux"
@@ -68,9 +68,12 @@ rich>=15.0.0,<16
68
68
  # --- Testing Requirements --- #
69
69
  # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
70
70
 
71
- coverage>=7.16.2
71
+ coverage>=7.16.2;python_version=="3.10"
72
+ coverage>=7.17.0;python_version>="3.11"
72
73
  pytest-cov>=7.1.0
73
- flake8==7.4.1
74
+ flake8==7.4.1;python_version=="3.10"
75
+ flake8==7.5.0;python_version>="3.11"
74
76
  mccabe==0.7.0
75
- pyflakes==4.0.3
77
+ pyflakes==4.0.3;python_version=="3.10"
78
+ pyflakes==4.1.0;python_version>="3.11"
76
79
  pycodestyle==2.15.0
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.56.3"
2
+ __version__ = "4.56.5"
@@ -1600,7 +1600,7 @@ class CDPMethods():
1600
1600
  pre_tab_url = tab_url.split("/page/")[0] + "/page/"
1601
1601
  new_tab_url = pre_tab_url + target_id
1602
1602
  new_tab = cdp_tab.Tab(new_tab_url, found_target, driver)
1603
- driver.targets.append(new_tab)
1603
+ # driver.targets.append(new_tab) # (Caused Issue #4533)
1604
1604
  driver.tabs.append(new_tab)
1605
1605
  if switch_to:
1606
1606
  self.switch_to_newest_tab()
@@ -7632,7 +7632,7 @@ class BaseCase(unittest.TestCase):
7632
7632
  link,
7633
7633
  allow_redirects=False,
7634
7634
  timeout=5,
7635
- verify=False,
7635
+ verify=True,
7636
7636
  ):
7637
7637
  """Get the status code of a link.
7638
7638
  If the timeout is set to less than 1, it becomes 1.
@@ -260,7 +260,7 @@ def _get_link_status_code(
260
260
  link,
261
261
  allow_redirects=False,
262
262
  timeout=5,
263
- verify=False,
263
+ verify=True,
264
264
  ):
265
265
  """Get the status code of a link.
266
266
  If the timeout is exceeded, will return a 404.
@@ -1268,7 +1268,8 @@ class Element:
1268
1268
  await self.tab.send(cdp.dom.disable())
1269
1269
  await self.tab.send(cdp.overlay.disable())
1270
1270
  return
1271
- await self.tab.send(cdp.dom.enable())
1271
+ with suppress(Exception):
1272
+ await self.tab.send(cdp.dom.enable())
1272
1273
  await self.tab.send(cdp.overlay.enable())
1273
1274
  conf = cdp.overlay.HighlightConfig(
1274
1275
  show_info=True, show_extension_lines=True, show_styles=True