seleniumbase 4.34.16__tar.gz → 4.35.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {seleniumbase-4.34.16/seleniumbase.egg-info → seleniumbase-4.35.0}/PKG-INFO +3 -3
  2. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/requirements.txt +2 -2
  3. seleniumbase-4.35.0/seleniumbase/__version__.py +2 -0
  4. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/browser_launcher.py +20 -1
  5. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/sb_cdp.py +91 -47
  6. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/base_case.py +11 -8
  7. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/base_plugin.py +12 -15
  8. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/selenium_plugin.py +1 -0
  9. {seleniumbase-4.34.16 → seleniumbase-4.35.0/seleniumbase.egg-info}/PKG-INFO +3 -3
  10. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase.egg-info/requires.txt +2 -2
  11. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/setup.py +2 -2
  12. seleniumbase-4.34.16/seleniumbase/__version__.py +0 -2
  13. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/.gitignore +0 -0
  14. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/LICENSE +0 -0
  15. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/MANIFEST.in +0 -0
  16. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/README.md +0 -0
  17. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/install.sh +0 -0
  18. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/pyproject.toml +0 -0
  19. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/pytest.ini +0 -0
  20. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/sbase/__init__.py +0 -0
  21. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/sbase/__main__.py +0 -0
  22. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/sbase/steps.py +0 -0
  23. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/__init__.py +0 -0
  24. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/__main__.py +0 -0
  25. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/behave/__init__.py +0 -0
  26. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/behave/behave_helper.py +0 -0
  27. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/behave/behave_sb.py +0 -0
  28. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/behave/steps.py +0 -0
  29. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/common/__init__.py +0 -0
  30. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/common/decorators.py +0 -0
  31. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/common/encryption.py +0 -0
  32. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/common/exceptions.py +0 -0
  33. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/common/obfuscate.py +0 -0
  34. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/common/unobfuscate.py +0 -0
  35. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/config/__init__.py +0 -0
  36. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/config/ad_block_list.py +0 -0
  37. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/config/proxy_list.py +0 -0
  38. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/config/settings.py +0 -0
  39. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/__init__.py +0 -0
  40. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/logo_helper.py +0 -0
  41. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/rich_helper.py +0 -0
  42. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/run.py +0 -0
  43. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  44. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  45. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_commander.py +0 -0
  46. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_install.py +0 -0
  47. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  48. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  49. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  50. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  51. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  52. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  53. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_print.py +0 -0
  54. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  55. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/__init__.py +0 -0
  56. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/application_manager.py +0 -0
  57. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/capabilities_parser.py +0 -0
  58. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/colored_traceback.py +0 -0
  59. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/create_db_tables.sql +0 -0
  60. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/detect_b_ver.py +0 -0
  61. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/download_helper.py +0 -0
  62. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/encoded_images.py +0 -0
  63. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/jqc_helper.py +0 -0
  64. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/log_helper.py +0 -0
  65. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/mysql.py +0 -0
  66. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/proxy_helper.py +0 -0
  67. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/recorder_helper.py +0 -0
  68. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/report_helper.py +0 -0
  69. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/s3_manager.py +0 -0
  70. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/sb_driver.py +0 -0
  71. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/session_helper.py +0 -0
  72. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/settings_parser.py +0 -0
  73. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/style_sheet.py +0 -0
  74. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/testcase_manager.py +0 -0
  75. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/tour_helper.py +0 -0
  76. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/core/visual_helper.py +0 -0
  77. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/drivers/__init__.py +0 -0
  78. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/extensions/__init__.py +0 -0
  79. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/extensions/ad_block.zip +0 -0
  80. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/extensions/disable_csp.zip +0 -0
  81. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/extensions/recorder.zip +0 -0
  82. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/extensions/sbase_ext.zip +0 -0
  83. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/__init__.py +0 -0
  84. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/constants.py +0 -0
  85. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  86. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/errors.py +0 -0
  87. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/js_utils.py +0 -0
  88. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/page_actions.py +0 -0
  89. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/page_utils.py +0 -0
  90. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/shared_utils.py +0 -0
  91. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/unittest_helper.py +0 -0
  92. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/words.py +0 -0
  93. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  94. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/js_code/__init__.py +0 -0
  95. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/js_code/active_css_js.py +0 -0
  96. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/js_code/live_js.py +0 -0
  97. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/js_code/recorder_js.py +0 -0
  98. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/masterqa/__init__.py +0 -0
  99. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/masterqa/master_qa.py +0 -0
  100. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/__init__.py +0 -0
  101. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/basic_test_info.py +0 -0
  102. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  103. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/driver_manager.py +0 -0
  104. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/page_source.py +0 -0
  105. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/pytest_plugin.py +0 -0
  106. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  107. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/sb_manager.py +0 -0
  108. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/plugins/screen_shots.py +0 -0
  109. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/resources/__init__.py +0 -0
  110. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/__init__.py +0 -0
  111. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/chinese.py +0 -0
  112. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/dutch.py +0 -0
  113. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/french.py +0 -0
  114. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/italian.py +0 -0
  115. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/japanese.py +0 -0
  116. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/korean.py +0 -0
  117. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/master_dict.py +0 -0
  118. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/portuguese.py +0 -0
  119. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/russian.py +0 -0
  120. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/spanish.py +0 -0
  121. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/translate/translator.py +0 -0
  122. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/__init__.py +0 -0
  123. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp.py +0 -0
  124. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  125. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  126. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  127. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  128. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  129. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  130. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  131. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  132. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/dprocess.py +0 -0
  133. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/options.py +0 -0
  134. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/patcher.py +0 -0
  135. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/reactor.py +0 -0
  136. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/undetected/webelement.py +0 -0
  137. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/__init__.py +0 -0
  138. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  139. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  140. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  141. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  142. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  143. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  144. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  145. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  146. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  147. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  148. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  149. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  150. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  151. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase.egg-info/SOURCES.txt +0 -0
  152. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase.egg-info/dependency_links.txt +0 -0
  153. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase.egg-info/entry_points.txt +0 -0
  154. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/seleniumbase.egg-info/top_level.txt +0 -0
  155. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/setup.cfg +0 -0
  156. {seleniumbase-4.34.16 → seleniumbase-4.35.0}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.34.16
3
+ Version: 4.35.0
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
@@ -73,7 +73,7 @@ Requires-Dist: filelock~=3.16.1; python_version < "3.9"
73
73
  Requires-Dist: filelock>=3.17.0; python_version >= "3.9"
74
74
  Requires-Dist: fasteners>=0.19
75
75
  Requires-Dist: mycdp>=1.1.0
76
- Requires-Dist: pynose>=1.5.3
76
+ Requires-Dist: pynose>=1.5.4
77
77
  Requires-Dist: platformdirs>=4.3.6
78
78
  Requires-Dist: typing-extensions>=4.12.2
79
79
  Requires-Dist: sbvirtualdisplay>=1.4.0
@@ -104,7 +104,7 @@ Requires-Dist: trio-websocket==0.12.1
104
104
  Requires-Dist: wsproto==1.2.0
105
105
  Requires-Dist: websocket-client==1.8.0
106
106
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
107
- Requires-Dist: selenium==4.28.1; python_version >= "3.9"
107
+ Requires-Dist: selenium==4.29.0; python_version >= "3.9"
108
108
  Requires-Dist: cssselect==1.2.0
109
109
  Requires-Dist: sortedcontainers==2.4.0
110
110
  Requires-Dist: execnet==2.1.1
@@ -12,7 +12,7 @@ filelock~=3.16.1;python_version<"3.9"
12
12
  filelock>=3.17.0;python_version>="3.9"
13
13
  fasteners>=0.19
14
14
  mycdp>=1.1.0
15
- pynose>=1.5.3
15
+ pynose>=1.5.4
16
16
  platformdirs>=4.3.6
17
17
  typing-extensions>=4.12.2
18
18
  sbvirtualdisplay>=1.4.0
@@ -43,7 +43,7 @@ trio-websocket==0.12.1
43
43
  wsproto==1.2.0
44
44
  websocket-client==1.8.0
45
45
  selenium==4.27.1;python_version<"3.9"
46
- selenium==4.28.1;python_version>="3.9"
46
+ selenium==4.29.0;python_version>="3.9"
47
47
  cssselect==1.2.0
48
48
  sortedcontainers==2.4.0
49
49
  execnet==2.1.1
@@ -0,0 +1,2 @@
1
+ # seleniumbase package
2
+ __version__ = "4.35.0"
@@ -723,6 +723,8 @@ def uc_open_with_cdp_mode(driver, url=None):
723
723
  cdp.wait_for_text = CDPM.wait_for_text
724
724
  cdp.wait_for_text_not_visible = CDPM.wait_for_text_not_visible
725
725
  cdp.wait_for_element_visible = CDPM.wait_for_element_visible
726
+ cdp.wait_for_element_not_visible = CDPM.wait_for_element_not_visible
727
+ cdp.wait_for_element_absent = CDPM.wait_for_element_absent
726
728
  cdp.assert_element = CDPM.assert_element
727
729
  cdp.assert_element_visible = CDPM.assert_element_visible
728
730
  cdp.assert_element_present = CDPM.assert_element_present
@@ -1628,9 +1630,19 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
1628
1630
  ):
1629
1631
  driver.uc_open_with_disconnect(driver.current_url, 3.8)
1630
1632
  with suppress(Exception):
1633
+ if "--debug" in sys.argv:
1634
+ if sb_config._saved_cf_tab_count == 1:
1635
+ print(' <DEBUG> pyautogui.press("\\t")')
1636
+ else:
1637
+ print(
1638
+ ' <DEBUG> pyautogui.press("\\t") * %s'
1639
+ % sb_config._saved_cf_tab_count
1640
+ )
1631
1641
  for i in range(sb_config._saved_cf_tab_count):
1632
1642
  pyautogui.press("\t")
1633
1643
  time.sleep(0.027)
1644
+ if "--debug" in sys.argv:
1645
+ print(' <DEBUG> pyautogui.press(" ")')
1634
1646
  pyautogui.press(" ")
1635
1647
  else:
1636
1648
  driver.disconnect()
@@ -2310,7 +2322,14 @@ def _set_chrome_options(
2310
2322
  and not enable_3d_apis
2311
2323
  ):
2312
2324
  chrome_options.add_argument("--disable-gpu")
2313
- if not IS_LINUX and is_using_uc(undetectable, browser_name):
2325
+ if (
2326
+ (not IS_LINUX and is_using_uc(undetectable, browser_name))
2327
+ or (
2328
+ IS_MAC
2329
+ and binary_location
2330
+ and "chrome-headless-shell" in binary_location
2331
+ )
2332
+ ):
2314
2333
  chrome_options.add_argument("--disable-dev-shm-usage")
2315
2334
  chrome_options.add_argument("--disable-application-cache")
2316
2335
  if IS_LINUX:
@@ -56,6 +56,9 @@ class CDPMethods():
56
56
  element, *args, **kwargs
57
57
  )
58
58
  element.focus = lambda: self.__focus(element)
59
+ element.gui_click = (
60
+ lambda *args, **kwargs: self.__gui_click(element, *args, **kwargs)
61
+ )
59
62
  element.highlight_overlay = lambda: self.__highlight_overlay(element)
60
63
  element.mouse_click = lambda: self.__mouse_click(element)
61
64
  element.mouse_drag = (
@@ -426,6 +429,39 @@ class CDPMethods():
426
429
  self.loop.run_until_complete(element.focus_async())
427
430
  )
428
431
 
432
+ def __gui_click(self, element, timeframe=None):
433
+ element.scroll_into_view()
434
+ self.__add_light_pause()
435
+ position = element.get_position()
436
+ x = position.x
437
+ y = position.y
438
+ e_width = position.width
439
+ e_height = position.height
440
+ # Relative to window
441
+ element_rect = {"height": e_height, "width": e_width, "x": x, "y": y}
442
+ window_rect = self.get_window_rect()
443
+ w_bottom_y = window_rect["y"] + window_rect["height"]
444
+ viewport_height = window_rect["innerHeight"]
445
+ x = window_rect["x"] + element_rect["x"]
446
+ y = w_bottom_y - viewport_height + element_rect["y"]
447
+ y_scroll_offset = window_rect["pageYOffset"]
448
+ y = y - y_scroll_offset
449
+ x = x + window_rect["scrollX"]
450
+ y = y + window_rect["scrollY"]
451
+ # Relative to screen
452
+ element_rect = {"height": e_height, "width": e_width, "x": x, "y": y}
453
+ e_width = element_rect["width"]
454
+ e_height = element_rect["height"]
455
+ e_x = element_rect["x"]
456
+ e_y = element_rect["y"]
457
+ x, y = ((e_x + e_width / 2.0) + 0.5), ((e_y + e_height / 2.0) + 0.5)
458
+ if not timeframe or not isinstance(timeframe, (int, float)):
459
+ timeframe = 0.25
460
+ if timeframe > 3:
461
+ timeframe = 3
462
+ self.gui_click_x_y(x, y, timeframe=timeframe)
463
+ return self.loop.run_until_complete(self.page.wait())
464
+
429
465
  def __highlight_overlay(self, element):
430
466
  return (
431
467
  self.loop.run_until_complete(element.highlight_overlay_async())
@@ -461,9 +497,7 @@ class CDPMethods():
461
497
  element.send_keys("\r\n")
462
498
  time.sleep(0.044)
463
499
  self.__slow_mode_pause_if_set()
464
- return (
465
- self.loop.run_until_complete(self.page.wait())
466
- )
500
+ return self.loop.run_until_complete(self.page.sleep(0.025))
467
501
 
468
502
  def __query_selector(self, element, selector):
469
503
  selector = self.__convert_to_css_if_xpath(selector)
@@ -830,7 +864,7 @@ class CDPMethods():
830
864
  text = text[:-1] + "\r\n"
831
865
  element.send_keys(text)
832
866
  self.__slow_mode_pause_if_set()
833
- self.loop.run_until_complete(self.page.wait())
867
+ self.loop.run_until_complete(self.page.sleep(0.025))
834
868
 
835
869
  def press_keys(self, selector, text, timeout=None):
836
870
  """Similar to send_keys(), but presses keys at human speed."""
@@ -850,7 +884,7 @@ class CDPMethods():
850
884
  element.send_keys("\r\n")
851
885
  time.sleep(0.044)
852
886
  self.__slow_mode_pause_if_set()
853
- self.loop.run_until_complete(self.page.wait())
887
+ self.loop.run_until_complete(self.page.sleep(0.025))
854
888
 
855
889
  def type(self, selector, text, timeout=None):
856
890
  """Similar to send_keys(), but clears the text field first."""
@@ -865,7 +899,7 @@ class CDPMethods():
865
899
  text = text[:-1] + "\r\n"
866
900
  element.send_keys(text)
867
901
  self.__slow_mode_pause_if_set()
868
- self.loop.run_until_complete(self.page.wait())
902
+ self.loop.run_until_complete(self.page.sleep(0.025))
869
903
 
870
904
  def set_value(self, selector, text, timeout=None):
871
905
  """Similar to send_keys(), but clears the text field first."""
@@ -903,7 +937,7 @@ class CDPMethods():
903
937
  self.__add_light_pause()
904
938
  self.send_keys(selector, "\n")
905
939
  self.__slow_mode_pause_if_set()
906
- self.loop.run_until_complete(self.page.wait())
940
+ self.loop.run_until_complete(self.page.sleep(0.025))
907
941
 
908
942
  def evaluate(self, expression):
909
943
  """Run a JavaScript expression and return the result."""
@@ -1343,7 +1377,7 @@ class CDPMethods():
1343
1377
  pyautogui.press(key)
1344
1378
  time.sleep(0.044)
1345
1379
  self.__slow_mode_pause_if_set()
1346
- self.loop.run_until_complete(self.page.wait())
1380
+ self.loop.run_until_complete(self.page.sleep(0.025))
1347
1381
 
1348
1382
  def gui_press_keys(self, keys):
1349
1383
  self.__install_pyautogui_if_missing()
@@ -1358,7 +1392,7 @@ class CDPMethods():
1358
1392
  pyautogui.press(key)
1359
1393
  time.sleep(0.044)
1360
1394
  self.__slow_mode_pause_if_set()
1361
- self.loop.run_until_complete(self.page.wait())
1395
+ self.loop.run_until_complete(self.page.sleep(0.025))
1362
1396
 
1363
1397
  def gui_write(self, text):
1364
1398
  self.__install_pyautogui_if_missing()
@@ -1371,7 +1405,7 @@ class CDPMethods():
1371
1405
  self.__make_sure_pyautogui_lock_is_writable()
1372
1406
  pyautogui.write(text)
1373
1407
  self.__slow_mode_pause_if_set()
1374
- self.loop.run_until_complete(self.page.wait())
1408
+ self.loop.run_until_complete(self.page.sleep(0.025))
1375
1409
 
1376
1410
  def __gui_click_x_y(self, x, y, timeframe=0.25, uc_lock=False):
1377
1411
  self.__install_pyautogui_if_missing()
@@ -1786,37 +1820,8 @@ class CDPMethods():
1786
1820
  time.sleep(0.1)
1787
1821
  raise Exception("Element {%s} was not visible!" % selector)
1788
1822
 
1789
- def assert_element(self, selector, timeout=None):
1790
- """Same as assert_element_visible()"""
1791
- self.assert_element_visible(selector, timeout=timeout)
1792
- return True
1793
-
1794
- def assert_element_visible(self, selector, timeout=None):
1795
- """Same as assert_element()"""
1796
- if not timeout:
1797
- timeout = settings.SMALL_TIMEOUT
1798
- try:
1799
- self.select(selector, timeout=timeout)
1800
- except Exception:
1801
- raise Exception("Element {%s} was not found!" % selector)
1802
- for i in range(30):
1803
- if self.is_element_visible(selector):
1804
- return True
1805
- time.sleep(0.1)
1806
- raise Exception("Element {%s} was not visible!" % selector)
1807
-
1808
- def assert_element_present(self, selector, timeout=None):
1809
- """Assert element is present in the DOM. (Visibility NOT required)"""
1810
- if not timeout:
1811
- timeout = settings.SMALL_TIMEOUT
1812
- try:
1813
- self.select(selector, timeout=timeout)
1814
- except Exception:
1815
- raise Exception("Element {%s} was not found!" % selector)
1816
- return True
1817
-
1818
- def assert_element_absent(self, selector, timeout=None):
1819
- """Assert element is not present in the DOM."""
1823
+ def wait_for_element_not_visible(self, selector, timeout=None):
1824
+ """Wait for element to not be visible on page. (May still be in DOM)"""
1820
1825
  if not timeout:
1821
1826
  timeout = settings.SMALL_TIMEOUT
1822
1827
  start_ms = time.time() * 1000.0
@@ -1824,6 +1829,8 @@ class CDPMethods():
1824
1829
  for i in range(int(timeout * 10)):
1825
1830
  if not self.is_element_present(selector):
1826
1831
  return True
1832
+ elif not self.is_element_visible(selector):
1833
+ return True
1827
1834
  now_ms = time.time() * 1000.0
1828
1835
  if now_ms >= stop_ms:
1829
1836
  break
@@ -1832,12 +1839,12 @@ class CDPMethods():
1832
1839
  if timeout == 1:
1833
1840
  plural = ""
1834
1841
  raise Exception(
1835
- "Element {%s} was still present after %s second%s!"
1842
+ "Element {%s} was still visible after %s second%s!"
1836
1843
  % (selector, timeout, plural)
1837
1844
  )
1838
1845
 
1839
- def assert_element_not_visible(self, selector, timeout=None):
1840
- """Assert element is not visible on page. (May still be in DOM)"""
1846
+ def wait_for_element_absent(self, selector, timeout=None):
1847
+ """Wait for element to not be present in the DOM."""
1841
1848
  if not timeout:
1842
1849
  timeout = settings.SMALL_TIMEOUT
1843
1850
  start_ms = time.time() * 1000.0
@@ -1845,8 +1852,6 @@ class CDPMethods():
1845
1852
  for i in range(int(timeout * 10)):
1846
1853
  if not self.is_element_present(selector):
1847
1854
  return True
1848
- elif not self.is_element_visible(selector):
1849
- return True
1850
1855
  now_ms = time.time() * 1000.0
1851
1856
  if now_ms >= stop_ms:
1852
1857
  break
@@ -1855,10 +1860,49 @@ class CDPMethods():
1855
1860
  if timeout == 1:
1856
1861
  plural = ""
1857
1862
  raise Exception(
1858
- "Element {%s} was still visible after %s second%s!"
1863
+ "Element {%s} was still present after %s second%s!"
1859
1864
  % (selector, timeout, plural)
1860
1865
  )
1861
1866
 
1867
+ def assert_element(self, selector, timeout=None):
1868
+ """Same as assert_element_visible()"""
1869
+ self.assert_element_visible(selector, timeout=timeout)
1870
+ return True
1871
+
1872
+ def assert_element_visible(self, selector, timeout=None):
1873
+ """Same as assert_element()"""
1874
+ if not timeout:
1875
+ timeout = settings.SMALL_TIMEOUT
1876
+ try:
1877
+ self.select(selector, timeout=timeout)
1878
+ except Exception:
1879
+ raise Exception("Element {%s} was not found!" % selector)
1880
+ for i in range(30):
1881
+ if self.is_element_visible(selector):
1882
+ return True
1883
+ time.sleep(0.1)
1884
+ raise Exception("Element {%s} was not visible!" % selector)
1885
+
1886
+ def assert_element_present(self, selector, timeout=None):
1887
+ """Assert element is present in the DOM. (Visibility NOT required)"""
1888
+ if not timeout:
1889
+ timeout = settings.SMALL_TIMEOUT
1890
+ try:
1891
+ self.select(selector, timeout=timeout)
1892
+ except Exception:
1893
+ raise Exception("Element {%s} was not found!" % selector)
1894
+ return True
1895
+
1896
+ def assert_element_absent(self, selector, timeout=None):
1897
+ """Assert element is not present in the DOM."""
1898
+ self.wait_for_element_absent(selector, timeout=timeout)
1899
+ return True
1900
+
1901
+ def assert_element_not_visible(self, selector, timeout=None):
1902
+ """Assert element is not visible on page. (May still be in DOM)"""
1903
+ self.wait_for_element_not_visible(selector, timeout=timeout)
1904
+ return True
1905
+
1862
1906
  def assert_element_attribute(self, selector, attribute, value=None):
1863
1907
  attributes = self.get_element_attributes(selector)
1864
1908
  if attribute not in attributes:
@@ -9124,7 +9124,7 @@ class BaseCase(unittest.TestCase):
9124
9124
  original_selector = selector
9125
9125
  selector, by = self.__recalculate_selector(selector, by)
9126
9126
  if self.__is_cdp_swap_needed():
9127
- self.cdp.assert_element_absent(selector)
9127
+ self.cdp.wait_for_element_absent(selector, timeout=timeout)
9128
9128
  return True
9129
9129
  return page_actions.wait_for_element_absent(
9130
9130
  self.driver,
@@ -9585,7 +9585,7 @@ class BaseCase(unittest.TestCase):
9585
9585
  self.assert_elements_present(selector, by=by, timeout=timeout)
9586
9586
  return True
9587
9587
  if self.__is_cdp_swap_needed():
9588
- self.cdp.assert_element_present(selector)
9588
+ self.cdp.assert_element_present(selector, timeout=timeout)
9589
9589
  return True
9590
9590
  if self.__is_shadow_selector(selector):
9591
9591
  self.__assert_shadow_element_present(selector)
@@ -9662,7 +9662,7 @@ class BaseCase(unittest.TestCase):
9662
9662
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
9663
9663
  timeout = self.__get_new_timeout(timeout)
9664
9664
  if self.__is_cdp_swap_needed():
9665
- self.cdp.assert_element(selector)
9665
+ self.cdp.assert_element(selector, timeout=timeout)
9666
9666
  return True
9667
9667
  if isinstance(selector, list):
9668
9668
  self.assert_elements(selector, by=by, timeout=timeout)
@@ -9955,7 +9955,7 @@ class BaseCase(unittest.TestCase):
9955
9955
  messenger_post, selector, by
9956
9956
  )
9957
9957
  elif self.__is_cdp_swap_needed():
9958
- self.cdp.assert_text(text, selector)
9958
+ self.cdp.assert_text(text, selector, timeout=timeout)
9959
9959
  return True
9960
9960
  elif not self.is_connected():
9961
9961
  self.connect()
@@ -10005,7 +10005,7 @@ class BaseCase(unittest.TestCase):
10005
10005
  original_selector = selector
10006
10006
  selector, by = self.__recalculate_selector(selector, by)
10007
10007
  if self.__is_cdp_swap_needed():
10008
- self.cdp.assert_exact_text(text, selector)
10008
+ self.cdp.assert_exact_text(text, selector, timeout=timeout)
10009
10009
  return True
10010
10010
  if self.__is_shadow_selector(selector):
10011
10011
  self.__assert_exact_shadow_text_visible(text, selector, timeout)
@@ -10245,6 +10245,9 @@ class BaseCase(unittest.TestCase):
10245
10245
  timeout = self.__get_new_timeout(timeout)
10246
10246
  original_selector = selector
10247
10247
  selector, by = self.__recalculate_selector(selector, by)
10248
+ if self.__is_cdp_swap_needed():
10249
+ self.cdp.wait_for_element_absent(selector, timeout=timeout)
10250
+ return True
10248
10251
  return page_actions.wait_for_element_absent(
10249
10252
  self.driver,
10250
10253
  selector,
@@ -10267,7 +10270,7 @@ class BaseCase(unittest.TestCase):
10267
10270
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
10268
10271
  timeout = self.__get_new_timeout(timeout)
10269
10272
  if self.__is_cdp_swap_needed():
10270
- self.cdp.assert_element_absent(selector)
10273
+ self.cdp.assert_element_absent(selector, timeout=timeout)
10271
10274
  return True
10272
10275
  self.wait_for_element_absent(selector, by=by, timeout=timeout)
10273
10276
  return True
@@ -10288,7 +10291,7 @@ class BaseCase(unittest.TestCase):
10288
10291
  original_selector = selector
10289
10292
  selector, by = self.__recalculate_selector(selector, by)
10290
10293
  if self.__is_cdp_swap_needed():
10291
- self.cdp.assert_element_not_visible(selector)
10294
+ self.cdp.wait_for_element_not_visible(selector, timeout=timeout)
10292
10295
  return True
10293
10296
  return page_actions.wait_for_element_not_visible(
10294
10297
  self.driver,
@@ -10310,7 +10313,7 @@ class BaseCase(unittest.TestCase):
10310
10313
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
10311
10314
  timeout = self.__get_new_timeout(timeout)
10312
10315
  if self.__is_cdp_swap_needed():
10313
- self.cdp.assert_element_not_visible(selector)
10316
+ self.cdp.assert_element_not_visible(selector, timeout=timeout)
10314
10317
  return True
10315
10318
  self.wait_for_element_not_visible(selector, by=by, timeout=timeout)
10316
10319
  if self.recorder_mode and self.__current_url_is_recordable():
@@ -208,7 +208,6 @@ class Base(Plugin):
208
208
  self.duration = float(0)
209
209
  self.page_results_list = []
210
210
  self.test_count = 0
211
- self.import_error = False
212
211
  log_path = constants.Logs.LATEST + "/"
213
212
  archive_logs = options.archive_logs
214
213
  log_helper.log_folder_setup(log_path, archive_logs)
@@ -238,6 +237,7 @@ class Base(Plugin):
238
237
  )
239
238
  else:
240
239
  variables = {}
240
+ test.test.test_id = test.id()
241
241
  test.test.is_nosetest = True
242
242
  test.test.environment = self.options.environment
243
243
  test.test.env = self.options.environment # Add a shortened version
@@ -263,17 +263,16 @@ class Base(Plugin):
263
263
  )
264
264
  log_helper.clear_empty_logs()
265
265
  if self.report_on:
266
- if not self.import_error:
267
- report_helper.add_bad_page_log_file(self.page_results_list)
268
- report_log_path = report_helper.archive_new_report_logs()
269
- report_helper.build_report(
270
- report_log_path,
271
- self.page_results_list,
272
- self.successes,
273
- self.failures,
274
- self.options.browser,
275
- self.show_report,
276
- )
266
+ report_helper.add_bad_page_log_file(self.page_results_list)
267
+ report_log_path = report_helper.archive_new_report_logs()
268
+ report_helper.build_report(
269
+ report_log_path,
270
+ self.page_results_list,
271
+ self.successes,
272
+ self.failures,
273
+ self.options.browser,
274
+ self.show_report,
275
+ )
277
276
 
278
277
  def addSuccess(self, test, capt):
279
278
  if self.report_on:
@@ -293,9 +292,6 @@ class Base(Plugin):
293
292
  "%.2fs" % (float(time.time()) - float(self.start_time))
294
293
  )
295
294
  if test.id() == "nose.failure.Failure.runTest":
296
- print(">>> ERROR: Could not locate tests to run!")
297
- print(">>> The Test Report WILL NOT be generated!")
298
- self.import_error = True
299
295
  return
300
296
  self.failures.append(test.id())
301
297
  self.page_results_list.append(
@@ -314,6 +310,7 @@ class Base(Plugin):
314
310
  test._log_fail_data()
315
311
  sb_config._excinfo_tb = err
316
312
  log_path = None
313
+ source = None
317
314
  if hasattr(sb_config, "_test_logpath"):
318
315
  log_path = sb_config._test_logpath
319
316
  if hasattr(sb_config, "_last_page_source"):
@@ -1309,6 +1309,7 @@ class SeleniumBrowser(Plugin):
1309
1309
  test.test.dashboard = False
1310
1310
  test.test._multithreaded = False
1311
1311
  test.test._reuse_session = False
1312
+ sb_config.recorder_mode = test.test.recorder_mode
1312
1313
  sb_config.no_screenshot = test.test.no_screenshot_after_test
1313
1314
  if test.test.servername != "localhost":
1314
1315
  # Using Selenium Grid
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.34.16
3
+ Version: 4.35.0
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
@@ -73,7 +73,7 @@ Requires-Dist: filelock~=3.16.1; python_version < "3.9"
73
73
  Requires-Dist: filelock>=3.17.0; python_version >= "3.9"
74
74
  Requires-Dist: fasteners>=0.19
75
75
  Requires-Dist: mycdp>=1.1.0
76
- Requires-Dist: pynose>=1.5.3
76
+ Requires-Dist: pynose>=1.5.4
77
77
  Requires-Dist: platformdirs>=4.3.6
78
78
  Requires-Dist: typing-extensions>=4.12.2
79
79
  Requires-Dist: sbvirtualdisplay>=1.4.0
@@ -104,7 +104,7 @@ Requires-Dist: trio-websocket==0.12.1
104
104
  Requires-Dist: wsproto==1.2.0
105
105
  Requires-Dist: websocket-client==1.8.0
106
106
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
107
- Requires-Dist: selenium==4.28.1; python_version >= "3.9"
107
+ Requires-Dist: selenium==4.29.0; python_version >= "3.9"
108
108
  Requires-Dist: cssselect==1.2.0
109
109
  Requires-Dist: sortedcontainers==2.4.0
110
110
  Requires-Dist: execnet==2.1.1
@@ -6,7 +6,7 @@ certifi>=2025.1.31
6
6
  exceptiongroup>=1.2.2
7
7
  fasteners>=0.19
8
8
  mycdp>=1.1.0
9
- pynose>=1.5.3
9
+ pynose>=1.5.4
10
10
  platformdirs>=4.3.6
11
11
  typing-extensions>=4.12.2
12
12
  sbvirtualdisplay>=1.4.0
@@ -75,7 +75,7 @@ websockets>=15.0
75
75
  filelock>=3.17.0
76
76
  MarkupSafe>=3.0.2
77
77
  trio==0.29.0
78
- selenium==4.28.1
78
+ selenium==4.29.0
79
79
  pytest-rerunfailures==15.0
80
80
 
81
81
  [allure]
@@ -161,7 +161,7 @@ setup(
161
161
  'filelock>=3.17.0;python_version>="3.9"',
162
162
  'fasteners>=0.19',
163
163
  "mycdp>=1.1.0",
164
- "pynose>=1.5.3",
164
+ "pynose>=1.5.4",
165
165
  'platformdirs>=4.3.6',
166
166
  'typing-extensions>=4.12.2',
167
167
  "sbvirtualdisplay>=1.4.0",
@@ -192,7 +192,7 @@ setup(
192
192
  'wsproto==1.2.0',
193
193
  'websocket-client==1.8.0',
194
194
  'selenium==4.27.1;python_version<"3.9"',
195
- 'selenium==4.28.1;python_version>="3.9"',
195
+ 'selenium==4.29.0;python_version>="3.9"',
196
196
  'cssselect==1.2.0',
197
197
  "sortedcontainers==2.4.0",
198
198
  'execnet==2.1.1',
@@ -1,2 +0,0 @@
1
- # seleniumbase package
2
- __version__ = "4.34.16"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes