seleniumbase 4.55.2__tar.gz → 4.56.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.55.2/seleniumbase.egg-info → seleniumbase-4.56.0}/PKG-INFO +69 -32
  2. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/README.md +59 -24
  3. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/requirements.txt +7 -5
  4. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/browser_launcher.py +31 -18
  6. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/sb_driver.py +3 -0
  7. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/page_actions.py +34 -16
  8. {seleniumbase-4.55.2 → seleniumbase-4.56.0/seleniumbase.egg-info}/PKG-INFO +69 -32
  9. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/requires.txt +9 -7
  10. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/setup.py +9 -7
  11. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/.gitignore +0 -0
  12. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/LICENSE +0 -0
  13. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/MANIFEST.in +0 -0
  14. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/install.sh +0 -0
  15. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/mcp_servers/__init__.py +0 -0
  16. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/mcp_servers/server.py +0 -0
  17. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/pyproject.toml +0 -0
  18. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/pytest.ini +0 -0
  19. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/sbase/steps.py +0 -0
  22. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/capabilities_parser.py +0 -0
  57. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/colored_traceback.py +0 -0
  58. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/create_db_tables.sql +0 -0
  59. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/detect_b_ver.py +0 -0
  60. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/download_helper.py +0 -0
  61. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/encoded_images.py +0 -0
  62. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/jqc_helper.py +0 -0
  63. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/log_helper.py +0 -0
  64. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/mysql.py +0 -0
  65. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/nest_asyncio.py +0 -0
  66. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/proxy_helper.py +0 -0
  67. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/recorder_helper.py +0 -0
  68. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/report_helper.py +0 -0
  69. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/s3_manager.py +0 -0
  70. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/sb_cdp.py +0 -0
  71. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/session_helper.py +0 -0
  72. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/settings_parser.py +0 -0
  73. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/style_sheet.py +0 -0
  74. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/testcase_manager.py +0 -0
  75. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/tour_helper.py +0 -0
  76. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/visual_helper.py +0 -0
  77. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/__init__.py +0 -0
  78. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  79. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  80. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  81. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  82. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  83. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  84. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/__init__.py +0 -0
  85. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/ad_block.zip +0 -0
  86. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/disable_csp.zip +0 -0
  87. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/recorder.zip +0 -0
  88. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/sbase_ext.zip +0 -0
  89. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/__init__.py +0 -0
  90. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/base_case.py +0 -0
  91. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/constants.py +0 -0
  92. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  93. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/errors.py +0 -0
  94. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/js_utils.py +0 -0
  95. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/page_utils.py +0 -0
  96. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/shared_utils.py +0 -0
  97. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/unittest_helper.py +0 -0
  98. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/words.py +0 -0
  99. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  100. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/js_code/__init__.py +0 -0
  101. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/js_code/active_css_js.py +0 -0
  102. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/js_code/live_js.py +0 -0
  103. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/js_code/recorder_js.py +0 -0
  104. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/masterqa/__init__.py +0 -0
  105. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/masterqa/master_qa.py +0 -0
  106. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/__init__.py +0 -0
  107. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/base_plugin.py +0 -0
  108. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/basic_test_info.py +0 -0
  109. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  110. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/driver_manager.py +0 -0
  111. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/page_source.py +0 -0
  112. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/pytest_plugin.py +0 -0
  113. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  114. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/sb_manager.py +0 -0
  115. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/screen_shots.py +0 -0
  116. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/selenium_plugin.py +0 -0
  117. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/setup.cfg +0 -0
  164. {seleniumbase-4.55.2 → seleniumbase-4.56.0}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.55.2
3
+ Version: 4.56.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
@@ -67,7 +67,7 @@ Requires-Dist: certifi>=2026.7.22
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>=16.1.1; python_version >= "3.11"
70
- Requires-Dist: filelock>=4.0.12
70
+ Requires-Dist: filelock>=4.1.0
71
71
  Requires-Dist: fasteners>=0.20
72
72
  Requires-Dist: mycdp>=1.4.0
73
73
  Requires-Dist: pynose>=1.5.5
@@ -76,7 +76,7 @@ Requires-Dist: sbvirtualdisplay>=1.4.0
76
76
  Requires-Dist: MarkupSafe>=3.0.4
77
77
  Requires-Dist: Jinja2>=3.1.6
78
78
  Requires-Dist: six>=1.17.0
79
- Requires-Dist: parse>=1.22.2
79
+ Requires-Dist: parse>=1.22.3
80
80
  Requires-Dist: parse-type>=0.6.6
81
81
  Requires-Dist: colorama>=0.4.6
82
82
  Requires-Dist: psutil>=7.2.2
@@ -96,8 +96,9 @@ Requires-Dist: trio<1,>=0.34.0
96
96
  Requires-Dist: trio-websocket~=0.12.2
97
97
  Requires-Dist: wsproto~=1.3.2
98
98
  Requires-Dist: websocket-client~=1.9.2
99
- Requires-Dist: selenium==4.50.0
100
- Requires-Dist: cssselect<2,>=1.5.0
99
+ Requires-Dist: selenium==4.51.0
100
+ Requires-Dist: cssselect~=1.5.0; python_version < "3.11"
101
+ Requires-Dist: cssselect<2,>=1.6.0; python_version >= "3.11"
101
102
  Requires-Dist: sortedcontainers==2.4.0
102
103
  Requires-Dist: execnet==2.1.2
103
104
  Requires-Dist: iniconfig~=2.3.1
@@ -112,7 +113,8 @@ Requires-Dist: pytest-rerunfailures==16.7; python_version >= "3.11"
112
113
  Requires-Dist: pytest-xdist==3.8.0
113
114
  Requires-Dist: parameterized==0.9.0
114
115
  Requires-Dist: behave==1.2.6
115
- Requires-Dist: soupsieve~=2.10.0
116
+ Requires-Dist: soupsieve~=2.10.0; python_version == "3.10"
117
+ Requires-Dist: soupsieve~=3.0.1; python_version >= "3.11"
116
118
  Requires-Dist: beautifulsoup4~=4.15.0
117
119
  Requires-Dist: pyotp~=2.10.0
118
120
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
@@ -140,7 +142,7 @@ Provides-Extra: pdfminer
140
142
  Requires-Dist: pdfminer.six==20260107; extra == "pdfminer"
141
143
  Requires-Dist: cryptography==50.0.2; extra == "pdfminer"
142
144
  Requires-Dist: cffi==2.1.1; extra == "pdfminer"
143
- Requires-Dist: pycparser==3.0; extra == "pdfminer"
145
+ Requires-Dist: pycparser==3.11; extra == "pdfminer"
144
146
  Provides-Extra: pillow
145
147
  Requires-Dist: Pillow>=12.3.0; extra == "pillow"
146
148
  Provides-Extra: pip-system-certs
@@ -154,7 +156,7 @@ Requires-Dist: pyee>=13.0.1; extra == "playwright"
154
156
  Provides-Extra: pyautogui
155
157
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
156
158
  Provides-Extra: uv
157
- Requires-Dist: uv>=0.12.23; extra == "uv"
159
+ Requires-Dist: uv>=0.13.0; extra == "uv"
158
160
  Dynamic: author
159
161
  Dynamic: author-email
160
162
  Dynamic: classifier
@@ -179,11 +181,11 @@ Dynamic: summary
179
181
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
180
182
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
181
183
 
182
- <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" width="400" /></a></p>
184
+ <h1 align="center">📊 SeleniumBase</h1>
183
185
 
184
- <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
186
+ <p><h3 align="center">One framework for browser automation, web scraping, and testing.<br /></h3></p>
185
187
 
186
- <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" 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> <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/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/Tests/badge.svg" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-F12345.svg?style=flat&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a></p>
188
+ <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><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"><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"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://img.shields.io/pepy/dt/seleniumbase?style=flat-square" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-f4c430.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-D124D8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><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://www.facebook.com/SeleniumBase/" target="_blank"> <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"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=000000" alt="SeleniumBase X Followers" height="20" /></a></p>
187
189
 
188
190
  <p align="center">
189
191
  <a href="#python_installation">🚀 Start</a> |
@@ -218,24 +220,17 @@ Dynamic: summary
218
220
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
219
221
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
220
222
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
221
- <br />
222
223
  </p>
223
224
 
224
225
  --------
225
226
 
226
- 🥷 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> / <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> can bypass bot-detection, handle CAPTCHAs, and call methods from the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome Devtools Protocol</a>. CDP Mode includes <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>, which makes Playwright stealthy.
227
-
228
- 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
227
+ 🥷 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and the newer <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> makes your automation undetectable to anti-bot services. <b>CDP Mode</b> also <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">adds <b>stealth</b> to stock Playwright</span></a>.
229
228
 
230
- 🐙 CDP Mode (stealth) examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
231
-
232
- 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
233
-
234
- 📚 Examples that have `test_` or `_test` in the filename are specifically designed to run with `pytest` / `pynose`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
229
+ 📚 Example scripts that start or end with "<code>test</code>" are specifically designed to be run with <code><b>pytest</b></code>. Other scripts run directly with raw <code><b>python</b></code>. (Those start with "<code>raw</code>" to avoid confusion.)
235
230
 
236
231
  --------
237
232
 
238
- <b>📝 Here's a Python <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py" target="_blank">example</a> that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Planet Minecraft where it bypasses the CAPTCHA)
233
+ <b>📝 Here's a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py" target="_blank">Python script</a> that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It performs actions such as typing, clicking, and bypassing a Cloudflare Turnstile)
239
234
 
240
235
  ```python
241
236
  from seleniumbase import sb_cdp
@@ -253,7 +248,9 @@ sb.sleep(1.5)
253
248
  sb.quit()
254
249
  ```
255
250
 
256
- > `python raw_cdp_planetmc.py`
251
+ ```
252
+ python raw_cdp_planetmc.py
253
+ ```
257
254
 
258
255
  <p align="left">
259
256
  <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" />
@@ -261,9 +258,11 @@ sb.quit()
261
258
 
262
259
  ✅ <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.)
263
260
 
261
+ ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition to occur.
262
+
264
263
  --------
265
264
 
266
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This example</a> scrapes Hacker News listings:</b></p>
265
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This script</a> scrapes Hacker News listings:</b></p>
267
266
 
268
267
  ```python
269
268
  from seleniumbase import sb_cdp
@@ -275,7 +274,9 @@ for element in elements:
275
274
  print("* " + element.text)
276
275
  ```
277
276
 
278
- > `python raw_cdp_yc_news.py`
277
+ ```
278
+ python raw_cdp_yc_news.py
279
+ ```
279
280
 
280
281
  <p align="left">
281
282
  <img src="https://seleniumbase.github.io/other/yc_news_results.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
@@ -283,7 +284,7 @@ for element in elements:
283
284
 
284
285
  --------
285
286
 
286
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
287
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This script</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
287
288
 
288
289
  ```python
289
290
  from seleniumbase import SB
@@ -297,7 +298,9 @@ with SB(uc=True, test=True, locale="en") as sb:
297
298
  sb.highlight('button:contains("Sign in")')
298
299
  ```
299
300
 
300
- > `python raw_gitlab.py`
301
+ ```
302
+ python raw_gitlab.py
303
+ ```
301
304
 
302
305
  <p align="left">
303
306
  <img src="https://seleniumbase.github.io/other/gitlab_bypass_2.png" alt="SeleniumBase" width="420" style="max-width: 100% !important; height: auto !important;"/>
@@ -305,6 +308,14 @@ with SB(uc=True, test=True, locale="en") as sb:
305
308
 
306
309
  --------
307
310
 
311
+ 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
312
+
313
+ 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
314
+
315
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
316
+
317
+ --------
318
+
308
319
  <h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
309
320
 
310
321
  <p>💡 You can set which Chromium browser to use via command-line parameters:</p>
@@ -328,13 +339,13 @@ sb = sb_cdp.Chrome(use_chromium=True)
328
339
 
329
340
  <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
330
341
 
331
- <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="540" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
342
+ <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
332
343
 
333
344
  --------
334
345
 
335
346
  <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
336
347
 
337
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This example</a> tests an e-commerce site with <code>pytest</code>:</b></p>
348
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This script</a> tests an e-commerce site with <code>pytest</code>:</b></p>
338
349
 
339
350
  ```python
340
351
  from seleniumbase import BaseCase
@@ -358,7 +369,9 @@ class MyTestClass(BaseCase):
358
369
  self.assert_text("Thank you for your order!")
359
370
  ```
360
371
 
361
- > `pytest test_get_swag.py`
372
+ ```
373
+ pytest test_get_swag.py
374
+ ```
362
375
 
363
376
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" width="500" style="max-width: 100% !important; height: auto !important;" /></a>
364
377
 
@@ -366,7 +379,31 @@ class MyTestClass(BaseCase):
366
379
 
367
380
  --------
368
381
 
369
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This example</a> tests another e-commerce site with <code>pytest</code>:</b></p>
382
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This script</a> tests a different e-commerce site with <code>pytest</code>:</b></p>
383
+
384
+ ```python
385
+ from seleniumbase import BaseCase
386
+ BaseCase.main(__name__, __file__)
387
+
388
+ class CoffeeCartTest(BaseCase):
389
+ def test_coffee_cart(self):
390
+ self.goto("https://seleniumbase.io/coffee/")
391
+ self.assert_title("Coffee Cart")
392
+ self.assert_element('button:contains("Total: $0.00")')
393
+ self.click('div[data-sb="Cappuccino"]')
394
+ self.assert_exact_text("cart (1)", 'a[aria-label="Cart page"]')
395
+ self.click('div[data-sb="Flat-White"]')
396
+ self.assert_exact_text("cart (2)", 'a[aria-label="Cart page"]')
397
+ self.click('div[data-sb="Cafe-Latte"]')
398
+ self.assert_exact_text("cart (3)", 'a[aria-label="Cart page"]')
399
+ self.click('a[aria-label="Cart page"]')
400
+ self.assert_exact_text("Total: $53.00", "button.pay")
401
+ self.click("button.pay")
402
+ self.type("input#name", "Selenium Coffee")
403
+ self.type("input#email", "test@test.test")
404
+ self.click("button#submit-payment")
405
+ self.assert_text("Thanks for your purchase.", "#app .success")
406
+ ```
370
407
 
371
408
  ```zsh
372
409
  pytest test_coffee_cart.py --demo
@@ -380,7 +417,7 @@ pytest test_coffee_cart.py --demo
380
417
 
381
418
  <a id="multiple_examples"></a>
382
419
 
383
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This example</a> covers multiple actions with <code>pytest</code>:</b></p>
420
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This script</a> covers multiple actions with <code>pytest</code>:</b></p>
384
421
 
385
422
  ```zsh
386
423
  pytest test_demo_site.py
@@ -390,7 +427,7 @@ pytest test_demo_site.py
390
427
 
391
428
  > Easy to type, click, select, toggle, drag & drop, and more.
392
429
 
393
- 📚 For more examples, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
430
+ 📚 For more scripts, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
394
431
 
395
432
  --------
396
433
 
@@ -8,11 +8,11 @@
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
- <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" width="400" /></a></p>
11
+ <h1 align="center">📊 SeleniumBase</h1>
12
12
 
13
- <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
13
+ <p><h3 align="center">One framework for browser automation, web scraping, and testing.<br /></h3></p>
14
14
 
15
- <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" 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> <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/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/Tests/badge.svg" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-F12345.svg?style=flat&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a></p>
15
+ <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><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"><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"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://img.shields.io/pepy/dt/seleniumbase?style=flat-square" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-f4c430.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-D124D8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><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://www.facebook.com/SeleniumBase/" target="_blank"> <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"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=000000" alt="SeleniumBase X Followers" height="20" /></a></p>
16
16
 
17
17
  <p align="center">
18
18
  <a href="#python_installation">🚀 Start</a> |
@@ -47,24 +47,17 @@
47
47
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
48
48
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
49
49
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
50
- <br />
51
50
  </p>
52
51
 
53
52
  --------
54
53
 
55
- 🥷 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> / <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> can bypass bot-detection, handle CAPTCHAs, and call methods from the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome Devtools Protocol</a>. CDP Mode includes <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>, which makes Playwright stealthy.
56
-
57
- 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
54
+ 🥷 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and the newer <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> makes your automation undetectable to anti-bot services. <b>CDP Mode</b> also <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">adds <b>stealth</b> to stock Playwright</span></a>.
58
55
 
59
- 🐙 CDP Mode (stealth) examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
60
-
61
- 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
62
-
63
- 📚 Examples that have `test_` or `_test` in the filename are specifically designed to run with `pytest` / `pynose`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
56
+ 📚 Example scripts that start or end with "<code>test</code>" are specifically designed to be run with <code><b>pytest</b></code>. Other scripts run directly with raw <code><b>python</b></code>. (Those start with "<code>raw</code>" to avoid confusion.)
64
57
 
65
58
  --------
66
59
 
67
- <b>📝 Here's a Python <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py" target="_blank">example</a> that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Planet Minecraft where it bypasses the CAPTCHA)
60
+ <b>📝 Here's a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py" target="_blank">Python script</a> that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It performs actions such as typing, clicking, and bypassing a Cloudflare Turnstile)
68
61
 
69
62
  ```python
70
63
  from seleniumbase import sb_cdp
@@ -82,7 +75,9 @@ sb.sleep(1.5)
82
75
  sb.quit()
83
76
  ```
84
77
 
85
- > `python raw_cdp_planetmc.py`
78
+ ```
79
+ python raw_cdp_planetmc.py
80
+ ```
86
81
 
87
82
  <p align="left">
88
83
  <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" />
@@ -90,9 +85,11 @@ sb.quit()
90
85
 
91
86
  ✅ <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.)
92
87
 
88
+ ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition to occur.
89
+
93
90
  --------
94
91
 
95
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This example</a> scrapes Hacker News listings:</b></p>
92
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This script</a> scrapes Hacker News listings:</b></p>
96
93
 
97
94
  ```python
98
95
  from seleniumbase import sb_cdp
@@ -104,7 +101,9 @@ for element in elements:
104
101
  print("* " + element.text)
105
102
  ```
106
103
 
107
- > `python raw_cdp_yc_news.py`
104
+ ```
105
+ python raw_cdp_yc_news.py
106
+ ```
108
107
 
109
108
  <p align="left">
110
109
  <img src="https://seleniumbase.github.io/other/yc_news_results.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
@@ -112,7 +111,7 @@ for element in elements:
112
111
 
113
112
  --------
114
113
 
115
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
114
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This script</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
116
115
 
117
116
  ```python
118
117
  from seleniumbase import SB
@@ -126,7 +125,9 @@ with SB(uc=True, test=True, locale="en") as sb:
126
125
  sb.highlight('button:contains("Sign in")')
127
126
  ```
128
127
 
129
- > `python raw_gitlab.py`
128
+ ```
129
+ python raw_gitlab.py
130
+ ```
130
131
 
131
132
  <p align="left">
132
133
  <img src="https://seleniumbase.github.io/other/gitlab_bypass_2.png" alt="SeleniumBase" width="420" style="max-width: 100% !important; height: auto !important;"/>
@@ -134,6 +135,14 @@ with SB(uc=True, test=True, locale="en") as sb:
134
135
 
135
136
  --------
136
137
 
138
+ 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
139
+
140
+ 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
141
+
142
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
143
+
144
+ --------
145
+
137
146
  <h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
138
147
 
139
148
  <p>💡 You can set which Chromium browser to use via command-line parameters:</p>
@@ -157,13 +166,13 @@ sb = sb_cdp.Chrome(use_chromium=True)
157
166
 
158
167
  <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
159
168
 
160
- <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="540" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
169
+ <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
161
170
 
162
171
  --------
163
172
 
164
173
  <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
165
174
 
166
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This example</a> tests an e-commerce site with <code>pytest</code>:</b></p>
175
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This script</a> tests an e-commerce site with <code>pytest</code>:</b></p>
167
176
 
168
177
  ```python
169
178
  from seleniumbase import BaseCase
@@ -187,7 +196,9 @@ class MyTestClass(BaseCase):
187
196
  self.assert_text("Thank you for your order!")
188
197
  ```
189
198
 
190
- > `pytest test_get_swag.py`
199
+ ```
200
+ pytest test_get_swag.py
201
+ ```
191
202
 
192
203
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" width="500" style="max-width: 100% !important; height: auto !important;" /></a>
193
204
 
@@ -195,7 +206,31 @@ class MyTestClass(BaseCase):
195
206
 
196
207
  --------
197
208
 
198
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This example</a> tests another e-commerce site with <code>pytest</code>:</b></p>
209
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This script</a> tests a different e-commerce site with <code>pytest</code>:</b></p>
210
+
211
+ ```python
212
+ from seleniumbase import BaseCase
213
+ BaseCase.main(__name__, __file__)
214
+
215
+ class CoffeeCartTest(BaseCase):
216
+ def test_coffee_cart(self):
217
+ self.goto("https://seleniumbase.io/coffee/")
218
+ self.assert_title("Coffee Cart")
219
+ self.assert_element('button:contains("Total: $0.00")')
220
+ self.click('div[data-sb="Cappuccino"]')
221
+ self.assert_exact_text("cart (1)", 'a[aria-label="Cart page"]')
222
+ self.click('div[data-sb="Flat-White"]')
223
+ self.assert_exact_text("cart (2)", 'a[aria-label="Cart page"]')
224
+ self.click('div[data-sb="Cafe-Latte"]')
225
+ self.assert_exact_text("cart (3)", 'a[aria-label="Cart page"]')
226
+ self.click('a[aria-label="Cart page"]')
227
+ self.assert_exact_text("Total: $53.00", "button.pay")
228
+ self.click("button.pay")
229
+ self.type("input#name", "Selenium Coffee")
230
+ self.type("input#email", "test@test.test")
231
+ self.click("button#submit-payment")
232
+ self.assert_text("Thanks for your purchase.", "#app .success")
233
+ ```
199
234
 
200
235
  ```zsh
201
236
  pytest test_coffee_cart.py --demo
@@ -209,7 +244,7 @@ pytest test_coffee_cart.py --demo
209
244
 
210
245
  <a id="multiple_examples"></a>
211
246
 
212
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This example</a> covers multiple actions with <code>pytest</code>:</b></p>
247
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This script</a> covers multiple actions with <code>pytest</code>:</b></p>
213
248
 
214
249
  ```zsh
215
250
  pytest test_demo_site.py
@@ -219,7 +254,7 @@ pytest test_demo_site.py
219
254
 
220
255
  > Easy to type, click, select, toggle, drag & drop, and more.
221
256
 
222
- 📚 For more examples, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
257
+ 📚 For more scripts, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
223
258
 
224
259
  --------
225
260
 
@@ -7,7 +7,7 @@ certifi>=2026.7.22
7
7
  exceptiongroup>=1.3.1
8
8
  websockets~=16.1.1;python_version=="3.10"
9
9
  websockets>=16.1.1;python_version>="3.11"
10
- filelock>=4.0.12
10
+ filelock>=4.1.0
11
11
  fasteners>=0.20
12
12
  mycdp>=1.4.0
13
13
  pynose>=1.5.5
@@ -16,7 +16,7 @@ sbvirtualdisplay>=1.4.0
16
16
  MarkupSafe>=3.0.4
17
17
  Jinja2>=3.1.6
18
18
  six>=1.17.0
19
- parse>=1.22.2
19
+ parse>=1.22.3
20
20
  parse-type>=0.6.6
21
21
  colorama>=0.4.6
22
22
  psutil>=7.2.2
@@ -36,8 +36,9 @@ trio>=0.34.0,<1
36
36
  trio-websocket~=0.12.2
37
37
  wsproto~=1.3.2
38
38
  websocket-client~=1.9.2
39
- selenium==4.50.0
40
- cssselect>=1.5.0,<2
39
+ selenium==4.51.0
40
+ cssselect~=1.5.0;python_version<"3.11"
41
+ cssselect>=1.6.0,<2;python_version>="3.11"
41
42
  sortedcontainers==2.4.0
42
43
  execnet==2.1.2
43
44
  iniconfig~=2.3.1
@@ -52,7 +53,8 @@ pytest-rerunfailures==16.7;python_version>="3.11"
52
53
  pytest-xdist==3.8.0
53
54
  parameterized==0.9.0
54
55
  behave==1.2.6
55
- soupsieve~=2.10.0
56
+ soupsieve~=2.10.0;python_version=="3.10"
57
+ soupsieve~=3.0.1;python_version>="3.11"
56
58
  beautifulsoup4~=4.15.0
57
59
  pyotp~=2.10.0
58
60
  python-xlib==0.33;platform_system=="Linux"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.55.2"
2
+ __version__ = "4.56.0"