seleniumbase 4.41.10__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.10/seleniumbase.egg-info → seleniumbase-4.41.11}/PKG-INFO +5 -4
  2. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/README.md +1 -0
  3. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/requirements.txt +2 -2
  4. seleniumbase-4.41.11/seleniumbase/__version__.py +2 -0
  5. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/browser_launcher.py +49 -9
  6. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/sb_cdp.py +44 -27
  7. {seleniumbase-4.41.10 → seleniumbase-4.41.11/seleniumbase.egg-info}/PKG-INFO +5 -4
  8. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase.egg-info/requires.txt +3 -3
  9. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/setup.py +3 -3
  10. seleniumbase-4.41.10/seleniumbase/__version__.py +0 -2
  11. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/.gitignore +0 -0
  12. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/LICENSE +0 -0
  13. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/MANIFEST.in +0 -0
  14. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/install.sh +0 -0
  15. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/pyproject.toml +0 -0
  16. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/pytest.ini +0 -0
  17. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/sbase/__init__.py +0 -0
  18. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/sbase/__main__.py +0 -0
  19. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/sbase/steps.py +0 -0
  20. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/__init__.py +0 -0
  21. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/__main__.py +0 -0
  22. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/behave/__init__.py +0 -0
  23. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/behave/behave_helper.py +0 -0
  24. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/behave/behave_sb.py +0 -0
  25. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/behave/steps.py +0 -0
  26. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/common/__init__.py +0 -0
  27. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/common/decorators.py +0 -0
  28. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/common/encryption.py +0 -0
  29. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/common/exceptions.py +0 -0
  30. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/common/obfuscate.py +0 -0
  31. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/common/unobfuscate.py +0 -0
  32. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/config/__init__.py +0 -0
  33. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/config/ad_block_list.py +0 -0
  34. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/config/proxy_list.py +0 -0
  35. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/config/settings.py +0 -0
  36. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/__init__.py +0 -0
  37. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/logo_helper.py +0 -0
  38. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/rich_helper.py +0 -0
  39. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/run.py +0 -0
  40. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  41. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  42. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_commander.py +0 -0
  43. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_install.py +0 -0
  44. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  45. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  46. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  47. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  48. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  49. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  50. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_print.py +0 -0
  51. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  52. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/__init__.py +0 -0
  53. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/application_manager.py +0 -0
  54. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/capabilities_parser.py +0 -0
  55. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/colored_traceback.py +0 -0
  56. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/create_db_tables.sql +0 -0
  57. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/detect_b_ver.py +0 -0
  58. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/download_helper.py +0 -0
  59. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/encoded_images.py +0 -0
  60. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/jqc_helper.py +0 -0
  61. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/log_helper.py +0 -0
  62. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/mysql.py +0 -0
  63. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/proxy_helper.py +0 -0
  64. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/recorder_helper.py +0 -0
  65. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/report_helper.py +0 -0
  66. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/s3_manager.py +0 -0
  67. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/sb_driver.py +0 -0
  68. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/session_helper.py +0 -0
  69. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/settings_parser.py +0 -0
  70. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/style_sheet.py +0 -0
  71. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/testcase_manager.py +0 -0
  72. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/tour_helper.py +0 -0
  73. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/core/visual_helper.py +0 -0
  74. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/drivers/__init__.py +0 -0
  75. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  76. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  77. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/extensions/__init__.py +0 -0
  78. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/extensions/ad_block.zip +0 -0
  79. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/extensions/disable_csp.zip +0 -0
  80. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/extensions/recorder.zip +0 -0
  81. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/extensions/sbase_ext.zip +0 -0
  82. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/__init__.py +0 -0
  83. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/base_case.py +0 -0
  84. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/constants.py +0 -0
  85. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  86. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/errors.py +0 -0
  87. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/js_utils.py +0 -0
  88. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/page_actions.py +0 -0
  89. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/page_utils.py +0 -0
  90. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/shared_utils.py +0 -0
  91. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/unittest_helper.py +0 -0
  92. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/words.py +0 -0
  93. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  94. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/js_code/__init__.py +0 -0
  95. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/js_code/active_css_js.py +0 -0
  96. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/js_code/live_js.py +0 -0
  97. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/js_code/recorder_js.py +0 -0
  98. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/masterqa/__init__.py +0 -0
  99. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/masterqa/master_qa.py +0 -0
  100. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/__init__.py +0 -0
  101. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/base_plugin.py +0 -0
  102. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/basic_test_info.py +0 -0
  103. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  104. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/driver_manager.py +0 -0
  105. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/page_source.py +0 -0
  106. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/pytest_plugin.py +0 -0
  107. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  108. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/sb_manager.py +0 -0
  109. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/screen_shots.py +0 -0
  110. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/plugins/selenium_plugin.py +0 -0
  111. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/resources/__init__.py +0 -0
  112. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/__init__.py +0 -0
  113. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/chinese.py +0 -0
  114. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/dutch.py +0 -0
  115. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/french.py +0 -0
  116. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/italian.py +0 -0
  117. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/japanese.py +0 -0
  118. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/korean.py +0 -0
  119. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/master_dict.py +0 -0
  120. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/portuguese.py +0 -0
  121. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/russian.py +0 -0
  122. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/spanish.py +0 -0
  123. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/translate/translator.py +0 -0
  124. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/__init__.py +0 -0
  125. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp.py +0 -0
  126. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  127. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  128. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  129. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  130. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  131. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  132. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  133. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  134. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/dprocess.py +0 -0
  135. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/options.py +0 -0
  136. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/patcher.py +0 -0
  137. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/reactor.py +0 -0
  138. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/undetected/webelement.py +0 -0
  139. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/__init__.py +0 -0
  140. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  141. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  142. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  143. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  144. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  145. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  146. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  147. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  148. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  149. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  150. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  151. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  152. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  153. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase.egg-info/SOURCES.txt +0 -0
  154. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase.egg-info/dependency_links.txt +0 -0
  155. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase.egg-info/entry_points.txt +0 -0
  156. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/seleniumbase.egg-info/top_level.txt +0 -0
  157. {seleniumbase-4.41.10 → seleniumbase-4.41.11}/setup.cfg +0 -0
  158. {seleniumbase-4.41.10 → 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.10
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,7 +81,7 @@ 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
@@ -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,7 +19,7 @@ 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
@@ -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 = (
@@ -1365,14 +1366,16 @@ def _uc_gui_click_captcha(
1365
1366
  frame = '[style="display: grid;"] div div'
1366
1367
  elif (
1367
1368
  driver.is_element_present('[name*="cf-turnstile-"]')
1368
- and driver.is_element_present("[class*=spacer] + div div")
1369
+ and driver.is_element_present(
1370
+ ".spacer + div div:not([class])"
1371
+ )
1369
1372
  ):
1370
- frame = '[class*=spacer] + div div'
1373
+ frame = '.spacer + div div:not([class])'
1371
1374
  elif (
1372
1375
  driver.is_element_present('[name*="cf-turnstile-"]')
1373
- and driver.is_element_present("div.spacer div")
1376
+ and driver.is_element_present(".spacer div:not([class])")
1374
1377
  ):
1375
- frame = "div.spacer div"
1378
+ frame = ".spacer div:not([class])"
1376
1379
  elif (
1377
1380
  driver.is_element_present('script[src*="challenges.c"]')
1378
1381
  and driver.is_element_present(
@@ -1384,6 +1387,10 @@ def _uc_gui_click_captcha(
1384
1387
  "div#turnstile-widget div:not([class])"
1385
1388
  ):
1386
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])"
1387
1394
  elif driver.is_element_present(
1388
1395
  'form div:not([class]):has(input[name*="cf-turn"])'
1389
1396
  ):
@@ -1404,6 +1411,14 @@ def _uc_gui_click_captcha(
1404
1411
  frame = ".cf-turnstile-wrapper"
1405
1412
  elif driver.is_element_present('[class="cf-turnstile"]'):
1406
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])'
1407
1422
  elif driver.is_element_present(
1408
1423
  '[data-callback="onCaptchaSuccess"]'
1409
1424
  ):
@@ -1455,9 +1470,11 @@ def _uc_gui_click_captcha(
1455
1470
  else:
1456
1471
  driver.execute_script(script)
1457
1472
  elif (
1458
- driver.is_element_present("form")
1459
- and driver.is_element_present(
1460
- '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])'
1461
1478
  )
1462
1479
  ):
1463
1480
  script = (
@@ -1465,12 +1482,35 @@ def _uc_gui_click_captcha(
1465
1482
  'form [id*="turnstile"]');
1466
1483
  var index = 0, length = $elements.length;
1467
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++){
1468
1490
  $elements[index].setAttribute('align', 'left');}"""
1469
1491
  )
1470
1492
  if __is_cdp_swap_needed(driver):
1471
1493
  driver.cdp.evaluate(script)
1472
1494
  else:
1473
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)
1474
1514
  if not is_in_frame or needs_switch:
1475
1515
  # Currently not in frame (or nested frame outside CF one)
1476
1516
  try:
@@ -1690,9 +1730,9 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
1690
1730
  frame = '[data-callback="onCaptchaSuccess"]'
1691
1731
  elif (
1692
1732
  driver.is_element_present('[name*="cf-turnstile-"]')
1693
- and driver.is_element_present("div.spacer div")
1733
+ and driver.is_element_present(".spacer div:not([class])")
1694
1734
  ):
1695
- frame = "div.spacer div"
1735
+ frame = ".spacer div:not([class])"
1696
1736
  elif (
1697
1737
  driver.is_element_present('script[src*="challenges.c"]')
1698
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.10
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,7 +81,7 @@ 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
@@ -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")')
@@ -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,7 +167,7 @@ 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',
@@ -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.10"
File without changes
File without changes