seleniumbase 4.35.0__tar.gz → 4.35.2__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 (156) hide show
  1. {seleniumbase-4.35.0/seleniumbase.egg-info → seleniumbase-4.35.2}/PKG-INFO +6 -6
  2. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/README.md +2 -2
  3. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/requirements.txt +2 -2
  4. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/__init__.py +2 -0
  5. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/__version__.py +1 -1
  6. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_mkdir.py +3 -0
  7. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/browser_launcher.py +6 -2
  8. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/sb_cdp.py +40 -14
  9. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/js_utils.py +2 -0
  10. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/driver_manager.py +2 -2
  11. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/pytest_plugin.py +3 -0
  12. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/sb_manager.py +1 -1
  13. seleniumbase-4.35.2/seleniumbase/undetected/cdp_driver/__init__.py +3 -0
  14. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/cdp_driver/browser.py +4 -0
  15. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/cdp_driver/cdp_util.py +13 -8
  16. {seleniumbase-4.35.0 → seleniumbase-4.35.2/seleniumbase.egg-info}/PKG-INFO +6 -6
  17. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase.egg-info/requires.txt +3 -3
  18. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/setup.py +3 -3
  19. seleniumbase-4.35.0/seleniumbase/undetected/cdp_driver/__init__.py +0 -1
  20. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/.gitignore +0 -0
  21. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/LICENSE +0 -0
  22. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/MANIFEST.in +0 -0
  23. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/install.sh +0 -0
  24. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/pyproject.toml +0 -0
  25. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/pytest.ini +0 -0
  26. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/sbase/__init__.py +0 -0
  27. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/sbase/__main__.py +0 -0
  28. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/sbase/steps.py +0 -0
  29. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/__main__.py +0 -0
  30. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/behave/__init__.py +0 -0
  31. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/behave/behave_helper.py +0 -0
  32. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/behave/behave_sb.py +0 -0
  33. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/behave/steps.py +0 -0
  34. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/common/__init__.py +0 -0
  35. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/common/decorators.py +0 -0
  36. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/common/encryption.py +0 -0
  37. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/common/exceptions.py +0 -0
  38. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/common/obfuscate.py +0 -0
  39. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/common/unobfuscate.py +0 -0
  40. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/config/__init__.py +0 -0
  41. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/config/ad_block_list.py +0 -0
  42. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/config/proxy_list.py +0 -0
  43. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/config/settings.py +0 -0
  44. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/__init__.py +0 -0
  45. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/logo_helper.py +0 -0
  46. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/rich_helper.py +0 -0
  47. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/run.py +0 -0
  48. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  49. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  50. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_commander.py +0 -0
  51. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_install.py +0 -0
  52. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  53. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  54. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  55. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  56. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  57. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_print.py +0 -0
  58. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  59. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/__init__.py +0 -0
  60. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/application_manager.py +0 -0
  61. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/capabilities_parser.py +0 -0
  62. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/colored_traceback.py +0 -0
  63. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/create_db_tables.sql +0 -0
  64. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/detect_b_ver.py +0 -0
  65. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/download_helper.py +0 -0
  66. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/encoded_images.py +0 -0
  67. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/jqc_helper.py +0 -0
  68. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/log_helper.py +0 -0
  69. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/mysql.py +0 -0
  70. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/proxy_helper.py +0 -0
  71. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/recorder_helper.py +0 -0
  72. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/report_helper.py +0 -0
  73. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/s3_manager.py +0 -0
  74. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/sb_driver.py +0 -0
  75. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/session_helper.py +0 -0
  76. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/settings_parser.py +0 -0
  77. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/style_sheet.py +0 -0
  78. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/testcase_manager.py +0 -0
  79. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/tour_helper.py +0 -0
  80. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/core/visual_helper.py +0 -0
  81. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/drivers/__init__.py +0 -0
  82. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/extensions/__init__.py +0 -0
  83. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/extensions/ad_block.zip +0 -0
  84. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/extensions/disable_csp.zip +0 -0
  85. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/extensions/recorder.zip +0 -0
  86. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/extensions/sbase_ext.zip +0 -0
  87. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/__init__.py +0 -0
  88. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/base_case.py +0 -0
  89. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/constants.py +0 -0
  90. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  91. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/errors.py +0 -0
  92. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/page_actions.py +0 -0
  93. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/page_utils.py +0 -0
  94. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/shared_utils.py +0 -0
  95. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/unittest_helper.py +0 -0
  96. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/words.py +0 -0
  97. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  98. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/js_code/__init__.py +0 -0
  99. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/js_code/active_css_js.py +0 -0
  100. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/js_code/live_js.py +0 -0
  101. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/js_code/recorder_js.py +0 -0
  102. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/masterqa/__init__.py +0 -0
  103. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/masterqa/master_qa.py +0 -0
  104. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/__init__.py +0 -0
  105. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/base_plugin.py +0 -0
  106. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/basic_test_info.py +0 -0
  107. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  108. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/page_source.py +0 -0
  109. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  110. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/screen_shots.py +0 -0
  111. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/plugins/selenium_plugin.py +0 -0
  112. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/resources/__init__.py +0 -0
  113. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/__init__.py +0 -0
  114. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/chinese.py +0 -0
  115. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/dutch.py +0 -0
  116. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/french.py +0 -0
  117. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/italian.py +0 -0
  118. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/japanese.py +0 -0
  119. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/korean.py +0 -0
  120. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/master_dict.py +0 -0
  121. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/portuguese.py +0 -0
  122. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/russian.py +0 -0
  123. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/spanish.py +0 -0
  124. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/translate/translator.py +0 -0
  125. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/__init__.py +0 -0
  126. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/cdp.py +0 -0
  127. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  128. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  129. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  130. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  131. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  132. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/dprocess.py +0 -0
  133. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/options.py +0 -0
  134. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/patcher.py +0 -0
  135. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/reactor.py +0 -0
  136. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/undetected/webelement.py +0 -0
  137. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/__init__.py +0 -0
  138. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  139. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  140. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  141. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  142. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  143. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  144. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  145. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  146. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  147. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  148. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  149. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  150. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  151. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase.egg-info/SOURCES.txt +0 -0
  152. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase.egg-info/dependency_links.txt +0 -0
  153. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase.egg-info/entry_points.txt +0 -0
  154. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/seleniumbase.egg-info/top_level.txt +0 -0
  155. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/setup.cfg +0 -0
  156. {seleniumbase-4.35.0 → seleniumbase-4.35.2}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.35.0
3
+ Version: 4.35.2
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
@@ -62,7 +62,7 @@ License-File: LICENSE
62
62
  Requires-Dist: pip>=25.0.1
63
63
  Requires-Dist: packaging>=24.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
- Requires-Dist: setuptools>=75.8.0; python_version >= "3.10"
65
+ Requires-Dist: setuptools>=75.8.2; python_version >= "3.10"
66
66
  Requires-Dist: wheel>=0.45.1
67
67
  Requires-Dist: attrs>=25.1.0
68
68
  Requires-Dist: certifi>=2025.1.31
@@ -100,7 +100,7 @@ Requires-Dist: h11==0.14.0
100
100
  Requires-Dist: outcome==1.3.0.post0
101
101
  Requires-Dist: trio==0.27.0; python_version < "3.9"
102
102
  Requires-Dist: trio==0.29.0; python_version >= "3.9"
103
- Requires-Dist: trio-websocket==0.12.1
103
+ Requires-Dist: trio-websocket==0.12.2
104
104
  Requires-Dist: wsproto==1.2.0
105
105
  Requires-Dist: websocket-client==1.8.0
106
106
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
@@ -162,7 +162,7 @@ Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra ==
162
162
  Provides-Extra: proxy
163
163
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
164
164
  Provides-Extra: psutil
165
- Requires-Dist: psutil==6.0.0; extra == "psutil"
165
+ Requires-Dist: psutil==7.0.0; extra == "psutil"
166
166
  Provides-Extra: pyautogui
167
167
  Requires-Dist: PyAutoGUI==0.9.54; extra == "pyautogui"
168
168
  Provides-Extra: selenium-stealth
@@ -265,7 +265,7 @@ Dynamic: summary
265
265
  ```python
266
266
  from seleniumbase import SB
267
267
 
268
- with SB(test=True) as sb:
268
+ with SB(test=True, uc=True) as sb:
269
269
  sb.open("https://google.com/ncr")
270
270
  sb.type('[title="Search"]', "SeleniumBase GitHub page\n")
271
271
  sb.click('[href*="github.com/seleniumbase/"]')
@@ -284,7 +284,7 @@ with SB(test=True) as sb:
284
284
  ```python
285
285
  from seleniumbase import SB
286
286
 
287
- with SB(uc=True, test=True, locale_code="en") as sb:
287
+ with SB(uc=True, test=True, locale="en") as sb:
288
288
  url = "https://gitlab.com/users/sign_in"
289
289
  sb.activate_cdp_mode(url)
290
290
  sb.uc_gui_click_captcha()
@@ -71,7 +71,7 @@
71
71
  ```python
72
72
  from seleniumbase import SB
73
73
 
74
- with SB(test=True) as sb:
74
+ with SB(test=True, uc=True) as sb:
75
75
  sb.open("https://google.com/ncr")
76
76
  sb.type('[title="Search"]', "SeleniumBase GitHub page\n")
77
77
  sb.click('[href*="github.com/seleniumbase/"]')
@@ -90,7 +90,7 @@ with SB(test=True) as sb:
90
90
  ```python
91
91
  from seleniumbase import SB
92
92
 
93
- with SB(uc=True, test=True, locale_code="en") as sb:
93
+ with SB(uc=True, test=True, locale="en") as sb:
94
94
  url = "https://gitlab.com/users/sign_in"
95
95
  sb.activate_cdp_mode(url)
96
96
  sb.uc_gui_click_captcha()
@@ -1,7 +1,7 @@
1
1
  pip>=25.0.1
2
2
  packaging>=24.2
3
3
  setuptools~=70.2;python_version<"3.10"
4
- setuptools>=75.8.0;python_version>="3.10"
4
+ setuptools>=75.8.2;python_version>="3.10"
5
5
  wheel>=0.45.1
6
6
  attrs>=25.1.0
7
7
  certifi>=2025.1.31
@@ -39,7 +39,7 @@ h11==0.14.0
39
39
  outcome==1.3.0.post0
40
40
  trio==0.27.0;python_version<"3.9"
41
41
  trio==0.29.0;python_version>="3.9"
42
- trio-websocket==0.12.1
42
+ trio-websocket==0.12.2
43
43
  wsproto==1.2.0
44
44
  websocket-client==1.8.0
45
45
  selenium==4.27.1;python_version<"3.9"
@@ -8,6 +8,7 @@ from seleniumbase.__version__ import __version__
8
8
  from seleniumbase.common import decorators # noqa
9
9
  from seleniumbase.common import encryption # noqa
10
10
  from seleniumbase.core import colored_traceback
11
+ from seleniumbase.core import sb_cdp # noqa
11
12
  from seleniumbase.core.browser_launcher import get_driver # noqa
12
13
  from seleniumbase.fixtures import js_utils # noqa
13
14
  from seleniumbase.fixtures import page_actions # noqa
@@ -18,6 +19,7 @@ from seleniumbase.masterqa.master_qa import MasterQA # noqa
18
19
  from seleniumbase.plugins.sb_manager import SB # noqa
19
20
  from seleniumbase.plugins.driver_manager import Driver # noqa
20
21
  from seleniumbase.plugins.driver_manager import DriverContext # noqa
22
+ from seleniumbase.undetected import cdp_driver # noqa
21
23
  from seleniumbase import translate # noqa
22
24
 
23
25
  with suppress(Exception):
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.35.0"
2
+ __version__ = "4.35.2"
@@ -631,10 +631,13 @@ def main():
631
631
  data = []
632
632
  data.append("from seleniumbase import BaseCase")
633
633
  data.append("from .google_objects import HomePage, ResultsPage")
634
+ data.append('BaseCase.main(__name__, __file__, "--uc")')
634
635
  data.append("")
635
636
  data.append("")
636
637
  data.append("class GoogleTests(BaseCase):")
637
638
  data.append(" def test_google_dot_com(self):")
639
+ data.append(" if not self.undetectable:")
640
+ data.append(" self.get_new_driver(undetectable=True)")
638
641
  data.append(' self.open("https://google.com/ncr")')
639
642
  data.append(' self.assert_title_contains("Google")')
640
643
  data.append(" self.sleep(0.05)")
@@ -235,8 +235,12 @@ def extend_driver(driver, proxy_auth=False, use_uc=True):
235
235
  driver.reset_window_size = DM.reset_window_size
236
236
  if hasattr(driver, "proxy"):
237
237
  driver.set_wire_proxy = DM.set_wire_proxy
238
- if proxy_auth and not use_uc:
239
- time.sleep(0.11) # Proxy needs moment to load in Manifest V3
238
+ if proxy_auth:
239
+ # Proxy needs a moment to load in Manifest V3
240
+ if use_uc:
241
+ time.sleep(0.12)
242
+ else:
243
+ time.sleep(0.22)
240
244
  return driver
241
245
 
242
246
 
@@ -1,4 +1,5 @@
1
1
  """Add CDP methods to extend the driver"""
2
+ import asyncio
2
3
  import fasteners
3
4
  import os
4
5
  import re
@@ -11,6 +12,7 @@ from seleniumbase.fixtures import constants
11
12
  from seleniumbase.fixtures import js_utils
12
13
  from seleniumbase.fixtures import page_utils
13
14
  from seleniumbase.fixtures import shared_utils
15
+ from seleniumbase.undetected.cdp_driver import cdp_util
14
16
 
15
17
 
16
18
  class CDPMethods():
@@ -208,14 +210,16 @@ class CDPMethods():
208
210
  element = self.__add_sync_methods(element)
209
211
  return self.__add_sync_methods(element)
210
212
  elif (
211
- element.parent
213
+ element
214
+ and element.parent
212
215
  and tag_name in element.parent.tag_name.lower()
213
216
  and text.strip() in element.parent.text
214
217
  ):
215
218
  element = self.__add_sync_methods(element.parent)
216
219
  return self.__add_sync_methods(element)
217
220
  elif (
218
- element.parent
221
+ element
222
+ and element.parent
219
223
  and element.parent.parent
220
224
  and tag_name in element.parent.parent.tag_name.lower()
221
225
  and text.strip() in element.parent.parent.text
@@ -269,7 +273,8 @@ class CDPMethods():
269
273
  if element not in updated_elements:
270
274
  updated_elements.append(element)
271
275
  elif (
272
- element.parent
276
+ element
277
+ and element.parent
273
278
  and tag_name in element.parent.tag_name.lower()
274
279
  and text.strip() in element.parent.text
275
280
  ):
@@ -277,7 +282,8 @@ class CDPMethods():
277
282
  if element not in updated_elements:
278
283
  updated_elements.append(element)
279
284
  elif (
280
- element.parent
285
+ element
286
+ and element.parent
281
287
  and element.parent.parent
282
288
  and tag_name in element.parent.parent.tag_name.lower()
283
289
  and text.strip() in element.parent.parent.text
@@ -288,7 +294,7 @@ class CDPMethods():
288
294
  return updated_elements
289
295
 
290
296
  def select(self, selector, timeout=None):
291
- """Similar to find_element(), but without text-based search."""
297
+ """Similar to find_element()."""
292
298
  if not timeout:
293
299
  timeout = settings.SMALL_TIMEOUT
294
300
  self.__add_light_pause()
@@ -297,12 +303,25 @@ class CDPMethods():
297
303
  tag_name = selector.split(":contains(")[0].split(" ")[-1]
298
304
  text = selector.split(":contains(")[1].split(")")[0][1:-1]
299
305
  with suppress(Exception):
306
+ new_timeout = timeout
307
+ if new_timeout < 1:
308
+ new_timeout = 1
300
309
  self.loop.run_until_complete(
301
- self.page.select(tag_name, timeout=5)
310
+ self.page.select(tag_name, timeout=new_timeout)
302
311
  )
303
- self.loop.run_until_complete(self.page.find(text, timeout=5))
304
- element = self.find_elements_by_text(text, tag_name=tag_name)[0]
305
- return self.__add_sync_methods(element)
312
+ self.loop.run_until_complete(
313
+ self.page.find(text, timeout=new_timeout)
314
+ )
315
+ elements = self.find_elements_by_text(text, tag_name=tag_name)
316
+ if not elements:
317
+ plural = "s"
318
+ if timeout == 1:
319
+ plural = ""
320
+ msg = "\n Element {%s} was not found after %s second%s!"
321
+ message = msg % (selector, timeout, plural)
322
+ raise Exception(message)
323
+ element = self.__add_sync_methods(elements[0])
324
+ return element
306
325
  failure = False
307
326
  try:
308
327
  element = self.loop.run_until_complete(
@@ -313,11 +332,8 @@ class CDPMethods():
313
332
  plural = "s"
314
333
  if timeout == 1:
315
334
  plural = ""
316
- message = "\n Element {%s} was not found after %s second%s!" % (
317
- selector,
318
- timeout,
319
- plural,
320
- )
335
+ msg = "\n Element {%s} was not found after %s second%s!"
336
+ message = msg % (selector, timeout, plural)
321
337
  if failure:
322
338
  raise Exception(message)
323
339
  element = self.__add_sync_methods(element)
@@ -2083,3 +2099,13 @@ class CDPMethods():
2083
2099
  )
2084
2100
  else:
2085
2101
  self.select(selector).save_screenshot(filename)
2102
+
2103
+
2104
+ class Chrome(CDPMethods):
2105
+ def __init__(self, url=None, **kwargs):
2106
+ if not url:
2107
+ url = "about:blank"
2108
+ loop = asyncio.new_event_loop()
2109
+ driver = cdp_util.start_sync(**kwargs)
2110
+ page = loop.run_until_complete(driver.get(url))
2111
+ super().__init__(loop, page, driver)
@@ -950,6 +950,8 @@ def post_message(driver, message, msg_dur=None, style="info"):
950
950
  set_messenger_theme(driver)
951
951
  try:
952
952
  execute_script(driver, messenger_script)
953
+ except TypeError:
954
+ pass
953
955
  except Exception:
954
956
  time.sleep(0.17)
955
957
  activate_messenger(driver)
@@ -10,7 +10,7 @@ Example -->
10
10
  ```python
11
11
  from seleniumbase import DriverContext
12
12
 
13
- with DriverContext() as driver:
13
+ with DriverContext(uc=True) as driver:
14
14
  driver.get("https://google.com/ncr")
15
15
  ```
16
16
 
@@ -30,7 +30,7 @@ Example -->
30
30
  ```python
31
31
  from seleniumbase import Driver
32
32
 
33
- driver = Driver()
33
+ driver = Driver(uc=True)
34
34
  driver.get("https://google.com/ncr")
35
35
  ```
36
36
 
@@ -2496,6 +2496,9 @@ def pytest_unconfigure(config):
2496
2496
  """This runs after all tests have completed with pytest."""
2497
2497
  if "--co" in sys_argv or "--collect-only" in sys_argv:
2498
2498
  return
2499
+ reporter = config.pluginmanager.get_plugin("terminalreporter")
2500
+ if not hasattr(reporter, "_sessionstarttime"):
2501
+ return
2499
2502
  if hasattr(sb_config, "_multithreaded") and sb_config._multithreaded:
2500
2503
  import fasteners
2501
2504
 
@@ -10,7 +10,7 @@ Example -->
10
10
  ```python
11
11
  from seleniumbase import SB
12
12
 
13
- with SB() as sb: # Many args! Eg. SB(browser="edge")
13
+ with SB(uc=True) as sb: # Many args! Eg. SB(browser="edge")
14
14
  sb.open("https://google.com/ncr")
15
15
  sb.type('[name="q"]', "SeleniumBase on GitHub\n")
16
16
  sb.click('a[href*="github.com/seleniumbase"]')
@@ -0,0 +1,3 @@
1
+ from seleniumbase.undetected.cdp_driver import cdp_util # noqa
2
+ from seleniumbase.undetected.cdp_driver.cdp_util import start_async # noqa
3
+ from seleniumbase.undetected.cdp_driver.cdp_util import start_sync # noqa
@@ -15,6 +15,7 @@ import urllib.parse
15
15
  import urllib.request
16
16
  import warnings
17
17
  from collections import defaultdict
18
+ from seleniumbase import config as sb_config
18
19
  from typing import List, Set, Tuple, Union
19
20
  import mycdp as cdp
20
21
  from . import cdp_util as util
@@ -287,6 +288,9 @@ class Browser:
287
288
  filter(lambda item: item.type_ == "page", self.targets)
288
289
  )
289
290
  # Use the tab to navigate to new url
291
+ if hasattr(sb_config, "_cdp_locale") and sb_config._cdp_locale:
292
+ await connection.send(cdp.page.navigate("about:blank"))
293
+ await connection.set_locale(sb_config._cdp_locale)
290
294
  frame_id, loader_id, *_ = await connection.send(
291
295
  cdp.page.navigate(url)
292
296
  )
@@ -232,9 +232,9 @@ async def start(
232
232
  browser_args: Optional[List[str]] = None,
233
233
  xvfb_metrics: Optional[List[str]] = None, # "Width,Height" for Linux
234
234
  sandbox: Optional[bool] = True,
235
- lang: Optional[str] = None,
236
- host: Optional[str] = None,
237
- port: Optional[int] = None,
235
+ lang: Optional[str] = None, # Set the Language Locale Code
236
+ host: Optional[str] = None, # Chrome remote-debugging-host
237
+ port: Optional[int] = None, # Chrome remote-debugging-port
238
238
  xvfb: Optional[int] = None, # Use a special virtual display on Linux
239
239
  headed: Optional[bool] = None, # Override default Xvfb mode on Linux
240
240
  expert: Optional[bool] = None, # Open up closed Shadow-root elements
@@ -320,7 +320,15 @@ async def start(
320
320
  time.sleep(0.15)
321
321
  driver = await Browser.create(config)
322
322
  if proxy and "@" in str(proxy):
323
- time.sleep(0.11)
323
+ time.sleep(0.15)
324
+ if lang:
325
+ sb_config._cdp_locale = lang
326
+ elif "locale" in kwargs:
327
+ sb_config._cdp_locale = kwargs["locale"]
328
+ elif "locale_code" in kwargs:
329
+ sb_config._cdp_locale = kwargs["locale_code"]
330
+ else:
331
+ sb_config._cdp_locale = None
324
332
  return driver
325
333
 
326
334
 
@@ -360,10 +368,7 @@ def start_sync(*args, **kwargs) -> Browser:
360
368
  ):
361
369
  loop = kwargs["loop"]
362
370
  else:
363
- try:
364
- loop = asyncio.get_event_loop()
365
- except RuntimeError:
366
- loop = asyncio.new_event_loop()
371
+ loop = asyncio.new_event_loop()
367
372
  headless = False
368
373
  binary_location = None
369
374
  if "browser_executable_path" in kwargs:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.35.0
3
+ Version: 4.35.2
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
@@ -62,7 +62,7 @@ License-File: LICENSE
62
62
  Requires-Dist: pip>=25.0.1
63
63
  Requires-Dist: packaging>=24.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
- Requires-Dist: setuptools>=75.8.0; python_version >= "3.10"
65
+ Requires-Dist: setuptools>=75.8.2; python_version >= "3.10"
66
66
  Requires-Dist: wheel>=0.45.1
67
67
  Requires-Dist: attrs>=25.1.0
68
68
  Requires-Dist: certifi>=2025.1.31
@@ -100,7 +100,7 @@ Requires-Dist: h11==0.14.0
100
100
  Requires-Dist: outcome==1.3.0.post0
101
101
  Requires-Dist: trio==0.27.0; python_version < "3.9"
102
102
  Requires-Dist: trio==0.29.0; python_version >= "3.9"
103
- Requires-Dist: trio-websocket==0.12.1
103
+ Requires-Dist: trio-websocket==0.12.2
104
104
  Requires-Dist: wsproto==1.2.0
105
105
  Requires-Dist: websocket-client==1.8.0
106
106
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
@@ -162,7 +162,7 @@ Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra ==
162
162
  Provides-Extra: proxy
163
163
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
164
164
  Provides-Extra: psutil
165
- Requires-Dist: psutil==6.0.0; extra == "psutil"
165
+ Requires-Dist: psutil==7.0.0; extra == "psutil"
166
166
  Provides-Extra: pyautogui
167
167
  Requires-Dist: PyAutoGUI==0.9.54; extra == "pyautogui"
168
168
  Provides-Extra: selenium-stealth
@@ -265,7 +265,7 @@ Dynamic: summary
265
265
  ```python
266
266
  from seleniumbase import SB
267
267
 
268
- with SB(test=True) as sb:
268
+ with SB(test=True, uc=True) as sb:
269
269
  sb.open("https://google.com/ncr")
270
270
  sb.type('[title="Search"]', "SeleniumBase GitHub page\n")
271
271
  sb.click('[href*="github.com/seleniumbase/"]')
@@ -284,7 +284,7 @@ with SB(test=True) as sb:
284
284
  ```python
285
285
  from seleniumbase import SB
286
286
 
287
- with SB(uc=True, test=True, locale_code="en") as sb:
287
+ with SB(uc=True, test=True, locale="en") as sb:
288
288
  url = "https://gitlab.com/users/sign_in"
289
289
  sb.activate_cdp_mode(url)
290
290
  sb.uc_gui_click_captcha()
@@ -26,7 +26,7 @@ requests==2.32.3
26
26
  sniffio==1.3.1
27
27
  h11==0.14.0
28
28
  outcome==1.3.0.post0
29
- trio-websocket==0.12.1
29
+ trio-websocket==0.12.2
30
30
  wsproto==1.2.0
31
31
  websocket-client==1.8.0
32
32
  cssselect==1.2.0
@@ -67,7 +67,7 @@ selenium==4.27.1
67
67
  pytest-rerunfailures==14.0
68
68
 
69
69
  [:python_version >= "3.10"]
70
- setuptools>=75.8.0
70
+ setuptools>=75.8.2
71
71
  urllib3<2.4.0,>=1.26.20
72
72
 
73
73
  [:python_version >= "3.9"]
@@ -141,7 +141,7 @@ pip-system-certs==4.0
141
141
  proxy.py==2.4.3
142
142
 
143
143
  [psutil]
144
- psutil==6.0.0
144
+ psutil==7.0.0
145
145
 
146
146
  [pyautogui]
147
147
  PyAutoGUI==0.9.54
@@ -150,7 +150,7 @@ setup(
150
150
  'pip>=25.0.1',
151
151
  'packaging>=24.2',
152
152
  'setuptools~=70.2;python_version<"3.10"', # Newer ones had issues
153
- 'setuptools>=75.8.0;python_version>="3.10"',
153
+ 'setuptools>=75.8.2;python_version>="3.10"',
154
154
  'wheel>=0.45.1',
155
155
  'attrs>=25.1.0',
156
156
  "certifi>=2025.1.31",
@@ -188,7 +188,7 @@ setup(
188
188
  'outcome==1.3.0.post0',
189
189
  'trio==0.27.0;python_version<"3.9"',
190
190
  'trio==0.29.0;python_version>="3.9"',
191
- 'trio-websocket==0.12.1',
191
+ 'trio-websocket==0.12.2',
192
192
  'wsproto==1.2.0',
193
193
  'websocket-client==1.8.0',
194
194
  'selenium==4.27.1;python_version<"3.9"',
@@ -283,7 +283,7 @@ setup(
283
283
  ],
284
284
  # pip install -e .[psutil]
285
285
  "psutil": [
286
- "psutil==6.0.0",
286
+ "psutil==7.0.0",
287
287
  ],
288
288
  # pip install -e .[pyautogui]
289
289
  "pyautogui": [
@@ -1 +0,0 @@
1
- from seleniumbase.undetected.cdp_driver import cdp_util # noqa
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes