seleniumbase 4.47.6__tar.gz → 4.47.7__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 (162) hide show
  1. {seleniumbase-4.47.6/seleniumbase.egg-info → seleniumbase-4.47.7}/PKG-INFO +2 -1
  2. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/README.md +1 -0
  3. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/__version__.py +1 -1
  4. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_mkdir.py +3 -0
  5. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/browser_launcher.py +1 -0
  6. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/sb_cdp.py +31 -2
  7. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/sb_manager.py +2 -0
  8. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp_driver/element.py +27 -2
  9. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp_driver/tab.py +0 -1
  10. {seleniumbase-4.47.6 → seleniumbase-4.47.7/seleniumbase.egg-info}/PKG-INFO +2 -1
  11. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/.gitignore +0 -0
  12. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/LICENSE +0 -0
  13. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/MANIFEST.in +0 -0
  14. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/install.sh +0 -0
  15. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/pyproject.toml +0 -0
  16. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/pytest.ini +0 -0
  17. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/requirements.txt +0 -0
  18. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/sbase/__init__.py +0 -0
  19. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/sbase/__main__.py +0 -0
  20. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/sbase/steps.py +0 -0
  21. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/__init__.py +0 -0
  22. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/__main__.py +0 -0
  23. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/behave/__init__.py +0 -0
  24. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/behave/behave_helper.py +0 -0
  25. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/behave/behave_sb.py +0 -0
  26. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/behave/steps.py +0 -0
  27. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/common/__init__.py +0 -0
  28. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/common/decorators.py +0 -0
  29. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/common/encryption.py +0 -0
  30. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/common/exceptions.py +0 -0
  31. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/common/obfuscate.py +0 -0
  32. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/common/unobfuscate.py +0 -0
  33. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/config/__init__.py +0 -0
  34. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/config/ad_block_list.py +0 -0
  35. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/config/proxy_list.py +0 -0
  36. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/config/settings.py +0 -0
  37. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/__init__.py +0 -0
  38. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/logo_helper.py +0 -0
  39. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/rich_helper.py +0 -0
  40. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/run.py +0 -0
  41. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  42. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  43. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_commander.py +0 -0
  44. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_install.py +0 -0
  45. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  46. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  47. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  48. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  49. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  50. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_print.py +0 -0
  51. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  52. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/__init__.py +0 -0
  53. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/application_manager.py +0 -0
  54. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/capabilities_parser.py +0 -0
  55. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/colored_traceback.py +0 -0
  56. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/create_db_tables.sql +0 -0
  57. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/detect_b_ver.py +0 -0
  58. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/download_helper.py +0 -0
  59. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/encoded_images.py +0 -0
  60. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/jqc_helper.py +0 -0
  61. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/log_helper.py +0 -0
  62. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/mysql.py +0 -0
  63. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/proxy_helper.py +0 -0
  64. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/recorder_helper.py +0 -0
  65. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/report_helper.py +0 -0
  66. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/s3_manager.py +0 -0
  67. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/sb_driver.py +0 -0
  68. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/session_helper.py +0 -0
  69. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/settings_parser.py +0 -0
  70. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/style_sheet.py +0 -0
  71. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/testcase_manager.py +0 -0
  72. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/tour_helper.py +0 -0
  73. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/core/visual_helper.py +0 -0
  74. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/drivers/__init__.py +0 -0
  75. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  76. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  77. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  78. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  79. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  80. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  81. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  82. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/extensions/__init__.py +0 -0
  83. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/extensions/ad_block.zip +0 -0
  84. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/extensions/disable_csp.zip +0 -0
  85. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/extensions/recorder.zip +0 -0
  86. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/extensions/sbase_ext.zip +0 -0
  87. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/__init__.py +0 -0
  88. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/base_case.py +0 -0
  89. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/constants.py +0 -0
  90. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  91. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/errors.py +0 -0
  92. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/js_utils.py +0 -0
  93. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/page_actions.py +0 -0
  94. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/page_utils.py +0 -0
  95. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/shared_utils.py +0 -0
  96. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/unittest_helper.py +0 -0
  97. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/words.py +0 -0
  98. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  99. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/js_code/__init__.py +0 -0
  100. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/js_code/active_css_js.py +0 -0
  101. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/js_code/live_js.py +0 -0
  102. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/js_code/recorder_js.py +0 -0
  103. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/masterqa/__init__.py +0 -0
  104. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/masterqa/master_qa.py +0 -0
  105. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/__init__.py +0 -0
  106. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/base_plugin.py +0 -0
  107. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/basic_test_info.py +0 -0
  108. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  109. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/driver_manager.py +0 -0
  110. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/page_source.py +0 -0
  111. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/pytest_plugin.py +0 -0
  112. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  113. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/screen_shots.py +0 -0
  114. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/plugins/selenium_plugin.py +0 -0
  115. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/resources/__init__.py +0 -0
  116. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/__init__.py +0 -0
  117. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/chinese.py +0 -0
  118. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/dutch.py +0 -0
  119. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/french.py +0 -0
  120. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/italian.py +0 -0
  121. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/japanese.py +0 -0
  122. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/korean.py +0 -0
  123. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/master_dict.py +0 -0
  124. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/portuguese.py +0 -0
  125. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/russian.py +0 -0
  126. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/spanish.py +0 -0
  127. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/translate/translator.py +0 -0
  128. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/__init__.py +0 -0
  129. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp.py +0 -0
  130. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  131. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  132. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  133. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  134. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  135. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  136. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/dprocess.py +0 -0
  137. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/options.py +0 -0
  138. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/patcher.py +0 -0
  139. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/reactor.py +0 -0
  140. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/undetected/webelement.py +0 -0
  141. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/__init__.py +0 -0
  142. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  143. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  144. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  145. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  146. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  147. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  148. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  149. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  150. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  151. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  152. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  153. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  154. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  155. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase.egg-info/SOURCES.txt +0 -0
  156. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase.egg-info/dependency_links.txt +0 -0
  157. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase.egg-info/entry_points.txt +0 -0
  158. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase.egg-info/requires.txt +0 -0
  159. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/seleniumbase.egg-info/top_level.txt +0 -0
  160. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/setup.cfg +0 -0
  161. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/setup.py +0 -0
  162. {seleniumbase-4.47.6 → seleniumbase-4.47.7}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.47.6
3
+ Version: 4.47.7
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
@@ -293,6 +293,7 @@ from seleniumbase import SB
293
293
  with SB(uc=True, test=True) as sb:
294
294
  url = "https://google.com/ncr"
295
295
  sb.activate_cdp_mode(url)
296
+ sb.click_if_visible('button:contains("Accept all")')
296
297
  sb.type('[name="q"]', "SeleniumBase GitHub page")
297
298
  sb.click('[value="Google Search"]')
298
299
  sb.sleep(4) # The "AI Overview" sometimes loads
@@ -93,6 +93,7 @@ from seleniumbase import SB
93
93
  with SB(uc=True, test=True) as sb:
94
94
  url = "https://google.com/ncr"
95
95
  sb.activate_cdp_mode(url)
96
+ sb.click_if_visible('button:contains("Accept all")')
96
97
  sb.type('[name="q"]', "SeleniumBase GitHub page")
97
98
  sb.click('[value="Google Search"]')
98
99
  sb.sleep(4) # The "AI Overview" sometimes loads
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.47.6"
2
+ __version__ = "4.47.7"
@@ -712,6 +712,9 @@ def main():
712
712
  data.append(" if not self.undetectable:")
713
713
  data.append(" self.get_new_driver(undetectable=True)")
714
714
  data.append(' self.open("https://google.com/ncr")')
715
+ data.append(
716
+ " sb.click_if_visible('button:contains(\"Accept all\")')"
717
+ )
715
718
  data.append(' self.assert_title_contains("Google")')
716
719
  data.append(" self.save_screenshot_to_logs()")
717
720
  data.append(' self.type(HomePage.search_box, "github.com")')
@@ -942,6 +942,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
942
942
  cdp.assert_not_equal = CDPM.assert_not_equal
943
943
  cdp.assert_in = CDPM.assert_in
944
944
  cdp.assert_not_in = CDPM.assert_not_in
945
+ cdp.js_scroll_into_view = CDPM.js_scroll_into_view
945
946
  cdp.scroll_into_view = CDPM.scroll_into_view
946
947
  cdp.scroll_to_y = CDPM.scroll_to_y
947
948
  cdp.scroll_by_y = CDPM.scroll_by_y
@@ -66,6 +66,7 @@ class CDPMethods():
66
66
  lambda *args, **kwargs: self.__gui_click(element, *args, **kwargs)
67
67
  )
68
68
  element.highlight_overlay = lambda: self.__highlight_overlay(element)
69
+ element.is_in_viewport = lambda: self.__is_in_viewport(element)
69
70
  element.mouse_click = lambda: self.__mouse_click(element)
70
71
  element.click_with_offset = (
71
72
  lambda *args, **kwargs: self.__mouse_click_with_offset_async(
@@ -543,6 +544,11 @@ class CDPMethods():
543
544
  self.loop.run_until_complete(element.highlight_overlay_async())
544
545
  )
545
546
 
547
+ def __is_in_viewport(self, element):
548
+ return (
549
+ self.loop.run_until_complete(element.is_in_viewport_async())
550
+ )
551
+
546
552
  def __mouse_click(self, element):
547
553
  result = (
548
554
  self.loop.run_until_complete(element.mouse_click_async())
@@ -800,9 +806,9 @@ class CDPMethods():
800
806
  timeout = settings.SMALL_TIMEOUT
801
807
  self.__slow_mode_pause_if_set()
802
808
  element = self.find_element(selector, timeout=timeout)
803
- if scroll:
804
- element.scroll_into_view()
805
809
  tag_name = element.tag_name
810
+ current_url = self.get_current_url()
811
+
806
812
  if tag_name:
807
813
  tag_name = tag_name.lower().strip()
808
814
  if (
@@ -810,12 +816,24 @@ class CDPMethods():
810
816
  "a", "button", "canvas", "div", "input", "li", "span", "label"
811
817
  ]
812
818
  and "contains(" not in selector
819
+ and "://google" not in current_url
820
+ and "://www.google" not in current_url
813
821
  ):
822
+ if scroll:
823
+ element.scroll_into_view()
814
824
  try:
815
825
  element.mouse_click() # Simulated click (NOT PyAutoGUI)
816
826
  except Exception:
817
827
  element.click() # Standard CDP click
818
828
  else:
829
+ if scroll:
830
+ if "contains(" in selector:
831
+ element.scroll_into_view()
832
+ else:
833
+ try:
834
+ self.js_scroll_into_view(selector)
835
+ except Exception:
836
+ element.scroll_into_view()
819
837
  element.click() # Standard CDP click
820
838
  self.__slow_mode_pause_if_set()
821
839
  self.loop.run_until_complete(self.page.wait(0.2))
@@ -3109,6 +3127,17 @@ class CDPMethods():
3109
3127
  if first in second:
3110
3128
  raise AssertionError("%s is in %s" % (first, second))
3111
3129
 
3130
+ def js_scroll_into_view(self, selector):
3131
+ css_selector = self.__convert_to_css_if_xpath(selector)
3132
+ css_selector = re.escape(css_selector) # Add "\\" to special chars
3133
+ css_selector = js_utils.escape_quotes_if_needed(css_selector)
3134
+ js_code = (
3135
+ "document.querySelector('%s')?.scrollIntoView();"
3136
+ % css_selector
3137
+ )
3138
+ with suppress(Exception):
3139
+ self.loop.run_until_complete(self.page.evaluate(js_code))
3140
+
3112
3141
  def scroll_into_view(self, selector):
3113
3142
  self.find_element(selector).scroll_into_view()
3114
3143
  self.loop.run_until_complete(self.page.wait(0.1))
@@ -13,6 +13,7 @@ from seleniumbase import SB
13
13
  with SB(uc=True, test=True) as sb:
14
14
  url = "https://google.com/ncr"
15
15
  sb.activate_cdp_mode(url)
16
+ sb.click_if_visible('button:contains("Accept all")')
16
17
  sb.type('[name="q"]', "SeleniumBase GitHub page")
17
18
  sb.click('[value="Google Search"]')
18
19
  sb.sleep(2)
@@ -148,6 +149,7 @@ def SB(
148
149
  with SB(uc=True, test=True) as sb:
149
150
  url = "https://google.com/ncr"
150
151
  sb.activate_cdp_mode(url)
152
+ sb.click_if_visible('button:contains("Accept all")')
151
153
  sb.type('[name="q"]', "SeleniumBase GitHub page")
152
154
  sb.click('[value="Google Search"]')
153
155
  sb.sleep(2)
@@ -467,8 +467,8 @@ class Element:
467
467
  raise Exception("Could not find position for %s " % self)
468
468
  pos = Position(quads[0])
469
469
  if abs:
470
- scroll_y = (await self.tab.evaluate("window.scrollY")).value
471
- scroll_x = (await self.tab.evaluate("window.scrollX")).value
470
+ scroll_y = (await self.tab.evaluate("window.scrollY"))
471
+ scroll_x = (await self.tab.evaluate("window.scrollX"))
472
472
  abs_x = pos.left + scroll_x + (pos.width / 2)
473
473
  abs_y = pos.top + scroll_y + (pos.height / 2)
474
474
  pos.abs_x = abs_x
@@ -717,6 +717,31 @@ class Element:
717
717
  )
718
718
  )
719
719
 
720
+ async def is_in_viewport_async(self):
721
+ try:
722
+ layout = await self.tab.send(
723
+ cdp.page.get_layout_metrics()
724
+ )
725
+ viewport = layout[4]
726
+ v_left = viewport.page_x
727
+ v_top = viewport.page_y
728
+ v_right = v_left + viewport.client_width
729
+ v_bottom = v_top + viewport.client_height
730
+ box = await self.tab.send(
731
+ cdp.dom.get_box_model(backend_node_id=self.backend_node_id)
732
+ )
733
+ quad = box.content
734
+ e_left = min(quad[0], quad[2], quad[4], quad[6])
735
+ e_top = min(quad[1], quad[3], quad[5], quad[7])
736
+ e_right = max(quad[0], quad[2], quad[4], quad[6])
737
+ e_bottom = max(quad[1], quad[3], quad[5], quad[7])
738
+ return (
739
+ e_left >= v_left and e_right <= v_right
740
+ and e_top >= v_top and e_bottom <= v_bottom
741
+ )
742
+ except Exception:
743
+ return False
744
+
720
745
  async def scroll_into_view_async(self):
721
746
  """Scrolls element into view."""
722
747
  try:
@@ -226,7 +226,6 @@ class Tab(Connection):
226
226
  except (Exception, TypeError):
227
227
  pass
228
228
  while not item:
229
- await self
230
229
  item = await self.find_element_by_text(
231
230
  text, best_match, return_enclosing_element
232
231
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.47.6
3
+ Version: 4.47.7
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
@@ -293,6 +293,7 @@ from seleniumbase import SB
293
293
  with SB(uc=True, test=True) as sb:
294
294
  url = "https://google.com/ncr"
295
295
  sb.activate_cdp_mode(url)
296
+ sb.click_if_visible('button:contains("Accept all")')
296
297
  sb.type('[name="q"]', "SeleniumBase GitHub page")
297
298
  sb.click('[value="Google Search"]')
298
299
  sb.sleep(4) # The "AI Overview" sometimes loads
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes