seleniumbase 4.55.2__tar.gz → 4.56.1__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.1}/PKG-INFO +72 -32
  2. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/README.md +61 -24
  3. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/requirements.txt +8 -5
  4. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/browser_launcher.py +31 -18
  6. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/sb_driver.py +3 -0
  7. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/page_actions.py +34 -16
  8. {seleniumbase-4.55.2 → seleniumbase-4.56.1/seleniumbase.egg-info}/PKG-INFO +72 -32
  9. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase.egg-info/requires.txt +14 -7
  10. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/setup.py +10 -7
  11. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/.gitignore +0 -0
  12. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/LICENSE +0 -0
  13. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/MANIFEST.in +0 -0
  14. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/install.sh +0 -0
  15. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/mcp_servers/__init__.py +0 -0
  16. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/mcp_servers/server.py +0 -0
  17. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/pyproject.toml +0 -0
  18. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/pytest.ini +0 -0
  19. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/sbase/steps.py +0 -0
  22. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/capabilities_parser.py +0 -0
  57. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/colored_traceback.py +0 -0
  58. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/create_db_tables.sql +0 -0
  59. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/detect_b_ver.py +0 -0
  60. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/download_helper.py +0 -0
  61. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/encoded_images.py +0 -0
  62. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/jqc_helper.py +0 -0
  63. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/log_helper.py +0 -0
  64. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/mysql.py +0 -0
  65. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/nest_asyncio.py +0 -0
  66. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/proxy_helper.py +0 -0
  67. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/recorder_helper.py +0 -0
  68. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/report_helper.py +0 -0
  69. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/s3_manager.py +0 -0
  70. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/sb_cdp.py +0 -0
  71. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/session_helper.py +0 -0
  72. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/settings_parser.py +0 -0
  73. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/style_sheet.py +0 -0
  74. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/testcase_manager.py +0 -0
  75. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/tour_helper.py +0 -0
  76. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/core/visual_helper.py +0 -0
  77. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/drivers/__init__.py +0 -0
  78. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  79. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  80. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  81. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  82. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  83. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  84. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/extensions/__init__.py +0 -0
  85. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/extensions/ad_block.zip +0 -0
  86. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/extensions/disable_csp.zip +0 -0
  87. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/extensions/recorder.zip +0 -0
  88. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
  89. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/__init__.py +0 -0
  90. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/base_case.py +0 -0
  91. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/constants.py +0 -0
  92. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  93. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/errors.py +0 -0
  94. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/js_utils.py +0 -0
  95. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/page_utils.py +0 -0
  96. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/shared_utils.py +0 -0
  97. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
  98. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/words.py +0 -0
  99. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  100. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/js_code/__init__.py +0 -0
  101. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/js_code/active_css_js.py +0 -0
  102. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/js_code/live_js.py +0 -0
  103. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/js_code/recorder_js.py +0 -0
  104. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/masterqa/__init__.py +0 -0
  105. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/masterqa/master_qa.py +0 -0
  106. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/__init__.py +0 -0
  107. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/base_plugin.py +0 -0
  108. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/basic_test_info.py +0 -0
  109. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  110. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/driver_manager.py +0 -0
  111. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/page_source.py +0 -0
  112. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/pytest_plugin.py +0 -0
  113. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  114. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/sb_manager.py +0 -0
  115. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/screen_shots.py +0 -0
  116. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/plugins/selenium_plugin.py +0 -0
  117. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/setup.cfg +0 -0
  164. {seleniumbase-4.55.2 → seleniumbase-4.56.1}/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.1
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,8 @@ 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; python_version == "3.10"
71
+ Requires-Dist: filelock>=4.1.1; python_version >= "3.11"
71
72
  Requires-Dist: fasteners>=0.20
72
73
  Requires-Dist: mycdp>=1.4.0
73
74
  Requires-Dist: pynose>=1.5.5
@@ -76,7 +77,7 @@ Requires-Dist: sbvirtualdisplay>=1.4.0
76
77
  Requires-Dist: MarkupSafe>=3.0.4
77
78
  Requires-Dist: Jinja2>=3.1.6
78
79
  Requires-Dist: six>=1.17.0
79
- Requires-Dist: parse>=1.22.2
80
+ Requires-Dist: parse>=1.22.3
80
81
  Requires-Dist: parse-type>=0.6.6
81
82
  Requires-Dist: colorama>=0.4.6
82
83
  Requires-Dist: psutil>=7.2.2
@@ -96,8 +97,9 @@ Requires-Dist: trio<1,>=0.34.0
96
97
  Requires-Dist: trio-websocket~=0.12.2
97
98
  Requires-Dist: wsproto~=1.3.2
98
99
  Requires-Dist: websocket-client~=1.9.2
99
- Requires-Dist: selenium==4.50.0
100
- Requires-Dist: cssselect<2,>=1.5.0
100
+ Requires-Dist: selenium==4.51.0
101
+ Requires-Dist: cssselect~=1.5.0; python_version < "3.11"
102
+ Requires-Dist: cssselect<2,>=1.6.0; python_version >= "3.11"
101
103
  Requires-Dist: sortedcontainers==2.4.0
102
104
  Requires-Dist: execnet==2.1.2
103
105
  Requires-Dist: iniconfig~=2.3.1
@@ -112,7 +114,8 @@ Requires-Dist: pytest-rerunfailures==16.7; python_version >= "3.11"
112
114
  Requires-Dist: pytest-xdist==3.8.0
113
115
  Requires-Dist: parameterized==0.9.0
114
116
  Requires-Dist: behave==1.2.6
115
- Requires-Dist: soupsieve~=2.10.0
117
+ Requires-Dist: soupsieve~=2.10.0; python_version < "3.11.5"
118
+ Requires-Dist: soupsieve~=3.0.3; python_version >= "3.11.5"
116
119
  Requires-Dist: beautifulsoup4~=4.15.0
117
120
  Requires-Dist: pyotp~=2.10.0
118
121
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
@@ -140,7 +143,7 @@ Provides-Extra: pdfminer
140
143
  Requires-Dist: pdfminer.six==20260107; extra == "pdfminer"
141
144
  Requires-Dist: cryptography==50.0.2; extra == "pdfminer"
142
145
  Requires-Dist: cffi==2.1.1; extra == "pdfminer"
143
- Requires-Dist: pycparser==3.0; extra == "pdfminer"
146
+ Requires-Dist: pycparser==3.11; extra == "pdfminer"
144
147
  Provides-Extra: pillow
145
148
  Requires-Dist: Pillow>=12.3.0; extra == "pillow"
146
149
  Provides-Extra: pip-system-certs
@@ -154,7 +157,7 @@ Requires-Dist: pyee>=13.0.1; extra == "playwright"
154
157
  Provides-Extra: pyautogui
155
158
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
156
159
  Provides-Extra: uv
157
- Requires-Dist: uv>=0.12.23; extra == "uv"
160
+ Requires-Dist: uv>=0.13.0; extra == "uv"
158
161
  Dynamic: author
159
162
  Dynamic: author-email
160
163
  Dynamic: classifier
@@ -179,11 +182,13 @@ Dynamic: summary
179
182
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
180
183
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
181
184
 
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>
185
+ <h1 align="center">📊 SeleniumBase</h1>
183
186
 
184
- <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
187
+ <p><h3 align="center">One framework for browser automation, web scraping, and testing.<br /></h3></p>
185
188
 
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>
189
+ <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">
190
+ <img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" />
191
+ </a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-F4C246.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=555555" alt="SeleniumBase X Followers" height="20" /></a></p>
187
192
 
188
193
  <p align="center">
189
194
  <a href="#python_installation">🚀 Start</a> |
@@ -218,24 +223,17 @@ Dynamic: summary
218
223
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
219
224
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
220
225
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
221
- <br />
222
226
  </p>
223
227
 
224
228
  --------
225
229
 
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).
230
+ 🥷 <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
231
 
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).
232
+ 📚 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
233
 
236
234
  --------
237
235
 
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)
236
+ <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
237
 
240
238
  ```python
241
239
  from seleniumbase import sb_cdp
@@ -253,7 +251,9 @@ sb.sleep(1.5)
253
251
  sb.quit()
254
252
  ```
255
253
 
256
- > `python raw_cdp_planetmc.py`
254
+ ```
255
+ python raw_cdp_planetmc.py
256
+ ```
257
257
 
258
258
  <p align="left">
259
259
  <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 +261,11 @@ sb.quit()
261
261
 
262
262
  ✅ <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
263
 
264
+ ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition to occur.
265
+
264
266
  --------
265
267
 
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>
268
+ <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
269
 
268
270
  ```python
269
271
  from seleniumbase import sb_cdp
@@ -275,7 +277,9 @@ for element in elements:
275
277
  print("* " + element.text)
276
278
  ```
277
279
 
278
- > `python raw_cdp_yc_news.py`
280
+ ```
281
+ python raw_cdp_yc_news.py
282
+ ```
279
283
 
280
284
  <p align="left">
281
285
  <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 +287,7 @@ for element in elements:
283
287
 
284
288
  --------
285
289
 
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>
290
+ <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
291
 
288
292
  ```python
289
293
  from seleniumbase import SB
@@ -297,7 +301,9 @@ with SB(uc=True, test=True, locale="en") as sb:
297
301
  sb.highlight('button:contains("Sign in")')
298
302
  ```
299
303
 
300
- > `python raw_gitlab.py`
304
+ ```
305
+ python raw_gitlab.py
306
+ ```
301
307
 
302
308
  <p align="left">
303
309
  <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 +311,14 @@ with SB(uc=True, test=True, locale="en") as sb:
305
311
 
306
312
  --------
307
313
 
314
+ 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
315
+
316
+ 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
317
+
318
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
319
+
320
+ --------
321
+
308
322
  <h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
309
323
 
310
324
  <p>💡 You can set which Chromium browser to use via command-line parameters:</p>
@@ -328,13 +342,13 @@ sb = sb_cdp.Chrome(use_chromium=True)
328
342
 
329
343
  <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
330
344
 
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" />
345
+ <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
346
 
333
347
  --------
334
348
 
335
349
  <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
336
350
 
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>
351
+ <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
352
 
339
353
  ```python
340
354
  from seleniumbase import BaseCase
@@ -358,7 +372,9 @@ class MyTestClass(BaseCase):
358
372
  self.assert_text("Thank you for your order!")
359
373
  ```
360
374
 
361
- > `pytest test_get_swag.py`
375
+ ```
376
+ pytest test_get_swag.py
377
+ ```
362
378
 
363
379
  <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
380
 
@@ -366,7 +382,31 @@ class MyTestClass(BaseCase):
366
382
 
367
383
  --------
368
384
 
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>
385
+ <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>
386
+
387
+ ```python
388
+ from seleniumbase import BaseCase
389
+ BaseCase.main(__name__, __file__)
390
+
391
+ class CoffeeCartTest(BaseCase):
392
+ def test_coffee_cart(self):
393
+ self.goto("https://seleniumbase.io/coffee/")
394
+ self.assert_title("Coffee Cart")
395
+ self.assert_element('button:contains("Total: $0.00")')
396
+ self.click('div[data-sb="Cappuccino"]')
397
+ self.assert_exact_text("cart (1)", 'a[aria-label="Cart page"]')
398
+ self.click('div[data-sb="Flat-White"]')
399
+ self.assert_exact_text("cart (2)", 'a[aria-label="Cart page"]')
400
+ self.click('div[data-sb="Cafe-Latte"]')
401
+ self.assert_exact_text("cart (3)", 'a[aria-label="Cart page"]')
402
+ self.click('a[aria-label="Cart page"]')
403
+ self.assert_exact_text("Total: $53.00", "button.pay")
404
+ self.click("button.pay")
405
+ self.type("input#name", "Selenium Coffee")
406
+ self.type("input#email", "test@test.test")
407
+ self.click("button#submit-payment")
408
+ self.assert_text("Thanks for your purchase.", "#app .success")
409
+ ```
370
410
 
371
411
  ```zsh
372
412
  pytest test_coffee_cart.py --demo
@@ -380,7 +420,7 @@ pytest test_coffee_cart.py --demo
380
420
 
381
421
  <a id="multiple_examples"></a>
382
422
 
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>
423
+ <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
424
 
385
425
  ```zsh
386
426
  pytest test_demo_site.py
@@ -390,7 +430,7 @@ pytest test_demo_site.py
390
430
 
391
431
  > Easy to type, click, select, toggle, drag & drop, and more.
392
432
 
393
- 📚 For more examples, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
433
+ 📚 For more scripts, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
394
434
 
395
435
  --------
396
436
 
@@ -8,11 +8,13 @@
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">
16
+ <img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" />
17
+ </a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-F4C246.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=555555" alt="SeleniumBase X Followers" height="20" /></a></p>
16
18
 
17
19
  <p align="center">
18
20
  <a href="#python_installation">🚀 Start</a> |
@@ -47,24 +49,17 @@
47
49
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
48
50
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
49
51
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
50
- <br />
51
52
  </p>
52
53
 
53
54
  --------
54
55
 
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).
56
+ 🥷 <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
57
 
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).
58
+ 📚 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
59
 
65
60
  --------
66
61
 
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)
62
+ <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
63
 
69
64
  ```python
70
65
  from seleniumbase import sb_cdp
@@ -82,7 +77,9 @@ sb.sleep(1.5)
82
77
  sb.quit()
83
78
  ```
84
79
 
85
- > `python raw_cdp_planetmc.py`
80
+ ```
81
+ python raw_cdp_planetmc.py
82
+ ```
86
83
 
87
84
  <p align="left">
88
85
  <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 +87,11 @@ sb.quit()
90
87
 
91
88
  ✅ <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
89
 
90
+ ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition to occur.
91
+
93
92
  --------
94
93
 
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>
94
+ <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
95
 
97
96
  ```python
98
97
  from seleniumbase import sb_cdp
@@ -104,7 +103,9 @@ for element in elements:
104
103
  print("* " + element.text)
105
104
  ```
106
105
 
107
- > `python raw_cdp_yc_news.py`
106
+ ```
107
+ python raw_cdp_yc_news.py
108
+ ```
108
109
 
109
110
  <p align="left">
110
111
  <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 +113,7 @@ for element in elements:
112
113
 
113
114
  --------
114
115
 
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>
116
+ <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
117
 
117
118
  ```python
118
119
  from seleniumbase import SB
@@ -126,7 +127,9 @@ with SB(uc=True, test=True, locale="en") as sb:
126
127
  sb.highlight('button:contains("Sign in")')
127
128
  ```
128
129
 
129
- > `python raw_gitlab.py`
130
+ ```
131
+ python raw_gitlab.py
132
+ ```
130
133
 
131
134
  <p align="left">
132
135
  <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 +137,14 @@ with SB(uc=True, test=True, locale="en") as sb:
134
137
 
135
138
  --------
136
139
 
140
+ 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
141
+
142
+ 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
143
+
144
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
145
+
146
+ --------
147
+
137
148
  <h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
138
149
 
139
150
  <p>💡 You can set which Chromium browser to use via command-line parameters:</p>
@@ -157,13 +168,13 @@ sb = sb_cdp.Chrome(use_chromium=True)
157
168
 
158
169
  <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
159
170
 
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" />
171
+ <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
172
 
162
173
  --------
163
174
 
164
175
  <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
165
176
 
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>
177
+ <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
178
 
168
179
  ```python
169
180
  from seleniumbase import BaseCase
@@ -187,7 +198,9 @@ class MyTestClass(BaseCase):
187
198
  self.assert_text("Thank you for your order!")
188
199
  ```
189
200
 
190
- > `pytest test_get_swag.py`
201
+ ```
202
+ pytest test_get_swag.py
203
+ ```
191
204
 
192
205
  <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
206
 
@@ -195,7 +208,31 @@ class MyTestClass(BaseCase):
195
208
 
196
209
  --------
197
210
 
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>
211
+ <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>
212
+
213
+ ```python
214
+ from seleniumbase import BaseCase
215
+ BaseCase.main(__name__, __file__)
216
+
217
+ class CoffeeCartTest(BaseCase):
218
+ def test_coffee_cart(self):
219
+ self.goto("https://seleniumbase.io/coffee/")
220
+ self.assert_title("Coffee Cart")
221
+ self.assert_element('button:contains("Total: $0.00")')
222
+ self.click('div[data-sb="Cappuccino"]')
223
+ self.assert_exact_text("cart (1)", 'a[aria-label="Cart page"]')
224
+ self.click('div[data-sb="Flat-White"]')
225
+ self.assert_exact_text("cart (2)", 'a[aria-label="Cart page"]')
226
+ self.click('div[data-sb="Cafe-Latte"]')
227
+ self.assert_exact_text("cart (3)", 'a[aria-label="Cart page"]')
228
+ self.click('a[aria-label="Cart page"]')
229
+ self.assert_exact_text("Total: $53.00", "button.pay")
230
+ self.click("button.pay")
231
+ self.type("input#name", "Selenium Coffee")
232
+ self.type("input#email", "test@test.test")
233
+ self.click("button#submit-payment")
234
+ self.assert_text("Thanks for your purchase.", "#app .success")
235
+ ```
199
236
 
200
237
  ```zsh
201
238
  pytest test_coffee_cart.py --demo
@@ -209,7 +246,7 @@ pytest test_coffee_cart.py --demo
209
246
 
210
247
  <a id="multiple_examples"></a>
211
248
 
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>
249
+ <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
250
 
214
251
  ```zsh
215
252
  pytest test_demo_site.py
@@ -219,7 +256,7 @@ pytest test_demo_site.py
219
256
 
220
257
  > Easy to type, click, select, toggle, drag & drop, and more.
221
258
 
222
- 📚 For more examples, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
259
+ 📚 For more scripts, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
223
260
 
224
261
  --------
225
262
 
@@ -7,7 +7,8 @@ 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;python_version=="3.10"
11
+ filelock>=4.1.1;python_version>="3.11"
11
12
  fasteners>=0.20
12
13
  mycdp>=1.4.0
13
14
  pynose>=1.5.5
@@ -16,7 +17,7 @@ sbvirtualdisplay>=1.4.0
16
17
  MarkupSafe>=3.0.4
17
18
  Jinja2>=3.1.6
18
19
  six>=1.17.0
19
- parse>=1.22.2
20
+ parse>=1.22.3
20
21
  parse-type>=0.6.6
21
22
  colorama>=0.4.6
22
23
  psutil>=7.2.2
@@ -36,8 +37,9 @@ trio>=0.34.0,<1
36
37
  trio-websocket~=0.12.2
37
38
  wsproto~=1.3.2
38
39
  websocket-client~=1.9.2
39
- selenium==4.50.0
40
- cssselect>=1.5.0,<2
40
+ selenium==4.51.0
41
+ cssselect~=1.5.0;python_version<"3.11"
42
+ cssselect>=1.6.0,<2;python_version>="3.11"
41
43
  sortedcontainers==2.4.0
42
44
  execnet==2.1.2
43
45
  iniconfig~=2.3.1
@@ -52,7 +54,8 @@ pytest-rerunfailures==16.7;python_version>="3.11"
52
54
  pytest-xdist==3.8.0
53
55
  parameterized==0.9.0
54
56
  behave==1.2.6
55
- soupsieve~=2.10.0
57
+ soupsieve~=2.10.0;python_version<"3.11.5"
58
+ soupsieve~=3.0.3;python_version>="3.11.5"
56
59
  beautifulsoup4~=4.15.0
57
60
  pyotp~=2.10.0
58
61
  python-xlib==0.33;platform_system=="Linux"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.55.2"
2
+ __version__ = "4.56.1"