seleniumbase 4.41.10__tar.gz → 4.41.12__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.12}/PKG-INFO +5 -4
  2. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/README.md +1 -0
  3. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/requirements.txt +2 -2
  4. seleniumbase-4.41.12/seleniumbase/__version__.py +2 -0
  5. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/browser_launcher.py +51 -9
  6. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/sb_cdp.py +44 -27
  7. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/sb_driver.py +10 -0
  8. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/page_actions.py +16 -0
  9. {seleniumbase-4.41.10 → seleniumbase-4.41.12/seleniumbase.egg-info}/PKG-INFO +5 -4
  10. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase.egg-info/requires.txt +3 -3
  11. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/setup.py +3 -3
  12. seleniumbase-4.41.10/seleniumbase/__version__.py +0 -2
  13. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/.gitignore +0 -0
  14. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/LICENSE +0 -0
  15. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/MANIFEST.in +0 -0
  16. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/install.sh +0 -0
  17. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/pyproject.toml +0 -0
  18. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/pytest.ini +0 -0
  19. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/sbase/steps.py +0 -0
  22. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/capabilities_parser.py +0 -0
  57. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/colored_traceback.py +0 -0
  58. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/create_db_tables.sql +0 -0
  59. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/detect_b_ver.py +0 -0
  60. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/download_helper.py +0 -0
  61. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/encoded_images.py +0 -0
  62. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/jqc_helper.py +0 -0
  63. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/log_helper.py +0 -0
  64. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/mysql.py +0 -0
  65. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/proxy_helper.py +0 -0
  66. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/recorder_helper.py +0 -0
  67. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/report_helper.py +0 -0
  68. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/s3_manager.py +0 -0
  69. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/session_helper.py +0 -0
  70. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/settings_parser.py +0 -0
  71. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/style_sheet.py +0 -0
  72. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/testcase_manager.py +0 -0
  73. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/tour_helper.py +0 -0
  74. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/core/visual_helper.py +0 -0
  75. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/drivers/__init__.py +0 -0
  76. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  77. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  78. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/extensions/__init__.py +0 -0
  79. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/extensions/ad_block.zip +0 -0
  80. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/extensions/disable_csp.zip +0 -0
  81. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/extensions/recorder.zip +0 -0
  82. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/extensions/sbase_ext.zip +0 -0
  83. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/__init__.py +0 -0
  84. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/base_case.py +0 -0
  85. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/constants.py +0 -0
  86. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  87. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/errors.py +0 -0
  88. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/js_utils.py +0 -0
  89. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/page_utils.py +0 -0
  90. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/shared_utils.py +0 -0
  91. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/unittest_helper.py +0 -0
  92. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/words.py +0 -0
  93. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  94. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/js_code/__init__.py +0 -0
  95. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/js_code/active_css_js.py +0 -0
  96. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/js_code/live_js.py +0 -0
  97. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/js_code/recorder_js.py +0 -0
  98. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/masterqa/__init__.py +0 -0
  99. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/masterqa/master_qa.py +0 -0
  100. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/__init__.py +0 -0
  101. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/base_plugin.py +0 -0
  102. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/basic_test_info.py +0 -0
  103. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  104. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/driver_manager.py +0 -0
  105. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/page_source.py +0 -0
  106. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/pytest_plugin.py +0 -0
  107. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  108. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/sb_manager.py +0 -0
  109. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/screen_shots.py +0 -0
  110. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/plugins/selenium_plugin.py +0 -0
  111. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/resources/__init__.py +0 -0
  112. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/__init__.py +0 -0
  113. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/chinese.py +0 -0
  114. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/dutch.py +0 -0
  115. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/french.py +0 -0
  116. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/italian.py +0 -0
  117. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/japanese.py +0 -0
  118. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/korean.py +0 -0
  119. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/master_dict.py +0 -0
  120. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/portuguese.py +0 -0
  121. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/russian.py +0 -0
  122. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/spanish.py +0 -0
  123. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/translate/translator.py +0 -0
  124. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/__init__.py +0 -0
  125. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp.py +0 -0
  126. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  127. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  128. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  129. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  130. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  131. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  132. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  133. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  134. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/dprocess.py +0 -0
  135. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/options.py +0 -0
  136. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/patcher.py +0 -0
  137. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/reactor.py +0 -0
  138. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/undetected/webelement.py +0 -0
  139. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/__init__.py +0 -0
  140. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  141. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  142. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  143. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  144. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  145. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  146. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  147. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  148. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  149. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  150. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  151. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  152. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  153. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase.egg-info/SOURCES.txt +0 -0
  154. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase.egg-info/dependency_links.txt +0 -0
  155. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase.egg-info/entry_points.txt +0 -0
  156. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/seleniumbase.egg-info/top_level.txt +0 -0
  157. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/setup.cfg +0 -0
  158. {seleniumbase-4.41.10 → seleniumbase-4.41.12}/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.12
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.12"
@@ -228,6 +228,8 @@ def extend_driver(
228
228
  driver.wait_for_element = DM.wait_for_element
229
229
  driver.wait_for_element_visible = DM.wait_for_element_visible
230
230
  driver.wait_for_element_present = DM.wait_for_element_present
231
+ driver.wait_for_element_absent = DM.wait_for_element_absent
232
+ driver.wait_for_element_not_visible = DM.wait_for_element_not_visible
231
233
  driver.wait_for_selector = DM.wait_for_selector
232
234
  driver.wait_for_text = DM.wait_for_text
233
235
  driver.wait_for_exact_text = DM.wait_for_exact_text
@@ -835,6 +837,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
835
837
  cdp.wait_for_text = CDPM.wait_for_text
836
838
  cdp.wait_for_text_not_visible = CDPM.wait_for_text_not_visible
837
839
  cdp.wait_for_element_visible = CDPM.wait_for_element_visible
840
+ cdp.wait_for_element = CDPM.wait_for_element
838
841
  cdp.wait_for_element_not_visible = CDPM.wait_for_element_not_visible
839
842
  cdp.wait_for_element_absent = CDPM.wait_for_element_absent
840
843
  cdp.wait_for_any_of_elements_visible = (
@@ -1365,14 +1368,16 @@ def _uc_gui_click_captcha(
1365
1368
  frame = '[style="display: grid;"] div div'
1366
1369
  elif (
1367
1370
  driver.is_element_present('[name*="cf-turnstile-"]')
1368
- and driver.is_element_present("[class*=spacer] + div div")
1371
+ and driver.is_element_present(
1372
+ ".spacer + div div:not([class])"
1373
+ )
1369
1374
  ):
1370
- frame = '[class*=spacer] + div div'
1375
+ frame = '.spacer + div div:not([class])'
1371
1376
  elif (
1372
1377
  driver.is_element_present('[name*="cf-turnstile-"]')
1373
- and driver.is_element_present("div.spacer div")
1378
+ and driver.is_element_present(".spacer div:not([class])")
1374
1379
  ):
1375
- frame = "div.spacer div"
1380
+ frame = ".spacer div:not([class])"
1376
1381
  elif (
1377
1382
  driver.is_element_present('script[src*="challenges.c"]')
1378
1383
  and driver.is_element_present(
@@ -1384,6 +1389,10 @@ def _uc_gui_click_captcha(
1384
1389
  "div#turnstile-widget div:not([class])"
1385
1390
  ):
1386
1391
  frame = "div#turnstile-widget div:not([class])"
1392
+ elif driver.is_element_present(
1393
+ "ngx-turnstile div:not([class])"
1394
+ ):
1395
+ frame = "ngx-turnstile div:not([class])"
1387
1396
  elif driver.is_element_present(
1388
1397
  'form div:not([class]):has(input[name*="cf-turn"])'
1389
1398
  ):
@@ -1404,6 +1413,14 @@ def _uc_gui_click_captcha(
1404
1413
  frame = ".cf-turnstile-wrapper"
1405
1414
  elif driver.is_element_present('[class="cf-turnstile"]'):
1406
1415
  frame = '[class="cf-turnstile"]'
1416
+ elif driver.is_element_present(
1417
+ '[id*="turnstile"] div:not([class])'
1418
+ ):
1419
+ frame = '[id*="turnstile"] div:not([class])'
1420
+ elif driver.is_element_present(
1421
+ '[class*="turnstile"] div:not([class])'
1422
+ ):
1423
+ frame = '[class*="turnstile"] div:not([class])'
1407
1424
  elif driver.is_element_present(
1408
1425
  '[data-callback="onCaptchaSuccess"]'
1409
1426
  ):
@@ -1455,9 +1472,11 @@ def _uc_gui_click_captcha(
1455
1472
  else:
1456
1473
  driver.execute_script(script)
1457
1474
  elif (
1458
- driver.is_element_present("form")
1459
- and driver.is_element_present(
1460
- 'form [id*="turnstile"] > div:not([class])'
1475
+ driver.is_element_present(
1476
+ 'form [id*="turnstile"] div:not([class])'
1477
+ )
1478
+ or driver.is_element_present(
1479
+ 'form [class*="turnstile"] div:not([class])'
1461
1480
  )
1462
1481
  ):
1463
1482
  script = (
@@ -1465,12 +1484,35 @@ def _uc_gui_click_captcha(
1465
1484
  'form [id*="turnstile"]');
1466
1485
  var index = 0, length = $elements.length;
1467
1486
  for(; index < length; index++){
1487
+ $elements[index].setAttribute('align', 'left');}
1488
+ var $elements = document.querySelectorAll(
1489
+ 'form [class*="turnstile"]');
1490
+ var index = 0, length = $elements.length;
1491
+ for(; index < length; index++){
1468
1492
  $elements[index].setAttribute('align', 'left');}"""
1469
1493
  )
1470
1494
  if __is_cdp_swap_needed(driver):
1471
1495
  driver.cdp.evaluate(script)
1472
1496
  else:
1473
1497
  driver.execute_script(script)
1498
+ elif (
1499
+ driver.is_element_present(
1500
+ '[style*="text-align: center;"] div:not([class])'
1501
+ )
1502
+ ):
1503
+ script = (
1504
+ """var $elements = document.querySelectorAll(
1505
+ '[style*="text-align: center;"]');
1506
+ var index = 0, length = $elements.length;
1507
+ for(; index < length; index++){
1508
+ the_style = $elements[index].getAttribute('style');
1509
+ new_style = the_style.replaceAll('center', 'left');
1510
+ $elements[index].setAttribute('style', new_style);}"""
1511
+ )
1512
+ if __is_cdp_swap_needed(driver):
1513
+ driver.cdp.evaluate(script)
1514
+ else:
1515
+ driver.execute_script(script)
1474
1516
  if not is_in_frame or needs_switch:
1475
1517
  # Currently not in frame (or nested frame outside CF one)
1476
1518
  try:
@@ -1690,9 +1732,9 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
1690
1732
  frame = '[data-callback="onCaptchaSuccess"]'
1691
1733
  elif (
1692
1734
  driver.is_element_present('[name*="cf-turnstile-"]')
1693
- and driver.is_element_present("div.spacer div")
1735
+ and driver.is_element_present(".spacer div:not([class])")
1694
1736
  ):
1695
- frame = "div.spacer div"
1737
+ frame = ".spacer div:not([class])"
1696
1738
  elif (
1697
1739
  driver.is_element_present('script[src*="challenges.c"]')
1698
1740
  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:
@@ -137,6 +137,16 @@ class DriverMethods(WebDriver):
137
137
  def wait_for_element_present(self, *args, **kwargs):
138
138
  return page_actions.wait_for_selector(self.driver, *args, **kwargs)
139
139
 
140
+ def wait_for_element_absent(self, *args, **kwargs):
141
+ return page_actions.wait_for_element_absent(
142
+ self.driver, *args, **kwargs
143
+ )
144
+
145
+ def wait_for_element_not_visible(self, *args, **kwargs):
146
+ return page_actions.wait_for_element_not_visible(
147
+ self.driver, *args, **kwargs
148
+ )
149
+
140
150
  def wait_for_selector(self, *args, **kwargs):
141
151
  return page_actions.wait_for_selector(self.driver, *args, **kwargs)
142
152
 
@@ -1108,6 +1108,14 @@ def wait_for_element_absent(
1108
1108
  timeout - the time to wait for elements in seconds
1109
1109
  original_selector - handle pre-converted ":contains(TEXT)" selector
1110
1110
  """
1111
+ if __is_cdp_swap_needed(driver):
1112
+ if page_utils.is_valid_by(by):
1113
+ original_selector = selector
1114
+ elif page_utils.is_valid_by(selector):
1115
+ original_selector = by
1116
+ selector, by = page_utils.recalculate_selector(original_selector, by)
1117
+ driver.cdp.wait_for_element_absent(selector)
1118
+ return True
1111
1119
  _reconnect_if_disconnected(driver)
1112
1120
  start_ms = time.time() * 1000.0
1113
1121
  stop_ms = start_ms + (timeout * 1000.0)
@@ -1156,6 +1164,14 @@ def wait_for_element_not_visible(
1156
1164
  timeout - the time to wait for the element in seconds
1157
1165
  original_selector - handle pre-converted ":contains(TEXT)" selector
1158
1166
  """
1167
+ if __is_cdp_swap_needed(driver):
1168
+ if page_utils.is_valid_by(by):
1169
+ original_selector = selector
1170
+ elif page_utils.is_valid_by(selector):
1171
+ original_selector = by
1172
+ selector, by = page_utils.recalculate_selector(original_selector, by)
1173
+ driver.cdp.wait_for_element_not_visible(selector)
1174
+ return True
1159
1175
  _reconnect_if_disconnected(driver)
1160
1176
  start_ms = time.time() * 1000.0
1161
1177
  stop_ms = start_ms + (timeout * 1000.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.41.10
3
+ Version: 4.41.12
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