seleniumbase 4.44.1__tar.gz → 4.45.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 (162) hide show
  1. {seleniumbase-4.44.1/seleniumbase.egg-info → seleniumbase-4.45.1}/PKG-INFO +71 -92
  2. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/README.md +22 -21
  3. seleniumbase-4.45.1/requirements.txt +84 -0
  4. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/behave/behave_sb.py +8 -0
  6. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_install.py +6 -10
  7. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkrec.py +20 -0
  8. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_recorder.py +38 -3
  9. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/browser_launcher.py +164 -95
  10. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/detect_b_ver.py +8 -6
  11. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/log_helper.py +11 -16
  12. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/mysql.py +1 -1
  13. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/report_helper.py +3 -7
  14. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/sb_cdp.py +321 -85
  15. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/sb_driver.py +36 -5
  16. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/session_helper.py +2 -4
  17. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/base_case.py +208 -152
  18. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/constants.py +1 -0
  19. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/js_utils.py +52 -14
  20. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/page_actions.py +18 -7
  21. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/page_utils.py +4 -2
  22. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/shared_utils.py +2 -4
  23. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/masterqa/master_qa.py +16 -2
  24. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/base_plugin.py +8 -0
  25. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/driver_manager.py +4 -1
  26. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/pytest_plugin.py +24 -54
  27. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/sb_manager.py +14 -15
  28. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/selenium_plugin.py +5 -10
  29. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/__init__.py +11 -10
  30. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp.py +1 -12
  31. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/browser.py +259 -106
  32. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +25 -1
  33. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/config.py +19 -11
  34. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/connection.py +4 -35
  35. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/element.py +81 -21
  36. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/tab.py +381 -39
  37. {seleniumbase-4.44.1 → seleniumbase-4.45.1/seleniumbase.egg-info}/PKG-INFO +71 -92
  38. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/requires.txt +47 -87
  39. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/setup.py +60 -79
  40. seleniumbase-4.44.1/requirements.txt +0 -101
  41. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/.gitignore +0 -0
  42. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/LICENSE +0 -0
  43. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/MANIFEST.in +0 -0
  44. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/install.sh +0 -0
  45. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/pyproject.toml +0 -0
  46. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/pytest.ini +0 -0
  47. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/sbase/__init__.py +0 -0
  48. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/sbase/__main__.py +0 -0
  49. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/sbase/steps.py +0 -0
  50. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/__init__.py +0 -0
  51. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/__main__.py +0 -0
  52. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/behave/__init__.py +0 -0
  53. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/behave/behave_helper.py +0 -0
  54. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/behave/steps.py +0 -0
  55. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/__init__.py +0 -0
  56. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/decorators.py +0 -0
  57. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/encryption.py +0 -0
  58. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/exceptions.py +0 -0
  59. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/obfuscate.py +0 -0
  60. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/unobfuscate.py +0 -0
  61. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/config/__init__.py +0 -0
  62. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/config/ad_block_list.py +0 -0
  63. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/config/proxy_list.py +0 -0
  64. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/config/settings.py +0 -0
  65. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/__init__.py +0 -0
  66. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
  67. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
  68. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/run.py +0 -0
  69. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  70. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  71. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
  72. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  73. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  74. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  75. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  76. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  77. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_print.py +0 -0
  78. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/__init__.py +0 -0
  79. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/application_manager.py +0 -0
  80. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/capabilities_parser.py +0 -0
  81. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/colored_traceback.py +0 -0
  82. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/create_db_tables.sql +0 -0
  83. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/download_helper.py +0 -0
  84. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/encoded_images.py +0 -0
  85. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/jqc_helper.py +0 -0
  86. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/proxy_helper.py +0 -0
  87. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/recorder_helper.py +0 -0
  88. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/s3_manager.py +0 -0
  89. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/settings_parser.py +0 -0
  90. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/style_sheet.py +0 -0
  91. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/testcase_manager.py +0 -0
  92. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/tour_helper.py +0 -0
  93. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/visual_helper.py +0 -0
  94. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/__init__.py +0 -0
  95. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  96. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  97. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  98. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  99. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  100. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  101. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/__init__.py +0 -0
  102. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/ad_block.zip +0 -0
  103. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/disable_csp.zip +0 -0
  104. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/recorder.zip +0 -0
  105. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
  106. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/__init__.py +0 -0
  107. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  108. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/errors.py +0 -0
  109. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
  110. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/words.py +0 -0
  111. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  112. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/js_code/__init__.py +0 -0
  113. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/js_code/active_css_js.py +0 -0
  114. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/js_code/live_js.py +0 -0
  115. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/js_code/recorder_js.py +0 -0
  116. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/masterqa/__init__.py +0 -0
  117. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/__init__.py +0 -0
  118. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/basic_test_info.py +0 -0
  119. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  120. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/page_source.py +0 -0
  121. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  122. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/screen_shots.py +0 -0
  123. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/resources/__init__.py +0 -0
  124. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/__init__.py +0 -0
  125. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/chinese.py +0 -0
  126. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/dutch.py +0 -0
  127. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/french.py +0 -0
  128. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/italian.py +0 -0
  129. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/japanese.py +0 -0
  130. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/korean.py +0 -0
  131. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/master_dict.py +0 -0
  132. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/portuguese.py +0 -0
  133. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/russian.py +0 -0
  134. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/spanish.py +0 -0
  135. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/translator.py +0 -0
  136. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  137. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  138. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/dprocess.py +0 -0
  139. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/options.py +0 -0
  140. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/patcher.py +0 -0
  141. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/reactor.py +0 -0
  142. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/webelement.py +0 -0
  143. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/__init__.py +0 -0
  144. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  145. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  146. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  147. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  148. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  149. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  150. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  151. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  152. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  153. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  154. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  155. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  156. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  157. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
  158. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
  159. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/entry_points.txt +0 -0
  160. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/top_level.txt +0 -0
  161. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/setup.cfg +0 -0
  162. {seleniumbase-4.44.1 → seleniumbase-4.45.1}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.44.1
3
+ Version: 4.45.1
4
4
  Summary: A complete web automation framework for end-to-end testing.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -33,7 +33,6 @@ Classifier: Operating System :: Microsoft :: Windows
33
33
  Classifier: Operating System :: POSIX :: Linux
34
34
  Classifier: Programming Language :: Python
35
35
  Classifier: Programming Language :: Python :: 3
36
- Classifier: Programming Language :: Python :: 3.8
37
36
  Classifier: Programming Language :: Python :: 3.9
38
37
  Classifier: Programming Language :: Python :: 3.10
39
38
  Classifier: Programming Language :: Python :: 3.11
@@ -56,35 +55,28 @@ Classifier: Topic :: Software Development :: Testing
56
55
  Classifier: Topic :: Software Development :: Testing :: Acceptance
57
56
  Classifier: Topic :: Software Development :: Testing :: Traffic Generation
58
57
  Classifier: Topic :: Utilities
59
- Requires-Python: >=3.8
58
+ Requires-Python: >=3.9
60
59
  Description-Content-Type: text/markdown
61
60
  License-File: LICENSE
62
- Requires-Dist: pip>=25.0.1; python_version < "3.9"
63
- Requires-Dist: pip>=25.3; python_version >= "3.9"
61
+ Requires-Dist: pip>=25.3
64
62
  Requires-Dist: packaging>=25.0
65
63
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
66
64
  Requires-Dist: setuptools>=80.9.0; python_version >= "3.10"
67
65
  Requires-Dist: wheel>=0.45.1
68
- Requires-Dist: attrs~=25.3.0; python_version < "3.9"
69
- Requires-Dist: attrs>=25.4.0; python_version >= "3.9"
70
- Requires-Dist: certifi>=2025.10.5
71
- Requires-Dist: exceptiongroup>=1.3.0
72
- Requires-Dist: websockets~=13.1; python_version < "3.9"
73
- Requires-Dist: websockets>=15.0.1; python_version >= "3.9"
74
- Requires-Dist: filelock~=3.16.1; python_version < "3.9"
75
- Requires-Dist: filelock~=3.19.1; python_version >= "3.9" and python_version < "3.10"
66
+ Requires-Dist: attrs>=25.4.0
67
+ Requires-Dist: certifi>=2025.11.12
68
+ Requires-Dist: exceptiongroup>=1.3.1
69
+ Requires-Dist: websockets>=15.0.1
70
+ Requires-Dist: filelock~=3.19.1; python_version < "3.10"
76
71
  Requires-Dist: filelock>=3.20.0; python_version >= "3.10"
77
72
  Requires-Dist: fasteners>=0.20
78
- Requires-Dist: mycdp>=1.2.1
73
+ Requires-Dist: mycdp>=1.3.2
79
74
  Requires-Dist: pynose>=1.5.5
80
- Requires-Dist: platformdirs~=4.3.6; python_version < "3.9"
81
- Requires-Dist: platformdirs~=4.4.0; python_version >= "3.9" and python_version < "3.10"
82
- Requires-Dist: platformdirs>=4.5.0; python_version >= "3.10"
83
- Requires-Dist: typing-extensions~=4.13.2; python_version < "3.9"
84
- Requires-Dist: typing-extensions>=4.15.0; python_version >= "3.9"
75
+ Requires-Dist: platformdirs~=4.4.0; python_version < "3.10"
76
+ Requires-Dist: platformdirs>=4.5.1; python_version >= "3.10"
77
+ Requires-Dist: typing-extensions>=4.15.0
85
78
  Requires-Dist: sbvirtualdisplay>=1.4.0
86
- Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
87
- Requires-Dist: MarkupSafe>=3.0.3; python_version >= "3.9"
79
+ Requires-Dist: MarkupSafe>=3.0.3
88
80
  Requires-Dist: Jinja2>=3.1.6
89
81
  Requires-Dist: six>=1.17.0
90
82
  Requires-Dist: parse>=1.20.2
@@ -94,49 +86,44 @@ Requires-Dist: pyyaml>=6.0.3
94
86
  Requires-Dist: pygments>=2.19.2
95
87
  Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
96
88
  Requires-Dist: tabcompleter>=1.4.0
97
- Requires-Dist: pdbp>=1.8.0
89
+ Requires-Dist: pdbp>=1.8.1
98
90
  Requires-Dist: idna>=3.11
99
91
  Requires-Dist: chardet==5.2.0
100
92
  Requires-Dist: charset-normalizer<4,>=3.4.4
101
93
  Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
102
- Requires-Dist: urllib3<2.6.0,>=1.26.20; python_version >= "3.10"
103
- Requires-Dist: requests==2.32.4; python_version < "3.9"
104
- Requires-Dist: requests~=2.32.5; python_version >= "3.9"
94
+ Requires-Dist: urllib3<3,>=1.26.20; python_version >= "3.10"
95
+ Requires-Dist: requests~=2.32.5
105
96
  Requires-Dist: sniffio==1.3.1
106
97
  Requires-Dist: h11==0.16.0
107
98
  Requires-Dist: outcome==1.3.0.post0
108
- Requires-Dist: trio==0.27.0; python_version < "3.9"
109
- Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9"
99
+ Requires-Dist: trio<1,>=0.31.0; python_version < "3.10"
100
+ Requires-Dist: trio<1,>=0.32.0; python_version >= "3.10"
110
101
  Requires-Dist: trio-websocket~=0.12.2
111
- Requires-Dist: wsproto==1.2.0
112
- Requires-Dist: websocket-client~=1.8.0; python_version < "3.9"
113
- Requires-Dist: websocket-client~=1.9.0; python_version >= "3.9"
114
- Requires-Dist: selenium==4.27.1; python_version < "3.9"
115
- Requires-Dist: selenium==4.32.0; python_version >= "3.9" and python_version < "3.10"
116
- Requires-Dist: selenium==4.38.0; python_version >= "3.10"
117
- Requires-Dist: cssselect==1.2.0; python_version < "3.9"
118
- Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
102
+ Requires-Dist: wsproto==1.2.0; python_version < "3.10"
103
+ Requires-Dist: wsproto~=1.3.2; python_version >= "3.10"
104
+ Requires-Dist: websocket-client~=1.9.0
105
+ Requires-Dist: selenium==4.32.0; python_version < "3.10"
106
+ Requires-Dist: selenium==4.39.0; python_version >= "3.10"
107
+ Requires-Dist: cssselect==1.3.0
108
+ Requires-Dist: nest-asyncio==1.6.0
119
109
  Requires-Dist: sortedcontainers==2.4.0
120
- Requires-Dist: execnet==2.1.1
110
+ Requires-Dist: execnet==2.1.1; python_version < "3.10"
111
+ Requires-Dist: execnet==2.1.2; python_version >= "3.10"
121
112
  Requires-Dist: iniconfig==2.1.0; python_version < "3.10"
122
113
  Requires-Dist: iniconfig==2.3.0; python_version >= "3.10"
123
- Requires-Dist: pluggy==1.5.0; python_version < "3.9"
124
- Requires-Dist: pluggy==1.6.0; python_version >= "3.9"
125
- Requires-Dist: pytest==8.3.5; python_version < "3.9"
126
- Requires-Dist: pytest==8.4.2; python_version >= "3.9"
114
+ Requires-Dist: pluggy==1.6.0
115
+ Requires-Dist: pytest==8.4.2; python_version < "3.11"
116
+ Requires-Dist: pytest==9.0.2; python_version >= "3.11"
127
117
  Requires-Dist: pytest-html==4.0.2
128
118
  Requires-Dist: pytest-metadata==3.1.1
129
119
  Requires-Dist: pytest-ordering==0.6
130
- Requires-Dist: pytest-rerunfailures==14.0; python_version < "3.9"
131
- Requires-Dist: pytest-rerunfailures==16.0.1; python_version >= "3.9" and python_version < "3.10"
120
+ Requires-Dist: pytest-rerunfailures==16.0.1; python_version < "3.10"
132
121
  Requires-Dist: pytest-rerunfailures==16.1; python_version >= "3.10"
133
- Requires-Dist: pytest-xdist==3.6.1; python_version < "3.9"
134
- Requires-Dist: pytest-xdist==3.8.0; python_version >= "3.9"
122
+ Requires-Dist: pytest-xdist==3.8.0
135
123
  Requires-Dist: parameterized==0.9.0
136
124
  Requires-Dist: behave==1.2.6
137
- Requires-Dist: soupsieve==2.7; python_version < "3.9"
138
- Requires-Dist: soupsieve~=2.8; python_version >= "3.9"
139
- Requires-Dist: beautifulsoup4~=4.14.2
125
+ Requires-Dist: soupsieve~=2.8
126
+ Requires-Dist: beautifulsoup4~=4.14.3
140
127
  Requires-Dist: pyotp==2.9.0
141
128
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
142
129
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system == "Linux"
@@ -149,44 +136,35 @@ Requires-Dist: allure-pytest>=2.13.5; extra == "allure"
149
136
  Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
150
137
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
151
138
  Provides-Extra: coverage
152
- Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
153
- Requires-Dist: coverage>=7.10.7; (python_version >= "3.9" and python_version < "3.10") and extra == "coverage"
154
- Requires-Dist: coverage>=7.11.0; python_version >= "3.10" and extra == "coverage"
155
- Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
156
- Requires-Dist: pytest-cov>=7.0.0; python_version >= "3.9" and extra == "coverage"
139
+ Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
140
+ Requires-Dist: coverage>=7.13.0; python_version >= "3.10" and extra == "coverage"
141
+ Requires-Dist: pytest-cov>=7.0.0; extra == "coverage"
157
142
  Provides-Extra: flake8
158
- Requires-Dist: flake8==5.0.4; python_version < "3.9" and extra == "flake8"
159
- Requires-Dist: flake8==7.3.0; python_version >= "3.9" and extra == "flake8"
143
+ Requires-Dist: flake8==7.3.0; extra == "flake8"
160
144
  Requires-Dist: mccabe==0.7.0; extra == "flake8"
161
- Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
162
- Requires-Dist: pyflakes==3.4.0; python_version >= "3.9" and extra == "flake8"
163
- Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
164
- Requires-Dist: pycodestyle==2.14.0; python_version >= "3.9" and extra == "flake8"
145
+ Requires-Dist: pyflakes==3.4.0; extra == "flake8"
146
+ Requires-Dist: pycodestyle==2.14.0; extra == "flake8"
165
147
  Provides-Extra: ipdb
166
148
  Requires-Dist: ipdb==0.13.13; extra == "ipdb"
167
149
  Requires-Dist: ipython==7.34.0; extra == "ipdb"
168
150
  Provides-Extra: mss
169
- Requires-Dist: mss==9.0.2; python_version < "3.9" and extra == "mss"
170
- Requires-Dist: mss==10.0.0; python_version >= "3.9" and extra == "mss"
151
+ Requires-Dist: mss==10.1.0; extra == "mss"
171
152
  Provides-Extra: pdfminer
172
- Requires-Dist: pdfminer.six==20250324; python_version < "3.9" and extra == "pdfminer"
173
- Requires-Dist: pdfminer.six==20250506; python_version >= "3.9" and extra == "pdfminer"
174
- Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
175
- Requires-Dist: cryptography==46.0.3; python_version >= "3.9" and extra == "pdfminer"
176
- Requires-Dist: cffi==1.17.1; python_version < "3.9" and extra == "pdfminer"
177
- Requires-Dist: cffi==2.0.0; python_version >= "3.9" and extra == "pdfminer"
178
- Requires-Dist: pycparser==2.22; python_version < "3.9" and extra == "pdfminer"
179
- Requires-Dist: pycparser==2.23; python_version >= "3.9" and extra == "pdfminer"
153
+ Requires-Dist: pdfminer.six==20251107; extra == "pdfminer"
154
+ Requires-Dist: cryptography==46.0.3; extra == "pdfminer"
155
+ Requires-Dist: cffi==2.0.0; extra == "pdfminer"
156
+ Requires-Dist: pycparser==2.23; extra == "pdfminer"
180
157
  Provides-Extra: pillow
181
- Requires-Dist: Pillow>=10.4.0; python_version < "3.9" and extra == "pillow"
182
- Requires-Dist: Pillow>=11.3.0; (python_version >= "3.9" and python_version < "3.10") and extra == "pillow"
158
+ Requires-Dist: Pillow>=11.3.0; python_version < "3.10" and extra == "pillow"
183
159
  Requires-Dist: Pillow>=12.0.0; python_version >= "3.10" and extra == "pillow"
184
160
  Provides-Extra: pip-system-certs
185
161
  Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
186
162
  Provides-Extra: proxy
187
163
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
164
+ Provides-Extra: playwright
165
+ Requires-Dist: playwright>=1.56.0; extra == "playwright"
188
166
  Provides-Extra: psutil
189
- Requires-Dist: psutil==7.1.2; extra == "psutil"
167
+ Requires-Dist: psutil>=7.1.3; extra == "psutil"
190
168
  Provides-Extra: pyautogui
191
169
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
192
170
  Provides-Extra: selenium-stealth
@@ -243,11 +221,11 @@ Dynamic: summary
243
221
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">🌠 Scripts</a> |
244
222
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mobile_testing.md">📱 Mobile</a>
245
223
  <br />
246
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 APIs</a> |
247
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Formats</a> |
224
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 API</a> |
225
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Syntaxes</a> |
248
226
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
249
227
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a> |
250
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locales</a> |
228
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a> |
251
229
  <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">💻 Farm</a>
252
230
  <br />
253
231
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
@@ -258,44 +236,45 @@ Dynamic: summary
258
236
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">🌐 Grid</a>
259
237
  <br />
260
238
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
261
- <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝 Migrate</a> |
262
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CasePlans</a> |
263
- <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/boilerplates">♻️ Template</a> |
264
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🧬 Hybrid</a> |
239
+ <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝 Migration</a> |
240
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">🎭 Stealthy Playwright</a> |
241
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🛂 MasterQA</a> |
265
242
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
266
243
  <br />
267
244
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
268
245
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🕹️ JSMgr</a> |
269
246
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
270
247
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
271
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/dialog_boxes/ReadMe.md">🛂 Dialog</a> |
272
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a>
248
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
249
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
273
250
  <br />
274
251
  </p>
275
252
 
276
- <p>SeleniumBase is a browser automation framework for the modern web. Both new and experienced Python users alike can easily get started. With special stealth features like UC Mode and CDP Mode, you'll be evading bot-detection and bypassing CAPTCHAs in minutes.</p>
253
+ <p>SeleniumBase is a browser automation framework that empowers software teams to innovate faster and handle modern web challenges with ease. With stealth options like CDP Mode, you'll avoid the usual restrictions imposed by websites deploying bot-detection services.</p>
277
254
 
278
255
  --------
279
256
 
280
257
  📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/** folder](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
281
258
 
282
- 🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> help you evade bot-detection.
259
+ 🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></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, solve CAPTCHAs, and call advanced methods from the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome Devtools Protocol</a>.
283
260
 
284
- ℹ️ Most scripts run with raw <code translate="no"><b>python</b></code>, although some scripts use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
261
+ ℹ️ Many examples run with raw <code translate="no"><b>python</b></code>, although some use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
285
262
 
286
263
  --------
287
264
 
288
- <p align="left">📗 Here's a test script that performs a Google Search using SeleniumBase UC Mode:<br /><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py">SeleniumBase/examples/raw_google.py</a> (Results are saved as PDF, HTML, and PNG)</p>
265
+ <p align="left">📗 This script performs a Google Search using SeleniumBase UC Mode + CDP Mode:<br /><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py">SeleniumBase/examples/raw_google.py</a> (Results are saved as PDF, HTML, and PNG)</p>
289
266
 
290
267
  ```python
291
268
  from seleniumbase import SB
292
269
 
293
- with SB(test=True, uc=True) as sb:
294
- sb.open("https://google.com/ncr")
270
+ with SB(uc=True, test=True) as sb:
271
+ url = "https://google.com/ncr"
272
+ sb.activate_cdp_mode(url)
295
273
  sb.type('[title="Search"]', "SeleniumBase GitHub page")
296
274
  sb.click("div:not([jsname]) > * > input")
275
+ sb.sleep(2)
297
276
  print(sb.get_page_title())
298
- sb.sleep(2) # Wait for the "AI Overview" result
277
+ sb.sleep(1) # Wait for the "AI Overview" result
299
278
  if sb.is_text_visible("Generating"):
300
279
  sb.wait_for_text("AI Overview")
301
280
  sb.save_as_pdf_to_logs() # Saved to ./latest_logs/
@@ -317,8 +296,8 @@ from seleniumbase import SB
317
296
  with SB(uc=True, test=True, locale="en") as sb:
318
297
  url = "https://gitlab.com/users/sign_in"
319
298
  sb.activate_cdp_mode(url)
320
- sb.sleep(2.2)
321
- sb.uc_gui_click_captcha()
299
+ sb.sleep(2)
300
+ sb.solve_captcha()
322
301
  # (The rest is for testing and demo purposes)
323
302
  sb.assert_text("Username", '[for="user_login"]', timeout=3)
324
303
  sb.assert_element('label[for="user_login"]')
@@ -335,9 +314,9 @@ with SB(uc=True, test=True, locale="en") as sb:
335
314
  from seleniumbase import sb_cdp
336
315
 
337
316
  url = "https://gitlab.com/users/sign_in"
338
- sb = sb_cdp.Chrome(url)
339
- sb.sleep(2.5)
340
- sb.gui_click_captcha()
317
+ sb = sb_cdp.Chrome(url, incognito=True)
318
+ sb.sleep(2)
319
+ sb.solve_captcha()
341
320
  sb.highlight('h1:contains("GitLab")')
342
321
  sb.highlight('button:contains("Sign in")')
343
322
  sb.driver.stop()
@@ -24,11 +24,11 @@
24
24
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">🌠 Scripts</a> |
25
25
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mobile_testing.md">📱 Mobile</a>
26
26
  <br />
27
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 APIs</a> |
28
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Formats</a> |
27
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 API</a> |
28
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Syntaxes</a> |
29
29
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
30
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">🗾 Locales</a> |
31
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a> |
32
32
  <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">💻 Farm</a>
33
33
  <br />
34
34
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
@@ -39,44 +39,45 @@
39
39
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">🌐 Grid</a>
40
40
  <br />
41
41
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
42
- <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝 Migrate</a> |
43
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CasePlans</a> |
44
- <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/boilerplates">♻️ Template</a> |
45
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🧬 Hybrid</a> |
42
+ <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝 Migration</a> |
43
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">🎭 Stealthy Playwright</a> |
44
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🛂 MasterQA</a> |
46
45
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
47
46
  <br />
48
47
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
49
48
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🕹️ JSMgr</a> |
50
49
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
51
50
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
52
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/dialog_boxes/ReadMe.md">🛂 Dialog</a> |
53
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a>
51
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
52
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
54
53
  <br />
55
54
  </p>
56
55
 
57
- <p>SeleniumBase is a browser automation framework for the modern web. Both new and experienced Python users alike can easily get started. With special stealth features like UC Mode and CDP Mode, you'll be evading bot-detection and bypassing CAPTCHAs in minutes.</p>
56
+ <p>SeleniumBase is a browser automation framework that empowers software teams to innovate faster and handle modern web challenges with ease. With stealth options like CDP Mode, you'll avoid the usual restrictions imposed by websites deploying bot-detection services.</p>
58
57
 
59
58
  --------
60
59
 
61
60
  📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/** folder](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
62
61
 
63
- 🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> help you evade bot-detection.
62
+ 🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></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, solve CAPTCHAs, and call advanced methods from the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome Devtools Protocol</a>.
64
63
 
65
- ℹ️ Most scripts run with raw <code translate="no"><b>python</b></code>, although some scripts use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
64
+ ℹ️ Many examples run with raw <code translate="no"><b>python</b></code>, although some use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
66
65
 
67
66
  --------
68
67
 
69
- <p align="left">📗 Here's a test script that performs a Google Search using SeleniumBase UC Mode:<br /><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py">SeleniumBase/examples/raw_google.py</a> (Results are saved as PDF, HTML, and PNG)</p>
68
+ <p align="left">📗 This script performs a Google Search using SeleniumBase UC Mode + CDP Mode:<br /><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py">SeleniumBase/examples/raw_google.py</a> (Results are saved as PDF, HTML, and PNG)</p>
70
69
 
71
70
  ```python
72
71
  from seleniumbase import SB
73
72
 
74
- with SB(test=True, uc=True) as sb:
75
- sb.open("https://google.com/ncr")
73
+ with SB(uc=True, test=True) as sb:
74
+ url = "https://google.com/ncr"
75
+ sb.activate_cdp_mode(url)
76
76
  sb.type('[title="Search"]', "SeleniumBase GitHub page")
77
77
  sb.click("div:not([jsname]) > * > input")
78
+ sb.sleep(2)
78
79
  print(sb.get_page_title())
79
- sb.sleep(2) # Wait for the "AI Overview" result
80
+ sb.sleep(1) # Wait for the "AI Overview" result
80
81
  if sb.is_text_visible("Generating"):
81
82
  sb.wait_for_text("AI Overview")
82
83
  sb.save_as_pdf_to_logs() # Saved to ./latest_logs/
@@ -98,8 +99,8 @@ from seleniumbase import SB
98
99
  with SB(uc=True, test=True, locale="en") as sb:
99
100
  url = "https://gitlab.com/users/sign_in"
100
101
  sb.activate_cdp_mode(url)
101
- sb.sleep(2.2)
102
- sb.uc_gui_click_captcha()
102
+ sb.sleep(2)
103
+ sb.solve_captcha()
103
104
  # (The rest is for testing and demo purposes)
104
105
  sb.assert_text("Username", '[for="user_login"]', timeout=3)
105
106
  sb.assert_element('label[for="user_login"]')
@@ -116,9 +117,9 @@ with SB(uc=True, test=True, locale="en") as sb:
116
117
  from seleniumbase import sb_cdp
117
118
 
118
119
  url = "https://gitlab.com/users/sign_in"
119
- sb = sb_cdp.Chrome(url)
120
- sb.sleep(2.5)
121
- sb.gui_click_captcha()
120
+ sb = sb_cdp.Chrome(url, incognito=True)
121
+ sb.sleep(2)
122
+ sb.solve_captcha()
122
123
  sb.highlight('h1:contains("GitLab")')
123
124
  sb.highlight('button:contains("Sign in")')
124
125
  sb.driver.stop()
@@ -0,0 +1,84 @@
1
+ pip>=25.3
2
+ packaging>=25.0
3
+ setuptools~=70.2;python_version<"3.10"
4
+ setuptools>=80.9.0;python_version>="3.10"
5
+ wheel>=0.45.1
6
+ attrs>=25.4.0
7
+ certifi>=2025.11.12
8
+ exceptiongroup>=1.3.1
9
+ websockets>=15.0.1
10
+ filelock~=3.19.1;python_version<"3.10"
11
+ filelock>=3.20.0;python_version>="3.10"
12
+ fasteners>=0.20
13
+ mycdp>=1.3.2
14
+ pynose>=1.5.5
15
+ platformdirs~=4.4.0;python_version<"3.10"
16
+ platformdirs>=4.5.1;python_version>="3.10"
17
+ typing-extensions>=4.15.0
18
+ sbvirtualdisplay>=1.4.0
19
+ MarkupSafe>=3.0.3
20
+ Jinja2>=3.1.6
21
+ six>=1.17.0
22
+ parse>=1.20.2
23
+ parse-type>=0.6.6
24
+ colorama>=0.4.6
25
+ pyyaml>=6.0.3
26
+ pygments>=2.19.2
27
+ pyreadline3>=3.5.4;platform_system=="Windows"
28
+ tabcompleter>=1.4.0
29
+ pdbp>=1.8.1
30
+ idna>=3.11
31
+ chardet==5.2.0
32
+ charset-normalizer>=3.4.4,<4
33
+ urllib3>=1.26.20,<2;python_version<"3.10"
34
+ urllib3>=1.26.20,<3;python_version>="3.10"
35
+ requests~=2.32.5
36
+ sniffio==1.3.1
37
+ h11==0.16.0
38
+ outcome==1.3.0.post0
39
+ trio>=0.31.0,<1;python_version<"3.10"
40
+ trio>=0.32.0,<1;python_version>="3.10"
41
+ trio-websocket~=0.12.2
42
+ wsproto==1.2.0;python_version<"3.10"
43
+ wsproto~=1.3.2;python_version>="3.10"
44
+ websocket-client~=1.9.0
45
+ selenium==4.32.0;python_version<"3.10"
46
+ selenium==4.39.0;python_version>="3.10"
47
+ cssselect==1.3.0
48
+ nest-asyncio==1.6.0
49
+ sortedcontainers==2.4.0
50
+ execnet==2.1.1;python_version<"3.10"
51
+ execnet==2.1.2;python_version>="3.10"
52
+ iniconfig==2.1.0;python_version<"3.10"
53
+ iniconfig==2.3.0;python_version>="3.10"
54
+ pluggy==1.6.0
55
+ pytest==8.4.2;python_version<"3.11"
56
+ pytest==9.0.2;python_version>="3.11"
57
+ pytest-html==4.0.2
58
+ pytest-metadata==3.1.1
59
+ pytest-ordering==0.6
60
+ pytest-rerunfailures==16.0.1;python_version<"3.10"
61
+ pytest-rerunfailures==16.1;python_version>="3.10"
62
+ pytest-xdist==3.8.0
63
+ parameterized==0.9.0
64
+ behave==1.2.6
65
+ soupsieve~=2.8
66
+ beautifulsoup4~=4.14.3
67
+ pyotp==2.9.0
68
+ python-xlib==0.33;platform_system=="Linux"
69
+ PyAutoGUI>=0.9.54;platform_system=="Linux"
70
+ markdown-it-py==3.0.0;python_version<"3.10"
71
+ markdown-it-py==4.0.0;python_version>="3.10"
72
+ mdurl==0.1.2
73
+ rich>=14.2.0,<15
74
+
75
+ # --- Testing Requirements --- #
76
+ # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
77
+
78
+ coverage>=7.10.7;python_version<"3.10"
79
+ coverage>=7.13.0;python_version>="3.10"
80
+ pytest-cov>=7.0.0
81
+ flake8==7.3.0
82
+ mccabe==0.7.0
83
+ pyflakes==3.4.0
84
+ pycodestyle==2.14.0
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.44.1"
2
+ __version__ = "4.45.1"
@@ -113,6 +113,7 @@ import sys
113
113
  from contextlib import suppress
114
114
  from seleniumbase import config as sb_config
115
115
  from seleniumbase.config import settings
116
+ from seleniumbase.core import detect_b_ver
116
117
  from seleniumbase.core import download_helper
117
118
  from seleniumbase.core import log_helper
118
119
  from seleniumbase.core import proxy_helper
@@ -890,6 +891,13 @@ def get_configured_sb(context):
890
891
  "\nOnly ONE default browser is allowed!\n"
891
892
  "%s browsers were selected: %s" % (len(browsers), browsers)
892
893
  )
894
+ if sb.browser in ["opera", "brave", "comet", "atlas"]:
895
+ bin_loc = detect_b_ver.get_binary_location(sb.browser)
896
+ if bin_loc and os.path.exists(bin_loc):
897
+ sb_config._cdp_browser = sb.browser
898
+ sb_config._cdp_bin_loc = bin_loc
899
+ sb_config.binary_location = bin_loc
900
+ sb.binary_location = bin_loc
893
901
  # Recorder Mode can still optimize scripts in "-D headless2" mode.
894
902
  if sb.recorder_ext and sb.headless:
895
903
  sb.headless = False
@@ -177,7 +177,7 @@ def requests_get_with_retry(url):
177
177
 
178
178
 
179
179
  def get_cft_known_good_versions():
180
- if hasattr(sb_config, "cft_kgv_json") and sb_config.cft_kgv_json:
180
+ if getattr(sb_config, "cft_kgv_json", None):
181
181
  return sb_config.cft_kgv_json
182
182
  cft_ngv_url = (
183
183
  "https://googlechromelabs.github.io/"
@@ -188,7 +188,7 @@ def get_cft_known_good_versions():
188
188
 
189
189
 
190
190
  def get_cft_latest_versions_per_milestone():
191
- if hasattr(sb_config, "cft_lvpm_json") and sb_config.cft_lvpm_json:
191
+ if getattr(sb_config, "cft_lvpm_json", None):
192
192
  return sb_config.cft_lvpm_json
193
193
  cft_lvpm_url = (
194
194
  "https://googlechromelabs.github.io/"
@@ -205,7 +205,7 @@ def get_cft_latest_version_from_milestone(milestone):
205
205
 
206
206
  def get_latest_chromedriver_version(channel="Stable"):
207
207
  try:
208
- if hasattr(sb_config, "cft_lkgv_json") and sb_config.cft_lkgv_json:
208
+ if getattr(sb_config, "cft_lkgv_json", None):
209
209
  return sb_config.cft_lkgv_json["channels"][channel]["version"]
210
210
  req = requests_get(
211
211
  "https://googlechromelabs.github.io/"
@@ -239,10 +239,7 @@ def get_latest_canary_chromedriver_version():
239
239
  def log_d(message):
240
240
  """If setting sb_config.settings.HIDE_DRIVER_DOWNLOADS to True,
241
241
  output from driver downloads are logged instead of printed."""
242
- if (
243
- hasattr(sb_config.settings, "HIDE_DRIVER_DOWNLOADS")
244
- and sb_config.settings.HIDE_DRIVER_DOWNLOADS
245
- ):
242
+ if getattr(sb_config.settings, "HIDE_DRIVER_DOWNLOADS", None):
246
243
  logging.debug(message)
247
244
  else:
248
245
  print(message)
@@ -251,7 +248,7 @@ def log_d(message):
251
248
  def main(override=None, intel_for_uc=None, force_uc=None):
252
249
  if override:
253
250
  found_proxy = None
254
- if hasattr(sb_config, "proxy_driver") and sb_config.proxy_driver:
251
+ if getattr(sb_config, "proxy_driver", None):
255
252
  if " --proxy=" in " ".join(sys.argv):
256
253
  for arg in sys.argv:
257
254
  if arg.startswith("--proxy="):
@@ -311,8 +308,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
311
308
  downloads_folder = DRIVER_DIR
312
309
  if (
313
310
  hasattr(sb_config, "settings")
314
- and hasattr(sb_config.settings, "NEW_DRIVER_DIR")
315
- and sb_config.settings.NEW_DRIVER_DIR
311
+ and getattr(sb_config.settings, "NEW_DRIVER_DIR", None)
316
312
  and os.path.exists(sb_config.settings.NEW_DRIVER_DIR)
317
313
  ):
318
314
  downloads_folder = sb_config.settings.NEW_DRIVER_DIR
@@ -84,6 +84,10 @@ def main():
84
84
  error_msg = None
85
85
  invalid_cmd = None
86
86
  use_edge = False
87
+ use_opera = False
88
+ use_brave = False
89
+ use_comet = False
90
+ use_atlas = False
87
91
  use_uc = False
88
92
  esc_end = False
89
93
  start_page = None
@@ -138,6 +142,14 @@ def main():
138
142
  help_me = True
139
143
  elif option.lower() == "--edge":
140
144
  use_edge = True
145
+ elif option.lower() == "--opera":
146
+ use_opera = True
147
+ elif option.lower() == "--brave":
148
+ use_brave = True
149
+ elif option.lower() == "--comet":
150
+ use_comet = True
151
+ elif option.lower() == "--atlas":
152
+ use_atlas = True
141
153
  elif option.lower() == "--ee":
142
154
  esc_end = True
143
155
  elif option.lower() in ("--gui", "--headed"):
@@ -275,6 +287,14 @@ def main():
275
287
  )
276
288
  if use_edge:
277
289
  run_cmd += " --edge"
290
+ elif use_opera:
291
+ run_cmd += " --opera"
292
+ elif use_brave:
293
+ run_cmd += " --brave"
294
+ elif use_comet:
295
+ run_cmd += " --comet"
296
+ elif use_atlas:
297
+ run_cmd += " --atlas"
278
298
  if force_gui:
279
299
  run_cmd += " --gui"
280
300
  if use_uc: