seleniumbase 4.41.9__tar.gz → 4.41.11__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 (158) hide show
  1. {seleniumbase-4.41.9/seleniumbase.egg-info → seleniumbase-4.41.11}/PKG-INFO +6 -5
  2. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/README.md +1 -0
  3. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/requirements.txt +3 -3
  4. seleniumbase-4.41.11/seleniumbase/__version__.py +2 -0
  5. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/browser_launcher.py +51 -9
  6. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/sb_cdp.py +44 -27
  7. {seleniumbase-4.41.9 → seleniumbase-4.41.11/seleniumbase.egg-info}/PKG-INFO +6 -5
  8. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase.egg-info/requires.txt +4 -4
  9. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/setup.py +4 -4
  10. seleniumbase-4.41.9/seleniumbase/__version__.py +0 -2
  11. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/.gitignore +0 -0
  12. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/LICENSE +0 -0
  13. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/MANIFEST.in +0 -0
  14. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/install.sh +0 -0
  15. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/pyproject.toml +0 -0
  16. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/pytest.ini +0 -0
  17. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/sbase/__init__.py +0 -0
  18. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/sbase/__main__.py +0 -0
  19. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/sbase/steps.py +0 -0
  20. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/__init__.py +0 -0
  21. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/__main__.py +0 -0
  22. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/behave/__init__.py +0 -0
  23. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/behave/behave_helper.py +0 -0
  24. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/behave/behave_sb.py +0 -0
  25. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/behave/steps.py +0 -0
  26. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/common/__init__.py +0 -0
  27. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/common/decorators.py +0 -0
  28. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/common/encryption.py +0 -0
  29. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/common/exceptions.py +0 -0
  30. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/common/obfuscate.py +0 -0
  31. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/common/unobfuscate.py +0 -0
  32. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/config/__init__.py +0 -0
  33. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/config/ad_block_list.py +0 -0
  34. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/config/proxy_list.py +0 -0
  35. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/config/settings.py +0 -0
  36. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/__init__.py +0 -0
  37. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/logo_helper.py +0 -0
  38. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/rich_helper.py +0 -0
  39. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/run.py +0 -0
  40. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  41. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  42. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_commander.py +0 -0
  43. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_install.py +0 -0
  44. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  45. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  46. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  47. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  48. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  49. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  50. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_print.py +0 -0
  51. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  52. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/__init__.py +0 -0
  53. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/application_manager.py +0 -0
  54. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/capabilities_parser.py +0 -0
  55. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/colored_traceback.py +0 -0
  56. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/create_db_tables.sql +0 -0
  57. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/detect_b_ver.py +0 -0
  58. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/download_helper.py +0 -0
  59. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/encoded_images.py +0 -0
  60. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/jqc_helper.py +0 -0
  61. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/log_helper.py +0 -0
  62. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/mysql.py +0 -0
  63. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/proxy_helper.py +0 -0
  64. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/recorder_helper.py +0 -0
  65. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/report_helper.py +0 -0
  66. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/s3_manager.py +0 -0
  67. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/sb_driver.py +0 -0
  68. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/session_helper.py +0 -0
  69. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/settings_parser.py +0 -0
  70. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/style_sheet.py +0 -0
  71. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/testcase_manager.py +0 -0
  72. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/tour_helper.py +0 -0
  73. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/core/visual_helper.py +0 -0
  74. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/drivers/__init__.py +0 -0
  75. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  76. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  77. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/extensions/__init__.py +0 -0
  78. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/extensions/ad_block.zip +0 -0
  79. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/extensions/disable_csp.zip +0 -0
  80. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/extensions/recorder.zip +0 -0
  81. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/extensions/sbase_ext.zip +0 -0
  82. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/__init__.py +0 -0
  83. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/base_case.py +0 -0
  84. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/constants.py +0 -0
  85. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  86. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/errors.py +0 -0
  87. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/js_utils.py +0 -0
  88. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/page_actions.py +0 -0
  89. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/page_utils.py +0 -0
  90. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/shared_utils.py +0 -0
  91. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/unittest_helper.py +0 -0
  92. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/words.py +0 -0
  93. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  94. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/js_code/__init__.py +0 -0
  95. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/js_code/active_css_js.py +0 -0
  96. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/js_code/live_js.py +0 -0
  97. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/js_code/recorder_js.py +0 -0
  98. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/masterqa/__init__.py +0 -0
  99. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/masterqa/master_qa.py +0 -0
  100. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/__init__.py +0 -0
  101. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/base_plugin.py +0 -0
  102. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/basic_test_info.py +0 -0
  103. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  104. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/driver_manager.py +0 -0
  105. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/page_source.py +0 -0
  106. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/pytest_plugin.py +0 -0
  107. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  108. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/sb_manager.py +0 -0
  109. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/screen_shots.py +0 -0
  110. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/plugins/selenium_plugin.py +0 -0
  111. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/resources/__init__.py +0 -0
  112. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/__init__.py +0 -0
  113. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/chinese.py +0 -0
  114. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/dutch.py +0 -0
  115. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/french.py +0 -0
  116. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/italian.py +0 -0
  117. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/japanese.py +0 -0
  118. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/korean.py +0 -0
  119. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/master_dict.py +0 -0
  120. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/portuguese.py +0 -0
  121. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/russian.py +0 -0
  122. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/spanish.py +0 -0
  123. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/translate/translator.py +0 -0
  124. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/__init__.py +0 -0
  125. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp.py +0 -0
  126. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  127. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  128. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  129. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  130. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  131. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  132. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  133. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  134. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/dprocess.py +0 -0
  135. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/options.py +0 -0
  136. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/patcher.py +0 -0
  137. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/reactor.py +0 -0
  138. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/undetected/webelement.py +0 -0
  139. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/__init__.py +0 -0
  140. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  141. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  142. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  143. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  144. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  145. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  146. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  147. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  148. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  149. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  150. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  151. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  152. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  153. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase.egg-info/SOURCES.txt +0 -0
  154. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase.egg-info/dependency_links.txt +0 -0
  155. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase.egg-info/entry_points.txt +0 -0
  156. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/seleniumbase.egg-info/top_level.txt +0 -0
  157. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/setup.cfg +0 -0
  158. {seleniumbase-4.41.9 → seleniumbase-4.41.11}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.41.9
3
+ Version: 4.41.11
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
@@ -81,13 +81,13 @@ Requires-Dist: platformdirs>=4.4.0; python_version >= "3.9"
81
81
  Requires-Dist: typing-extensions>=4.13.2
82
82
  Requires-Dist: sbvirtualdisplay>=1.4.0
83
83
  Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
84
- Requires-Dist: MarkupSafe>=3.0.2; python_version >= "3.9"
84
+ Requires-Dist: MarkupSafe>=3.0.3; python_version >= "3.9"
85
85
  Requires-Dist: Jinja2>=3.1.6
86
86
  Requires-Dist: six>=1.17.0
87
87
  Requires-Dist: parse>=1.20.2
88
88
  Requires-Dist: parse-type>=0.6.6
89
89
  Requires-Dist: colorama>=0.4.6
90
- Requires-Dist: pyyaml>=6.0.2
90
+ Requires-Dist: pyyaml>=6.0.3
91
91
  Requires-Dist: pygments>=2.19.2
92
92
  Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
93
93
  Requires-Dist: tabcompleter>=1.4.0
@@ -130,7 +130,7 @@ Requires-Dist: parameterized==0.9.0
130
130
  Requires-Dist: behave==1.2.6
131
131
  Requires-Dist: soupsieve==2.7; python_version < "3.9"
132
132
  Requires-Dist: soupsieve~=2.8; python_version >= "3.9"
133
- Requires-Dist: beautifulsoup4~=4.13.5
133
+ Requires-Dist: beautifulsoup4~=4.14.2
134
134
  Requires-Dist: pyotp==2.9.0
135
135
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
136
136
  Requires-Dist: markdown-it-py==3.0.0; python_version < "3.10"
@@ -164,7 +164,7 @@ Provides-Extra: pdfminer
164
164
  Requires-Dist: pdfminer.six==20250324; python_version < "3.9" and extra == "pdfminer"
165
165
  Requires-Dist: pdfminer.six==20250506; python_version >= "3.9" and extra == "pdfminer"
166
166
  Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
167
- Requires-Dist: cryptography==46.0.1; python_version >= "3.9" and extra == "pdfminer"
167
+ Requires-Dist: cryptography==46.0.2; python_version >= "3.9" and extra == "pdfminer"
168
168
  Requires-Dist: cffi==1.17.1; python_version < "3.9" and extra == "pdfminer"
169
169
  Requires-Dist: cffi==2.0.0; python_version >= "3.9" and extra == "pdfminer"
170
170
  Requires-Dist: pycparser==2.22; python_version < "3.9" and extra == "pdfminer"
@@ -309,6 +309,7 @@ with SB(uc=True, test=True, locale="en") as sb:
309
309
  sb.activate_cdp_mode(url)
310
310
  sb.sleep(2.2)
311
311
  sb.uc_gui_click_captcha()
312
+ # (The rest is for testing and demo purposes)
312
313
  sb.assert_text("Username", '[for="user_login"]', timeout=3)
313
314
  sb.assert_element('label[for="user_login"]')
314
315
  sb.highlight('button:contains("Sign in")')
@@ -99,6 +99,7 @@ with SB(uc=True, test=True, locale="en") as sb:
99
99
  sb.activate_cdp_mode(url)
100
100
  sb.sleep(2.2)
101
101
  sb.uc_gui_click_captcha()
102
+ # (The rest is for testing and demo purposes)
102
103
  sb.assert_text("Username", '[for="user_login"]', timeout=3)
103
104
  sb.assert_element('label[for="user_login"]')
104
105
  sb.highlight('button:contains("Sign in")')
@@ -19,13 +19,13 @@ platformdirs>=4.4.0;python_version>="3.9"
19
19
  typing-extensions>=4.13.2
20
20
  sbvirtualdisplay>=1.4.0
21
21
  MarkupSafe==2.1.5;python_version<"3.9"
22
- MarkupSafe>=3.0.2;python_version>="3.9"
22
+ MarkupSafe>=3.0.3;python_version>="3.9"
23
23
  Jinja2>=3.1.6
24
24
  six>=1.17.0
25
25
  parse>=1.20.2
26
26
  parse-type>=0.6.6
27
27
  colorama>=0.4.6
28
- pyyaml>=6.0.2
28
+ pyyaml>=6.0.3
29
29
  pygments>=2.19.2
30
30
  pyreadline3>=3.5.3;platform_system=="Windows"
31
31
  tabcompleter>=1.4.0
@@ -68,7 +68,7 @@ parameterized==0.9.0
68
68
  behave==1.2.6
69
69
  soupsieve==2.7;python_version<"3.9"
70
70
  soupsieve~=2.8;python_version>="3.9"
71
- beautifulsoup4~=4.13.5
71
+ beautifulsoup4~=4.14.2
72
72
  pyotp==2.9.0
73
73
  python-xlib==0.33;platform_system=="Linux"
74
74
  markdown-it-py==3.0.0;python_version<"3.10"
@@ -0,0 +1,2 @@
1
+ # seleniumbase package
2
+ __version__ = "4.41.11"
@@ -835,6 +835,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
835
835
  cdp.wait_for_text = CDPM.wait_for_text
836
836
  cdp.wait_for_text_not_visible = CDPM.wait_for_text_not_visible
837
837
  cdp.wait_for_element_visible = CDPM.wait_for_element_visible
838
+ cdp.wait_for_element = CDPM.wait_for_element
838
839
  cdp.wait_for_element_not_visible = CDPM.wait_for_element_not_visible
839
840
  cdp.wait_for_element_absent = CDPM.wait_for_element_absent
840
841
  cdp.wait_for_any_of_elements_visible = (
@@ -1249,6 +1250,8 @@ def _uc_gui_click_captcha(
1249
1250
  ctype=None,
1250
1251
  ):
1251
1252
  cdp_mode_on_at_start = __is_cdp_swap_needed(driver)
1253
+ if cdp_mode_on_at_start and (not ctype or ctype == "cf_t"):
1254
+ return driver.cdp.gui_click_captcha()
1252
1255
  _on_a_captcha_page = None
1253
1256
  if ctype == "cf_t":
1254
1257
  if not _on_a_cf_turnstile_page(driver):
@@ -1363,14 +1366,16 @@ def _uc_gui_click_captcha(
1363
1366
  frame = '[style="display: grid;"] div div'
1364
1367
  elif (
1365
1368
  driver.is_element_present('[name*="cf-turnstile-"]')
1366
- and driver.is_element_present("[class*=spacer] + div div")
1369
+ and driver.is_element_present(
1370
+ ".spacer + div div:not([class])"
1371
+ )
1367
1372
  ):
1368
- frame = '[class*=spacer] + div div'
1373
+ frame = '.spacer + div div:not([class])'
1369
1374
  elif (
1370
1375
  driver.is_element_present('[name*="cf-turnstile-"]')
1371
- and driver.is_element_present("div.spacer div")
1376
+ and driver.is_element_present(".spacer div:not([class])")
1372
1377
  ):
1373
- frame = "div.spacer div"
1378
+ frame = ".spacer div:not([class])"
1374
1379
  elif (
1375
1380
  driver.is_element_present('script[src*="challenges.c"]')
1376
1381
  and driver.is_element_present(
@@ -1382,6 +1387,10 @@ def _uc_gui_click_captcha(
1382
1387
  "div#turnstile-widget div:not([class])"
1383
1388
  ):
1384
1389
  frame = "div#turnstile-widget div:not([class])"
1390
+ elif driver.is_element_present(
1391
+ "ngx-turnstile div:not([class])"
1392
+ ):
1393
+ frame = "ngx-turnstile div:not([class])"
1385
1394
  elif driver.is_element_present(
1386
1395
  'form div:not([class]):has(input[name*="cf-turn"])'
1387
1396
  ):
@@ -1402,6 +1411,14 @@ def _uc_gui_click_captcha(
1402
1411
  frame = ".cf-turnstile-wrapper"
1403
1412
  elif driver.is_element_present('[class="cf-turnstile"]'):
1404
1413
  frame = '[class="cf-turnstile"]'
1414
+ elif driver.is_element_present(
1415
+ '[id*="turnstile"] div:not([class])'
1416
+ ):
1417
+ frame = '[id*="turnstile"] div:not([class])'
1418
+ elif driver.is_element_present(
1419
+ '[class*="turnstile"] div:not([class])'
1420
+ ):
1421
+ frame = '[class*="turnstile"] div:not([class])'
1405
1422
  elif driver.is_element_present(
1406
1423
  '[data-callback="onCaptchaSuccess"]'
1407
1424
  ):
@@ -1453,9 +1470,11 @@ def _uc_gui_click_captcha(
1453
1470
  else:
1454
1471
  driver.execute_script(script)
1455
1472
  elif (
1456
- driver.is_element_present("form")
1457
- and driver.is_element_present(
1458
- 'form [id*="turnstile"] > div:not([class])'
1473
+ driver.is_element_present(
1474
+ 'form [id*="turnstile"] div:not([class])'
1475
+ )
1476
+ or driver.is_element_present(
1477
+ 'form [class*="turnstile"] div:not([class])'
1459
1478
  )
1460
1479
  ):
1461
1480
  script = (
@@ -1463,12 +1482,35 @@ def _uc_gui_click_captcha(
1463
1482
  'form [id*="turnstile"]');
1464
1483
  var index = 0, length = $elements.length;
1465
1484
  for(; index < length; index++){
1485
+ $elements[index].setAttribute('align', 'left');}
1486
+ var $elements = document.querySelectorAll(
1487
+ 'form [class*="turnstile"]');
1488
+ var index = 0, length = $elements.length;
1489
+ for(; index < length; index++){
1466
1490
  $elements[index].setAttribute('align', 'left');}"""
1467
1491
  )
1468
1492
  if __is_cdp_swap_needed(driver):
1469
1493
  driver.cdp.evaluate(script)
1470
1494
  else:
1471
1495
  driver.execute_script(script)
1496
+ elif (
1497
+ driver.is_element_present(
1498
+ '[style*="text-align: center;"] div:not([class])'
1499
+ )
1500
+ ):
1501
+ script = (
1502
+ """var $elements = document.querySelectorAll(
1503
+ '[style*="text-align: center;"]');
1504
+ var index = 0, length = $elements.length;
1505
+ for(; index < length; index++){
1506
+ the_style = $elements[index].getAttribute('style');
1507
+ new_style = the_style.replaceAll('center', 'left');
1508
+ $elements[index].setAttribute('style', new_style);}"""
1509
+ )
1510
+ if __is_cdp_swap_needed(driver):
1511
+ driver.cdp.evaluate(script)
1512
+ else:
1513
+ driver.execute_script(script)
1472
1514
  if not is_in_frame or needs_switch:
1473
1515
  # Currently not in frame (or nested frame outside CF one)
1474
1516
  try:
@@ -1688,9 +1730,9 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
1688
1730
  frame = '[data-callback="onCaptchaSuccess"]'
1689
1731
  elif (
1690
1732
  driver.is_element_present('[name*="cf-turnstile-"]')
1691
- and driver.is_element_present("div.spacer div")
1733
+ and driver.is_element_present(".spacer div:not([class])")
1692
1734
  ):
1693
- frame = "div.spacer div"
1735
+ frame = ".spacer div:not([class])"
1694
1736
  elif (
1695
1737
  driver.is_element_present('script[src*="challenges.c"]')
1696
1738
  and driver.is_element_present(
@@ -301,28 +301,7 @@ class CDPMethods():
301
301
  self.__add_light_pause()
302
302
  selector = self.__convert_to_css_if_xpath(selector)
303
303
  if (":contains(" in selector):
304
- tag_name = selector.split(":contains(")[0].split(" ")[-1]
305
- text = selector.split(":contains(")[1].split(")")[0][1:-1]
306
- with suppress(Exception):
307
- new_timeout = timeout
308
- if new_timeout < 1:
309
- new_timeout = 1
310
- self.loop.run_until_complete(
311
- self.page.select(tag_name, timeout=new_timeout)
312
- )
313
- self.loop.run_until_complete(
314
- self.page.find(text, timeout=new_timeout)
315
- )
316
- elements = self.find_elements_by_text(text, tag_name=tag_name)
317
- if not elements:
318
- plural = "s"
319
- if timeout == 1:
320
- plural = ""
321
- msg = "\n Element {%s} was not found after %s second%s!"
322
- message = msg % (selector, timeout, plural)
323
- raise Exception(message)
324
- element = self.__add_sync_methods(elements[0])
325
- return element
304
+ return self.find_element(selector, timeout=timeout)
326
305
  failure = False
327
306
  try:
328
307
  element = self.loop.run_until_complete(
@@ -1708,9 +1687,9 @@ class CDPMethods():
1708
1687
  selector = '[class*=spacer] + div div'
1709
1688
  elif (
1710
1689
  self.is_element_present('[name*="cf-turnstile-"]')
1711
- and self.is_element_present("div.spacer div")
1690
+ and self.is_element_present(".spacer div:not([class])")
1712
1691
  ):
1713
- selector = "div.spacer div"
1692
+ selector = ".spacer div:not([class])"
1714
1693
  elif (
1715
1694
  self.is_element_present('script[src*="challenges.c"]')
1716
1695
  and self.is_element_present(
@@ -1722,6 +1701,8 @@ class CDPMethods():
1722
1701
  "div#turnstile-widget div:not([class])"
1723
1702
  ):
1724
1703
  selector = "div#turnstile-widget div:not([class])"
1704
+ elif self.is_element_present("ngx-turnstile div:not([class])"):
1705
+ selector = "ngx-turnstile div:not([class])"
1725
1706
  elif self.is_element_present(
1726
1707
  'form div:not([class]):has(input[name*="cf-turn"])'
1727
1708
  ):
@@ -1742,6 +1723,14 @@ class CDPMethods():
1742
1723
  selector = ".cf-turnstile-wrapper"
1743
1724
  elif self.is_element_present('[class="cf-turnstile"]'):
1744
1725
  selector = '[class="cf-turnstile"]'
1726
+ elif self.is_element_present(
1727
+ '[id*="turnstile"] div:not([class])'
1728
+ ):
1729
+ selector = '[id*="turnstile"] div:not([class])'
1730
+ elif self.is_element_present(
1731
+ '[class*="turnstile"] div:not([class])'
1732
+ ):
1733
+ selector = '[class*="turnstile"] div:not([class])'
1745
1734
  elif self.is_element_present(
1746
1735
  '[data-callback="onCaptchaSuccess"]'
1747
1736
  ):
@@ -1793,9 +1782,11 @@ class CDPMethods():
1793
1782
  self.loop.run_until_complete(self.page.evaluate(script))
1794
1783
  self.loop.run_until_complete(self.page.wait())
1795
1784
  elif (
1796
- self.is_element_present("form")
1797
- and self.is_element_present(
1798
- 'form [id*="turnstile"] > div:not([class])'
1785
+ self.is_element_present(
1786
+ 'form [id*="turnstile"] div:not([class])'
1787
+ )
1788
+ or self.is_element_present(
1789
+ 'form [class*="turnstile"] div:not([class])'
1799
1790
  )
1800
1791
  ):
1801
1792
  script = (
@@ -1803,11 +1794,33 @@ class CDPMethods():
1803
1794
  'form [id*="turnstile"]');
1804
1795
  var index = 0, length = $elements.length;
1805
1796
  for(; index < length; index++){
1797
+ $elements[index].setAttribute('align', 'left');}
1798
+ var $elements = document.querySelectorAll(
1799
+ 'form [class*="turnstile"]');
1800
+ var index = 0, length = $elements.length;
1801
+ for(; index < length; index++){
1806
1802
  $elements[index].setAttribute('align', 'left');}"""
1807
1803
  )
1808
1804
  with suppress(Exception):
1809
1805
  self.loop.run_until_complete(self.page.evaluate(script))
1810
1806
  self.loop.run_until_complete(self.page.wait())
1807
+ elif (
1808
+ self.is_element_present(
1809
+ '[style*="text-align: center;"] div:not([class])'
1810
+ )
1811
+ ):
1812
+ script = (
1813
+ """var $elements = document.querySelectorAll(
1814
+ '[style*="text-align: center;"]');
1815
+ var index = 0, length = $elements.length;
1816
+ for(; index < length; index++){
1817
+ the_style = $elements[index].getAttribute('style');
1818
+ new_style = the_style.replaceAll('center', 'left');
1819
+ $elements[index].setAttribute('style', new_style);}"""
1820
+ )
1821
+ with suppress(Exception):
1822
+ self.loop.run_until_complete(self.page.evaluate(script))
1823
+ self.loop.run_until_complete(self.page.wait())
1811
1824
  with suppress(Exception):
1812
1825
  time.sleep(0.08)
1813
1826
  element_rect = self.get_gui_element_rect(selector, timeout=1)
@@ -2163,6 +2176,10 @@ class CDPMethods():
2163
2176
  time.sleep(0.1)
2164
2177
  raise Exception("Element {%s} was not visible!" % selector)
2165
2178
 
2179
+ def wait_for_element(self, selector, **kwargs):
2180
+ """Same as wait_for_element_visible()"""
2181
+ return self.wait_for_element_visible(selector, **kwargs)
2182
+
2166
2183
  def wait_for_element_not_visible(self, selector, timeout=None):
2167
2184
  """Wait for element to not be visible on page. (May still be in DOM)"""
2168
2185
  if not timeout:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.41.9
3
+ Version: 4.41.11
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
@@ -81,13 +81,13 @@ Requires-Dist: platformdirs>=4.4.0; python_version >= "3.9"
81
81
  Requires-Dist: typing-extensions>=4.13.2
82
82
  Requires-Dist: sbvirtualdisplay>=1.4.0
83
83
  Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
84
- Requires-Dist: MarkupSafe>=3.0.2; python_version >= "3.9"
84
+ Requires-Dist: MarkupSafe>=3.0.3; python_version >= "3.9"
85
85
  Requires-Dist: Jinja2>=3.1.6
86
86
  Requires-Dist: six>=1.17.0
87
87
  Requires-Dist: parse>=1.20.2
88
88
  Requires-Dist: parse-type>=0.6.6
89
89
  Requires-Dist: colorama>=0.4.6
90
- Requires-Dist: pyyaml>=6.0.2
90
+ Requires-Dist: pyyaml>=6.0.3
91
91
  Requires-Dist: pygments>=2.19.2
92
92
  Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
93
93
  Requires-Dist: tabcompleter>=1.4.0
@@ -130,7 +130,7 @@ Requires-Dist: parameterized==0.9.0
130
130
  Requires-Dist: behave==1.2.6
131
131
  Requires-Dist: soupsieve==2.7; python_version < "3.9"
132
132
  Requires-Dist: soupsieve~=2.8; python_version >= "3.9"
133
- Requires-Dist: beautifulsoup4~=4.13.5
133
+ Requires-Dist: beautifulsoup4~=4.14.2
134
134
  Requires-Dist: pyotp==2.9.0
135
135
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
136
136
  Requires-Dist: markdown-it-py==3.0.0; python_version < "3.10"
@@ -164,7 +164,7 @@ Provides-Extra: pdfminer
164
164
  Requires-Dist: pdfminer.six==20250324; python_version < "3.9" and extra == "pdfminer"
165
165
  Requires-Dist: pdfminer.six==20250506; python_version >= "3.9" and extra == "pdfminer"
166
166
  Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
167
- Requires-Dist: cryptography==46.0.1; python_version >= "3.9" and extra == "pdfminer"
167
+ Requires-Dist: cryptography==46.0.2; python_version >= "3.9" and extra == "pdfminer"
168
168
  Requires-Dist: cffi==1.17.1; python_version < "3.9" and extra == "pdfminer"
169
169
  Requires-Dist: cffi==2.0.0; python_version >= "3.9" and extra == "pdfminer"
170
170
  Requires-Dist: pycparser==2.22; python_version < "3.9" and extra == "pdfminer"
@@ -309,6 +309,7 @@ with SB(uc=True, test=True, locale="en") as sb:
309
309
  sb.activate_cdp_mode(url)
310
310
  sb.sleep(2.2)
311
311
  sb.uc_gui_click_captcha()
312
+ # (The rest is for testing and demo purposes)
312
313
  sb.assert_text("Username", '[for="user_login"]', timeout=3)
313
314
  sb.assert_element('label[for="user_login"]')
314
315
  sb.highlight('button:contains("Sign in")')
@@ -13,7 +13,7 @@ six>=1.17.0
13
13
  parse>=1.20.2
14
14
  parse-type>=0.6.6
15
15
  colorama>=0.4.6
16
- pyyaml>=6.0.2
16
+ pyyaml>=6.0.3
17
17
  pygments>=2.19.2
18
18
  tabcompleter>=1.4.0
19
19
  pdbp>=1.7.1
@@ -34,7 +34,7 @@ pytest-metadata==3.1.1
34
34
  pytest-ordering==0.6
35
35
  parameterized==0.9.0
36
36
  behave==1.2.6
37
- beautifulsoup4~=4.13.5
37
+ beautifulsoup4~=4.14.2
38
38
  pyotp==2.9.0
39
39
  mdurl==0.1.2
40
40
  rich<15,>=14.1.0
@@ -77,7 +77,7 @@ pip>=25.2
77
77
  websockets>=15.0.1
78
78
  filelock>=3.19.1
79
79
  platformdirs>=4.4.0
80
- MarkupSafe>=3.0.2
80
+ MarkupSafe>=3.0.3
81
81
  requests~=2.32.5
82
82
  trio~=0.30.0
83
83
  cssselect==1.3.0
@@ -140,7 +140,7 @@ pycparser==2.22
140
140
 
141
141
  [pdfminer:python_version >= "3.9"]
142
142
  pdfminer.six==20250506
143
- cryptography==46.0.1
143
+ cryptography==46.0.2
144
144
  cffi==2.0.0
145
145
  pycparser==2.23
146
146
 
@@ -167,13 +167,13 @@ setup(
167
167
  'typing-extensions>=4.13.2',
168
168
  "sbvirtualdisplay>=1.4.0",
169
169
  'MarkupSafe==2.1.5;python_version<"3.9"',
170
- 'MarkupSafe>=3.0.2;python_version>="3.9"',
170
+ 'MarkupSafe>=3.0.3;python_version>="3.9"',
171
171
  "Jinja2>=3.1.6",
172
172
  "six>=1.17.0",
173
173
  'parse>=1.20.2',
174
174
  'parse-type>=0.6.6',
175
175
  'colorama>=0.4.6',
176
- 'pyyaml>=6.0.2',
176
+ 'pyyaml>=6.0.3',
177
177
  'pygments>=2.19.2',
178
178
  'pyreadline3>=3.5.3;platform_system=="Windows"',
179
179
  "tabcompleter>=1.4.0",
@@ -216,7 +216,7 @@ setup(
216
216
  "behave==1.2.6", # Newer ones had issues
217
217
  'soupsieve==2.7;python_version<"3.9"',
218
218
  'soupsieve~=2.8;python_version>="3.9"',
219
- "beautifulsoup4~=4.13.5",
219
+ "beautifulsoup4~=4.14.2",
220
220
  'pyotp==2.9.0',
221
221
  'python-xlib==0.33;platform_system=="Linux"',
222
222
  'markdown-it-py==3.0.0;python_version<"3.10"',
@@ -270,7 +270,7 @@ setup(
270
270
  'pdfminer.six==20250324;python_version<"3.9"',
271
271
  'pdfminer.six==20250506;python_version>="3.9"',
272
272
  'cryptography==39.0.2;python_version<"3.9"',
273
- 'cryptography==46.0.1;python_version>="3.9"',
273
+ 'cryptography==46.0.2;python_version>="3.9"',
274
274
  'cffi==1.17.1;python_version<"3.9"',
275
275
  'cffi==2.0.0;python_version>="3.9"',
276
276
  'pycparser==2.22;python_version<"3.9"',
@@ -1,2 +0,0 @@
1
- # seleniumbase package
2
- __version__ = "4.41.9"
File without changes
File without changes
File without changes
File without changes
File without changes