seleniumbase 4.48.4__tar.gz → 4.49.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 (163) hide show
  1. {seleniumbase-4.48.4/seleniumbase.egg-info → seleniumbase-4.49.1}/PKG-INFO +93 -43
  2. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/README.md +78 -27
  3. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/requirements.txt +10 -9
  4. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/base_case.py +13 -0
  6. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/__init__.py +31 -2
  7. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/browser.py +23 -0
  8. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +3 -0
  9. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/config.py +51 -3
  10. {seleniumbase-4.48.4 → seleniumbase-4.49.1/seleniumbase.egg-info}/PKG-INFO +93 -43
  11. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/requires.txt +12 -14
  12. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/setup.py +32 -20
  13. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/.gitignore +0 -0
  14. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/LICENSE +0 -0
  15. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/MANIFEST.in +0 -0
  16. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/install.sh +0 -0
  17. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/pyproject.toml +0 -0
  18. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/pytest.ini +0 -0
  19. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/sbase/steps.py +0 -0
  22. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/browser_launcher.py +0 -0
  57. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/capabilities_parser.py +0 -0
  58. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/colored_traceback.py +0 -0
  59. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/create_db_tables.sql +0 -0
  60. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/detect_b_ver.py +0 -0
  61. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/download_helper.py +0 -0
  62. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/encoded_images.py +0 -0
  63. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/jqc_helper.py +0 -0
  64. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/log_helper.py +0 -0
  65. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/mysql.py +0 -0
  66. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/nest_asyncio.py +0 -0
  67. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/proxy_helper.py +0 -0
  68. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/recorder_helper.py +0 -0
  69. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/report_helper.py +0 -0
  70. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/s3_manager.py +0 -0
  71. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/sb_cdp.py +0 -0
  72. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/sb_driver.py +0 -0
  73. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/session_helper.py +0 -0
  74. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/settings_parser.py +0 -0
  75. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/style_sheet.py +0 -0
  76. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/testcase_manager.py +0 -0
  77. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/tour_helper.py +0 -0
  78. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/visual_helper.py +0 -0
  79. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/__init__.py +0 -0
  80. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  81. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  82. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  83. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  84. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  85. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  86. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  87. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/__init__.py +0 -0
  88. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/ad_block.zip +0 -0
  89. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/disable_csp.zip +0 -0
  90. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/recorder.zip +0 -0
  91. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
  92. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/__init__.py +0 -0
  93. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/constants.py +0 -0
  94. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  95. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/errors.py +0 -0
  96. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/js_utils.py +0 -0
  97. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/page_actions.py +0 -0
  98. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/page_utils.py +0 -0
  99. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/shared_utils.py +0 -0
  100. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
  101. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/words.py +0 -0
  102. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  103. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/js_code/__init__.py +0 -0
  104. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/js_code/active_css_js.py +0 -0
  105. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/js_code/live_js.py +0 -0
  106. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/js_code/recorder_js.py +0 -0
  107. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/masterqa/__init__.py +0 -0
  108. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/masterqa/master_qa.py +0 -0
  109. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/__init__.py +0 -0
  110. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/base_plugin.py +0 -0
  111. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/basic_test_info.py +0 -0
  112. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  113. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/driver_manager.py +0 -0
  114. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/page_source.py +0 -0
  115. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/pytest_plugin.py +0 -0
  116. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  117. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/sb_manager.py +0 -0
  118. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/screen_shots.py +0 -0
  119. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/selenium_plugin.py +0 -0
  120. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/resources/__init__.py +0 -0
  121. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/__init__.py +0 -0
  122. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/chinese.py +0 -0
  123. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/dutch.py +0 -0
  124. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/french.py +0 -0
  125. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/italian.py +0 -0
  126. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/japanese.py +0 -0
  127. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/korean.py +0 -0
  128. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/master_dict.py +0 -0
  129. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/portuguese.py +0 -0
  130. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/russian.py +0 -0
  131. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/spanish.py +0 -0
  132. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/translator.py +0 -0
  133. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp.py +0 -0
  134. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  135. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  136. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  137. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  138. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  139. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/setup.cfg +0 -0
  163. {seleniumbase-4.48.4 → seleniumbase-4.49.1}/virtualenv_install.sh +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.48.4
4
- Summary: A complete web automation framework for end-to-end testing.
3
+ Version: 4.49.1
4
+ Summary: A framework for stealthy Chromium automation with CDP Mode. Includes CAPTCHA-bypass, E2E Testing, and a Playwright integration.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
7
7
  Author-email: mdmintz@gmail.com
@@ -16,7 +16,7 @@ Project-URL: PyPI, https://pypi.org/project/seleniumbase/
16
16
  Project-URL: Source, https://github.com/seleniumbase/SeleniumBase
17
17
  Project-URL: Repository, https://github.com/seleniumbase/SeleniumBase
18
18
  Project-URL: Documentation, https://seleniumbase.io/
19
- Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,crawling,scraping
19
+ Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,web-crawling,web-scraping,stealth,chromium,playwright,undetected,bot-detection,fingerprint,recaptcha,cloudflare,turnstile,datadome,captcha,headless
20
20
  Platform: Windows
21
21
  Platform: Linux
22
22
  Platform: Mac OS-X
@@ -59,7 +59,7 @@ Requires-Python: >=3.9
59
59
  Description-Content-Type: text/markdown
60
60
  License-File: LICENSE
61
61
  Requires-Dist: pip>=26.0.1; python_version < "3.10"
62
- Requires-Dist: pip>=26.1; python_version >= "3.10"
62
+ Requires-Dist: pip>=26.1.1; python_version >= "3.10"
63
63
  Requires-Dist: packaging>=26.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
65
  Requires-Dist: setuptools>=82.0.1; python_version >= "3.10"
@@ -81,20 +81,21 @@ Requires-Dist: sbvirtualdisplay>=1.4.0
81
81
  Requires-Dist: MarkupSafe>=3.0.3
82
82
  Requires-Dist: Jinja2>=3.1.6
83
83
  Requires-Dist: six>=1.17.0
84
- Requires-Dist: parse>=1.21.1
84
+ Requires-Dist: parse>=1.22.0
85
85
  Requires-Dist: parse-type>=0.6.6
86
86
  Requires-Dist: colorama>=0.4.6
87
+ Requires-Dist: psutil>=7.2.2
87
88
  Requires-Dist: pyyaml>=6.0.3
88
89
  Requires-Dist: pygments>=2.20.0
89
90
  Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
90
91
  Requires-Dist: tabcompleter>=1.4.1
91
92
  Requires-Dist: pdbp>=1.8.2
92
- Requires-Dist: idna>=3.13
93
+ Requires-Dist: idna>=3.15
93
94
  Requires-Dist: charset-normalizer<4,>=3.4.7
94
95
  Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
95
- Requires-Dist: urllib3<3,>=1.26.20; python_version >= "3.10"
96
+ Requires-Dist: urllib3<3,>=2.7.0; python_version >= "3.10"
96
97
  Requires-Dist: requests~=2.32.5; python_version < "3.10"
97
- Requires-Dist: requests~=2.33.1; python_version >= "3.10"
98
+ Requires-Dist: requests~=2.34.2; python_version >= "3.10"
98
99
  Requires-Dist: sniffio==1.3.1
99
100
  Requires-Dist: h11==0.16.0
100
101
  Requires-Dist: outcome==1.3.0.post0
@@ -105,7 +106,7 @@ Requires-Dist: wsproto==1.2.0; python_version < "3.10"
105
106
  Requires-Dist: wsproto~=1.3.2; python_version >= "3.10"
106
107
  Requires-Dist: websocket-client~=1.9.0
107
108
  Requires-Dist: selenium==4.32.0; python_version < "3.10"
108
- Requires-Dist: selenium==4.43.0; python_version >= "3.10"
109
+ Requires-Dist: selenium==4.44.0; python_version >= "3.10"
109
110
  Requires-Dist: cssselect==1.3.0; python_version < "3.10"
110
111
  Requires-Dist: cssselect<2,>=1.4.0; python_version >= "3.10"
111
112
  Requires-Dist: sortedcontainers==2.4.0
@@ -120,7 +121,7 @@ Requires-Dist: pytest-html==4.0.2
120
121
  Requires-Dist: pytest-metadata==3.1.1
121
122
  Requires-Dist: pytest-ordering==0.6
122
123
  Requires-Dist: pytest-rerunfailures==16.0.1; python_version < "3.10"
123
- Requires-Dist: pytest-rerunfailures==16.1; python_version >= "3.10"
124
+ Requires-Dist: pytest-rerunfailures==16.2; python_version >= "3.10"
124
125
  Requires-Dist: pytest-xdist==3.8.0
125
126
  Requires-Dist: parameterized==0.9.0
126
127
  Requires-Dist: behave==1.2.6
@@ -130,7 +131,7 @@ Requires-Dist: pyotp==2.9.0
130
131
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
131
132
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system == "Linux"
132
133
  Requires-Dist: markdown-it-py==3.0.0; python_version < "3.10"
133
- Requires-Dist: markdown-it-py==4.0.0; python_version >= "3.10"
134
+ Requires-Dist: markdown-it-py==4.2.0; python_version >= "3.10"
134
135
  Requires-Dist: mdurl==0.1.2
135
136
  Requires-Dist: rich<16,>=15.0.0
136
137
  Provides-Extra: allure
@@ -139,7 +140,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
139
140
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
140
141
  Provides-Extra: coverage
141
142
  Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
142
- Requires-Dist: coverage>=7.13.5; python_version >= "3.10" and extra == "coverage"
143
+ Requires-Dist: coverage>=7.14.0; python_version >= "3.10" and extra == "coverage"
143
144
  Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
144
145
  Provides-Extra: flake8
145
146
  Requires-Dist: flake8==7.3.0; extra == "flake8"
@@ -154,7 +155,7 @@ Requires-Dist: mss==10.2.0; extra == "mss"
154
155
  Provides-Extra: pdfminer
155
156
  Requires-Dist: pdfminer.six==20251107; python_version < "3.10" and extra == "pdfminer"
156
157
  Requires-Dist: pdfminer.six==20260107; python_version >= "3.10" and extra == "pdfminer"
157
- Requires-Dist: cryptography==47.0.0; extra == "pdfminer"
158
+ Requires-Dist: cryptography==48.0.0; extra == "pdfminer"
158
159
  Requires-Dist: cffi==2.0.0; extra == "pdfminer"
159
160
  Requires-Dist: pycparser==2.23; python_version < "3.10" and extra == "pdfminer"
160
161
  Requires-Dist: pycparser==3.0; python_version >= "3.10" and extra == "pdfminer"
@@ -166,9 +167,7 @@ Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra ==
166
167
  Provides-Extra: proxy
167
168
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
168
169
  Provides-Extra: playwright
169
- Requires-Dist: playwright>=1.58.0; extra == "playwright"
170
- Provides-Extra: psutil
171
- Requires-Dist: psutil>=7.2.2; extra == "psutil"
170
+ Requires-Dist: playwright>=1.60.0; extra == "playwright"
172
171
  Provides-Extra: pyautogui
173
172
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
174
173
  Provides-Extra: selenium-stealth
@@ -208,34 +207,32 @@ Dynamic: summary
208
207
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
209
208
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
210
209
 
211
- <h1>SeleniumBase</h1>
212
-
213
210
  <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="424" /></a></p>
214
211
 
215
- <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
216
-
217
- <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" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></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" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a></p>
212
+ <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" /></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" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a><br /> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></p>
218
213
  <p align="center"></p>
219
214
 
215
+ <h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
216
+
220
217
  <p align="center">
221
218
  <a href="#python_installation">🚀 Start</a> |
222
219
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">🏰 Features</a> |
223
220
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">🎛️ Options</a> |
224
221
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
225
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">🪄 Scripts</a> |
226
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mobile_testing.md">📱 Mobile</a>
222
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">💻 Scripts</a> |
223
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
227
224
  <br />
228
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 The API</a> |
229
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 SyntaxFormats</a> |
225
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📗 API</a> |
226
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/cdp_mode_methods.md">📘 Stealth API</a> |
227
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 DesignPatterns</a> |
230
228
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
231
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a> |
232
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
229
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a>
233
230
  <br />
234
231
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
235
232
  <a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
236
233
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
237
234
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
238
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
235
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
239
236
  <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
240
237
  <br />
241
238
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
@@ -245,7 +242,7 @@ Dynamic: summary
245
242
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
246
243
  <br />
247
244
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
248
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">❇️ JSMgr</a> |
245
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🟨 JSMgr</a> |
249
246
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
250
247
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
251
248
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
@@ -253,25 +250,80 @@ Dynamic: summary
253
250
  <br />
254
251
  </p>
255
252
 
256
- 📊 <a href="https://github.com/seleniumbase/SeleniumBase/"><b translate="no">SeleniumBase</b></a> is a complete framework for browser automation and testing with Python and <a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a>. Includes stealth options and other advanced features.
253
+ 🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. 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 extends these advanced anti-detection patches to Playwright scripts.
257
254
 
258
- 🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">UC Mode</a> and <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.
255
+ 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
259
256
 
260
- 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
257
+ 🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
261
258
 
262
- 🥷 Stealthy examples are located in [SeleniumBase/examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
259
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
263
260
 
264
261
  --------
265
262
 
266
263
  <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
267
264
 
268
- <img src="https://seleniumbase.github.io/other/sb_stealth.png" width="596" alt="Stealthy architecture flowchart" />
265
+ <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="596" alt="Stealthy architecture flowchart" />
269
266
 
270
267
  (For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>)
271
268
 
272
269
  --------
273
270
 
274
- <p align="left">📗 <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 with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a>:
271
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_browserscan.py" target="_blank">This example</a> verifies that <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> is stealthy on <a href="https://www.browserscan.net/bot-detection">BrowserScan</a>:
272
+
273
+ ```python
274
+ from seleniumbase import sb_cdp
275
+
276
+ url = "https://www.browserscan.net/bot-detection"
277
+ sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
278
+ sb.flash("Test Results", duration=3, pause=1)
279
+ sb.assert_element('strong:contains("Normal")')
280
+ print("Bot Not Detected")
281
+ sb.flash('strong:contains("Normal")', duration=3, pause=2)
282
+ ```
283
+
284
+ <img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
285
+
286
+ 📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This example</a> demonstrates the drop-in patch that makes Playwright stealthy:
287
+
288
+ ```python
289
+ from playwright.sync_api import sync_playwright
290
+ from seleniumbase import sb_cdp
291
+
292
+ sb = sb_cdp.Chrome(locale="en", ad_block=True)
293
+ endpoint_url = sb.get_endpoint_url()
294
+
295
+ with sync_playwright() as p:
296
+ browser = p.chromium.connect_over_cdp(endpoint_url)
297
+ page = browser.contexts[0].pages[0]
298
+ page.goto("https://www.browserscan.net/bot-detection")
299
+ page.wait_for_timeout(500)
300
+ sb.flash("Test Results", duration=3, pause=1)
301
+ sb.assert_element('strong:contains("Normal")')
302
+ sb.flash('strong:contains("Normal")', duration=3, pause=2)
303
+ ```
304
+
305
+ --------
306
+
307
+ 💡 You can set which Chromium browser to use via command-line options:
308
+
309
+ ```zsh
310
+ python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
311
+ python SCRIPT.py --cft # Use Chrome-for-testing
312
+ python SCRIPT.py --edge # Use Microsoft Edge
313
+ python SCRIPT.py --brave # Use Brave browser
314
+ ```
315
+
316
+ Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
317
+
318
+ You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
319
+
320
+ ```python
321
+ sb = sb_cdp.Chrome(url, use_chromium=True)
322
+ ```
323
+
324
+ --------
325
+
326
+ <p align="left">📝 <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 with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a>:
275
327
 
276
328
  ```python
277
329
  from seleniumbase import sb_cdp
@@ -281,12 +333,11 @@ sb = sb_cdp.Chrome(url)
281
333
  elements = sb.find_elements("span.titleline > a")
282
334
  for element in elements:
283
335
  print("* " + element.text)
284
- sb.driver.stop()
285
336
  ```
286
337
 
287
338
  --------
288
339
 
289
- <p align="left">📗 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:<br />(Results are saved as PDF, HTML, and PNG files)</p>
340
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:<br />(Results are saved as PDF, HTML, and PNG files)</p>
290
341
 
291
342
  ```python
292
343
  from seleniumbase import SB
@@ -307,7 +358,7 @@ with SB(uc=True, test=True) as sb:
307
358
 
308
359
  --------
309
360
 
310
- <p align="left">📗 <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:
361
+ <p align="left">📝 <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:
311
362
 
312
363
  ```python
313
364
  from seleniumbase import SB
@@ -329,7 +380,7 @@ with SB(uc=True, test=True, locale="en") as sb:
329
380
 
330
381
  ----
331
382
 
332
- <p align="left">📗 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_gitlab.py" target="_blank">This example</a> handles a CAPTCHA page with Pure CDP Mode:
383
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_gitlab.py" target="_blank">This example</a> handles a CAPTCHA page with Pure CDP Mode:
333
384
 
334
385
  ```python
335
386
  from seleniumbase import sb_cdp
@@ -340,12 +391,11 @@ sb.sleep(2)
340
391
  sb.solve_captcha()
341
392
  sb.highlight('h1:contains("GitLab")')
342
393
  sb.highlight('button:contains("Sign in")')
343
- sb.driver.stop()
344
394
  ```
345
395
 
346
396
  --------
347
397
 
348
- <p align="left">📗 <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>:
398
+ <p align="left">📝 <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>:
349
399
 
350
400
  ```python
351
401
  from seleniumbase import BaseCase
@@ -375,7 +425,7 @@ class MyTestClass(BaseCase):
375
425
 
376
426
  --------
377
427
 
378
- <p align="left">📗 <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>:
428
+ <p align="left">📝 <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>:
379
429
 
380
430
  ```zsh
381
431
  pytest test_coffee_cart.py --demo
@@ -389,7 +439,7 @@ pytest test_coffee_cart.py --demo
389
439
 
390
440
  <a id="multiple_examples"></a>
391
441
 
392
- <p align="left">📗 <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>:
442
+ <p align="left">📝 <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>:
393
443
 
394
444
  ```zsh
395
445
  pytest test_demo_site.py
@@ -7,34 +7,32 @@
7
7
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
8
8
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
9
9
 
10
- <h1>SeleniumBase</h1>
11
-
12
10
  <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="424" /></a></p>
13
11
 
14
- <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
15
-
16
- <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" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></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" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a></p>
12
+ <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" /></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" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a><br /> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></p>
17
13
  <p align="center"></p>
18
14
 
15
+ <h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
16
+
19
17
  <p align="center">
20
18
  <a href="#python_installation">🚀 Start</a> |
21
19
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">🏰 Features</a> |
22
20
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">🎛️ Options</a> |
23
21
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
24
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">🪄 Scripts</a> |
25
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mobile_testing.md">📱 Mobile</a>
22
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">💻 Scripts</a> |
23
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
26
24
  <br />
27
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 The API</a> |
28
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 SyntaxFormats</a> |
25
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📗 API</a> |
26
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/cdp_mode_methods.md">📘 Stealth API</a> |
27
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 DesignPatterns</a> |
29
28
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
30
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a> |
31
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
29
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a>
32
30
  <br />
33
31
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
34
32
  <a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
35
33
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
36
34
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
37
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
35
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
38
36
  <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
39
37
  <br />
40
38
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
@@ -44,7 +42,7 @@
44
42
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
45
43
  <br />
46
44
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
47
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">❇️ JSMgr</a> |
45
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🟨 JSMgr</a> |
48
46
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
49
47
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
50
48
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
@@ -52,25 +50,80 @@
52
50
  <br />
53
51
  </p>
54
52
 
55
- 📊 <a href="https://github.com/seleniumbase/SeleniumBase/"><b translate="no">SeleniumBase</b></a> is a complete framework for browser automation and testing with Python and <a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a>. Includes stealth options and other advanced features.
53
+ 🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. 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 extends these advanced anti-detection patches to Playwright scripts.
56
54
 
57
- 🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">UC Mode</a> and <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.
55
+ 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
58
56
 
59
- 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
57
+ 🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
60
58
 
61
- 🥷 Stealthy examples are located in [SeleniumBase/examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
59
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
62
60
 
63
61
  --------
64
62
 
65
63
  <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
66
64
 
67
- <img src="https://seleniumbase.github.io/other/sb_stealth.png" width="596" alt="Stealthy architecture flowchart" />
65
+ <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="596" alt="Stealthy architecture flowchart" />
68
66
 
69
67
  (For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>)
70
68
 
71
69
  --------
72
70
 
73
- <p align="left">📗 <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 with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a>:
71
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_browserscan.py" target="_blank">This example</a> verifies that <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> is stealthy on <a href="https://www.browserscan.net/bot-detection">BrowserScan</a>:
72
+
73
+ ```python
74
+ from seleniumbase import sb_cdp
75
+
76
+ url = "https://www.browserscan.net/bot-detection"
77
+ sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
78
+ sb.flash("Test Results", duration=3, pause=1)
79
+ sb.assert_element('strong:contains("Normal")')
80
+ print("Bot Not Detected")
81
+ sb.flash('strong:contains("Normal")', duration=3, pause=2)
82
+ ```
83
+
84
+ <img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
85
+
86
+ 📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This example</a> demonstrates the drop-in patch that makes Playwright stealthy:
87
+
88
+ ```python
89
+ from playwright.sync_api import sync_playwright
90
+ from seleniumbase import sb_cdp
91
+
92
+ sb = sb_cdp.Chrome(locale="en", ad_block=True)
93
+ endpoint_url = sb.get_endpoint_url()
94
+
95
+ with sync_playwright() as p:
96
+ browser = p.chromium.connect_over_cdp(endpoint_url)
97
+ page = browser.contexts[0].pages[0]
98
+ page.goto("https://www.browserscan.net/bot-detection")
99
+ page.wait_for_timeout(500)
100
+ sb.flash("Test Results", duration=3, pause=1)
101
+ sb.assert_element('strong:contains("Normal")')
102
+ sb.flash('strong:contains("Normal")', duration=3, pause=2)
103
+ ```
104
+
105
+ --------
106
+
107
+ 💡 You can set which Chromium browser to use via command-line options:
108
+
109
+ ```zsh
110
+ python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
111
+ python SCRIPT.py --cft # Use Chrome-for-testing
112
+ python SCRIPT.py --edge # Use Microsoft Edge
113
+ python SCRIPT.py --brave # Use Brave browser
114
+ ```
115
+
116
+ Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
117
+
118
+ You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
119
+
120
+ ```python
121
+ sb = sb_cdp.Chrome(url, use_chromium=True)
122
+ ```
123
+
124
+ --------
125
+
126
+ <p align="left">📝 <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 with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a>:
74
127
 
75
128
  ```python
76
129
  from seleniumbase import sb_cdp
@@ -80,12 +133,11 @@ sb = sb_cdp.Chrome(url)
80
133
  elements = sb.find_elements("span.titleline > a")
81
134
  for element in elements:
82
135
  print("* " + element.text)
83
- sb.driver.stop()
84
136
  ```
85
137
 
86
138
  --------
87
139
 
88
- <p align="left">📗 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:<br />(Results are saved as PDF, HTML, and PNG files)</p>
140
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:<br />(Results are saved as PDF, HTML, and PNG files)</p>
89
141
 
90
142
  ```python
91
143
  from seleniumbase import SB
@@ -106,7 +158,7 @@ with SB(uc=True, test=True) as sb:
106
158
 
107
159
  --------
108
160
 
109
- <p align="left">📗 <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:
161
+ <p align="left">📝 <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:
110
162
 
111
163
  ```python
112
164
  from seleniumbase import SB
@@ -128,7 +180,7 @@ with SB(uc=True, test=True, locale="en") as sb:
128
180
 
129
181
  ----
130
182
 
131
- <p align="left">📗 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_gitlab.py" target="_blank">This example</a> handles a CAPTCHA page with Pure CDP Mode:
183
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_gitlab.py" target="_blank">This example</a> handles a CAPTCHA page with Pure CDP Mode:
132
184
 
133
185
  ```python
134
186
  from seleniumbase import sb_cdp
@@ -139,12 +191,11 @@ sb.sleep(2)
139
191
  sb.solve_captcha()
140
192
  sb.highlight('h1:contains("GitLab")')
141
193
  sb.highlight('button:contains("Sign in")')
142
- sb.driver.stop()
143
194
  ```
144
195
 
145
196
  --------
146
197
 
147
- <p align="left">📗 <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>:
198
+ <p align="left">📝 <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>:
148
199
 
149
200
  ```python
150
201
  from seleniumbase import BaseCase
@@ -174,7 +225,7 @@ class MyTestClass(BaseCase):
174
225
 
175
226
  --------
176
227
 
177
- <p align="left">📗 <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>:
228
+ <p align="left">📝 <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>:
178
229
 
179
230
  ```zsh
180
231
  pytest test_coffee_cart.py --demo
@@ -188,7 +239,7 @@ pytest test_coffee_cart.py --demo
188
239
 
189
240
  <a id="multiple_examples"></a>
190
241
 
191
- <p align="left">📗 <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>:
242
+ <p align="left">📝 <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>:
192
243
 
193
244
  ```zsh
194
245
  pytest test_demo_site.py
@@ -1,5 +1,5 @@
1
1
  pip>=26.0.1;python_version<"3.10"
2
- pip>=26.1;python_version>="3.10"
2
+ pip>=26.1.1;python_version>="3.10"
3
3
  packaging>=26.2
4
4
  setuptools~=70.2;python_version<"3.10"
5
5
  setuptools>=82.0.1;python_version>="3.10"
@@ -21,20 +21,21 @@ sbvirtualdisplay>=1.4.0
21
21
  MarkupSafe>=3.0.3
22
22
  Jinja2>=3.1.6
23
23
  six>=1.17.0
24
- parse>=1.21.1
24
+ parse>=1.22.0
25
25
  parse-type>=0.6.6
26
26
  colorama>=0.4.6
27
+ psutil>=7.2.2
27
28
  pyyaml>=6.0.3
28
29
  pygments>=2.20.0
29
30
  pyreadline3>=3.5.4;platform_system=="Windows"
30
31
  tabcompleter>=1.4.1
31
32
  pdbp>=1.8.2
32
- idna>=3.13
33
+ idna>=3.15
33
34
  charset-normalizer>=3.4.7,<4
34
35
  urllib3>=1.26.20,<2;python_version<"3.10"
35
- urllib3>=1.26.20,<3;python_version>="3.10"
36
+ urllib3>=2.7.0,<3;python_version>="3.10"
36
37
  requests~=2.32.5;python_version<"3.10"
37
- requests~=2.33.1;python_version>="3.10"
38
+ requests~=2.34.2;python_version>="3.10"
38
39
  sniffio==1.3.1
39
40
  h11==0.16.0
40
41
  outcome==1.3.0.post0
@@ -45,7 +46,7 @@ wsproto==1.2.0;python_version<"3.10"
45
46
  wsproto~=1.3.2;python_version>="3.10"
46
47
  websocket-client~=1.9.0
47
48
  selenium==4.32.0;python_version<"3.10"
48
- selenium==4.43.0;python_version>="3.10"
49
+ selenium==4.44.0;python_version>="3.10"
49
50
  cssselect==1.3.0;python_version<"3.10"
50
51
  cssselect>=1.4.0,<2;python_version>="3.10"
51
52
  sortedcontainers==2.4.0
@@ -60,7 +61,7 @@ pytest-html==4.0.2
60
61
  pytest-metadata==3.1.1
61
62
  pytest-ordering==0.6
62
63
  pytest-rerunfailures==16.0.1;python_version<"3.10"
63
- pytest-rerunfailures==16.1;python_version>="3.10"
64
+ pytest-rerunfailures==16.2;python_version>="3.10"
64
65
  pytest-xdist==3.8.0
65
66
  parameterized==0.9.0
66
67
  behave==1.2.6
@@ -70,7 +71,7 @@ pyotp==2.9.0
70
71
  python-xlib==0.33;platform_system=="Linux"
71
72
  PyAutoGUI>=0.9.54;platform_system=="Linux"
72
73
  markdown-it-py==3.0.0;python_version<"3.10"
73
- markdown-it-py==4.0.0;python_version>="3.10"
74
+ markdown-it-py==4.2.0;python_version>="3.10"
74
75
  mdurl==0.1.2
75
76
  rich>=15.0.0,<16
76
77
 
@@ -78,7 +79,7 @@ rich>=15.0.0,<16
78
79
  # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
79
80
 
80
81
  coverage>=7.10.7;python_version<"3.10"
81
- coverage>=7.13.5;python_version>="3.10"
82
+ coverage>=7.14.0;python_version>="3.10"
82
83
  pytest-cov>=7.1.0
83
84
  flake8==7.3.0
84
85
  mccabe==0.7.0
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.48.4"
2
+ __version__ = "4.49.1"