seleniumbase 4.44.2__tar.gz → 4.44.4__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 (161) hide show
  1. {seleniumbase-4.44.2/seleniumbase.egg-info → seleniumbase-4.44.4}/PKG-INFO +4 -3
  2. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/requirements.txt +3 -2
  3. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/__version__.py +1 -1
  4. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/browser_launcher.py +57 -28
  5. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/sb_cdp.py +8 -1
  6. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/base_case.py +27 -24
  7. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp.py +1 -12
  8. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/browser.py +4 -6
  9. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/config.py +13 -4
  10. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/element.py +4 -1
  11. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/tab.py +4 -1
  12. {seleniumbase-4.44.2 → seleniumbase-4.44.4/seleniumbase.egg-info}/PKG-INFO +4 -3
  13. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/requires.txt +3 -2
  14. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/setup.py +3 -2
  15. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/.gitignore +0 -0
  16. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/LICENSE +0 -0
  17. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/MANIFEST.in +0 -0
  18. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/README.md +0 -0
  19. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/install.sh +0 -0
  20. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/pyproject.toml +0 -0
  21. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/pytest.ini +0 -0
  22. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/sbase/__init__.py +0 -0
  23. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/sbase/__main__.py +0 -0
  24. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/sbase/steps.py +0 -0
  25. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/__init__.py +0 -0
  26. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/__main__.py +0 -0
  27. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/behave/__init__.py +0 -0
  28. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/behave/behave_helper.py +0 -0
  29. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/behave/behave_sb.py +0 -0
  30. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/behave/steps.py +0 -0
  31. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/__init__.py +0 -0
  32. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/decorators.py +0 -0
  33. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/encryption.py +0 -0
  34. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/exceptions.py +0 -0
  35. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/obfuscate.py +0 -0
  36. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/unobfuscate.py +0 -0
  37. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/config/__init__.py +0 -0
  38. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/config/ad_block_list.py +0 -0
  39. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/config/proxy_list.py +0 -0
  40. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/config/settings.py +0 -0
  41. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/__init__.py +0 -0
  42. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/logo_helper.py +0 -0
  43. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/rich_helper.py +0 -0
  44. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/run.py +0 -0
  45. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  46. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  47. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_commander.py +0 -0
  48. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_install.py +0 -0
  49. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  50. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  51. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  52. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  53. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  54. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  55. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_print.py +0 -0
  56. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  57. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/__init__.py +0 -0
  58. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/application_manager.py +0 -0
  59. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/capabilities_parser.py +0 -0
  60. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/colored_traceback.py +0 -0
  61. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/create_db_tables.sql +0 -0
  62. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/detect_b_ver.py +0 -0
  63. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/download_helper.py +0 -0
  64. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/encoded_images.py +0 -0
  65. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/jqc_helper.py +0 -0
  66. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/log_helper.py +0 -0
  67. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/mysql.py +0 -0
  68. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/proxy_helper.py +0 -0
  69. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/recorder_helper.py +0 -0
  70. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/report_helper.py +0 -0
  71. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/s3_manager.py +0 -0
  72. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/sb_driver.py +0 -0
  73. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/session_helper.py +0 -0
  74. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/settings_parser.py +0 -0
  75. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/style_sheet.py +0 -0
  76. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/testcase_manager.py +0 -0
  77. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/tour_helper.py +0 -0
  78. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/visual_helper.py +0 -0
  79. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/__init__.py +0 -0
  80. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  81. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  82. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  83. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  84. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  85. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  86. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/__init__.py +0 -0
  87. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/ad_block.zip +0 -0
  88. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/disable_csp.zip +0 -0
  89. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/recorder.zip +0 -0
  90. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/sbase_ext.zip +0 -0
  91. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/__init__.py +0 -0
  92. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/constants.py +0 -0
  93. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  94. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/errors.py +0 -0
  95. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/js_utils.py +0 -0
  96. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/page_actions.py +0 -0
  97. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/page_utils.py +0 -0
  98. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/shared_utils.py +0 -0
  99. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/unittest_helper.py +0 -0
  100. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/words.py +0 -0
  101. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  102. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/js_code/__init__.py +0 -0
  103. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/js_code/active_css_js.py +0 -0
  104. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/js_code/live_js.py +0 -0
  105. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/js_code/recorder_js.py +0 -0
  106. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/masterqa/__init__.py +0 -0
  107. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/masterqa/master_qa.py +0 -0
  108. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/__init__.py +0 -0
  109. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/base_plugin.py +0 -0
  110. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/basic_test_info.py +0 -0
  111. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  112. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/driver_manager.py +0 -0
  113. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/page_source.py +0 -0
  114. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/pytest_plugin.py +0 -0
  115. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  116. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/sb_manager.py +0 -0
  117. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/screen_shots.py +0 -0
  118. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/selenium_plugin.py +0 -0
  119. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/resources/__init__.py +0 -0
  120. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/__init__.py +0 -0
  121. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/chinese.py +0 -0
  122. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/dutch.py +0 -0
  123. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/french.py +0 -0
  124. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/italian.py +0 -0
  125. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/japanese.py +0 -0
  126. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/korean.py +0 -0
  127. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/master_dict.py +0 -0
  128. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/portuguese.py +0 -0
  129. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/russian.py +0 -0
  130. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/spanish.py +0 -0
  131. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/translator.py +0 -0
  132. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/__init__.py +0 -0
  133. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  134. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  135. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  137. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/dprocess.py +0 -0
  138. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/options.py +0 -0
  139. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/patcher.py +0 -0
  140. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/reactor.py +0 -0
  141. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/webelement.py +0 -0
  142. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/__init__.py +0 -0
  143. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  144. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  145. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  146. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  147. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  148. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  149. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  150. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  151. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  152. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  153. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  154. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  155. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  156. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/SOURCES.txt +0 -0
  157. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/dependency_links.txt +0 -0
  158. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/entry_points.txt +0 -0
  159. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/top_level.txt +0 -0
  160. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/setup.cfg +0 -0
  161. {seleniumbase-4.44.2 → seleniumbase-4.44.4}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.44.2
3
+ Version: 4.44.4
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
@@ -75,7 +75,7 @@ Requires-Dist: filelock~=3.16.1; python_version < "3.9"
75
75
  Requires-Dist: filelock~=3.19.1; python_version >= "3.9" and python_version < "3.10"
76
76
  Requires-Dist: filelock>=3.20.0; python_version >= "3.10"
77
77
  Requires-Dist: fasteners>=0.20
78
- Requires-Dist: mycdp>=1.2.1
78
+ Requires-Dist: mycdp>=1.3.0
79
79
  Requires-Dist: pynose>=1.5.5
80
80
  Requires-Dist: platformdirs~=4.3.6; python_version < "3.9"
81
81
  Requires-Dist: platformdirs~=4.4.0; python_version >= "3.9" and python_version < "3.10"
@@ -106,7 +106,8 @@ Requires-Dist: sniffio==1.3.1
106
106
  Requires-Dist: h11==0.16.0
107
107
  Requires-Dist: outcome==1.3.0.post0
108
108
  Requires-Dist: trio==0.27.0; python_version < "3.9"
109
- Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9"
109
+ Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9" and python_version < "3.10"
110
+ Requires-Dist: trio<1,>=0.32.0; python_version >= "3.10"
110
111
  Requires-Dist: trio-websocket~=0.12.2
111
112
  Requires-Dist: wsproto==1.2.0
112
113
  Requires-Dist: websocket-client~=1.8.0; python_version < "3.9"
@@ -14,7 +14,7 @@ filelock~=3.16.1;python_version<"3.9"
14
14
  filelock~=3.19.1;python_version>="3.9" and python_version<"3.10"
15
15
  filelock>=3.20.0;python_version>="3.10"
16
16
  fasteners>=0.20
17
- mycdp>=1.2.1
17
+ mycdp>=1.3.0
18
18
  pynose>=1.5.5
19
19
  platformdirs~=4.3.6;python_version<"3.9"
20
20
  platformdirs~=4.4.0;python_version>="3.9" and python_version<"3.10"
@@ -45,7 +45,8 @@ sniffio==1.3.1
45
45
  h11==0.16.0
46
46
  outcome==1.3.0.post0
47
47
  trio==0.27.0;python_version<"3.9"
48
- trio>=0.31.0,<1;python_version>="3.9"
48
+ trio>=0.31.0,<1;python_version>="3.9" and python_version<"3.10"
49
+ trio>=0.32.0,<1;python_version>="3.10"
49
50
  trio-websocket~=0.12.2
50
51
  wsproto==1.2.0
51
52
  websocket-client~=1.8.0;python_version<"3.9"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.44.2"
2
+ __version__ = "4.44.4"
@@ -293,7 +293,17 @@ def extend_driver(
293
293
  )
294
294
  if hasattr(driver, "proxy"):
295
295
  driver.set_wire_proxy = DM.set_wire_proxy
296
+ completed_loads = []
297
+ for ext_dir in sb_config._ext_dirs:
298
+ if ext_dir not in completed_loads:
299
+ completed_loads.append(ext_dir)
300
+ if not use_uc and os.path.exists(os.path.realpath(ext_dir)):
301
+ with suppress(Exception):
302
+ driver.webextension.install(os.path.realpath(ext_dir))
296
303
  if proxy_auth:
304
+ if not use_uc and os.path.exists(proxy_helper.PROXY_DIR_PATH):
305
+ with suppress(Exception):
306
+ driver.webextension.install(proxy_helper.PROXY_DIR_PATH)
297
307
  # Proxy needs a moment to load in Manifest V3
298
308
  if use_uc:
299
309
  time.sleep(0.14)
@@ -828,6 +838,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
828
838
  cdp.get_element_position = CDPM.get_element_position
829
839
  cdp.get_gui_element_rect = CDPM.get_gui_element_rect
830
840
  cdp.get_gui_element_center = CDPM.get_gui_element_center
841
+ cdp.get_html = CDPM.get_html
831
842
  cdp.get_page_source = CDPM.get_page_source
832
843
  cdp.get_user_agent = CDPM.get_user_agent
833
844
  cdp.get_cookie_string = CDPM.get_cookie_string
@@ -924,6 +935,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
924
935
  cdp.core = core_items
925
936
  cdp.loop = cdp.get_event_loop()
926
937
  driver.cdp = cdp
938
+ driver.solve_captcha = CDPM.solve_captcha
927
939
  driver._is_using_cdp = True
928
940
 
929
941
 
@@ -2087,6 +2099,7 @@ def _add_chrome_proxy_extension(
2087
2099
  """Implementation of https://stackoverflow.com/a/35293284/7058266
2088
2100
  for https://stackoverflow.com/q/12848327/7058266
2089
2101
  (Run Selenium on a proxy server that requires authentication.)"""
2102
+ zip_it = False
2090
2103
  args = " ".join(sys.argv)
2091
2104
  bypass_list = proxy_bypass_list
2092
2105
  if (
@@ -2466,14 +2479,28 @@ def _set_chrome_options(
2466
2479
  # Can be a comma-separated list of .ZIP or .CRX files
2467
2480
  extension_zip_list = extension_zip.split(",")
2468
2481
  for extension_zip_item in extension_zip_list:
2469
- abs_path = os.path.abspath(extension_zip_item)
2470
- chrome_options.add_extension(abs_path)
2482
+ abs_path = os.path.realpath(extension_zip_item)
2483
+ if os.path.exists(abs_path):
2484
+ try:
2485
+ abs_path_dir = os.path.join(
2486
+ DOWNLOADS_FOLDER, abs_path.split(".")[0]
2487
+ )
2488
+ _unzip_to_new_folder(abs_path, abs_path_dir)
2489
+ chrome_options = add_chrome_ext_dir(
2490
+ chrome_options, abs_path_dir
2491
+ )
2492
+ sb_config._ext_dirs.append(abs_path_dir)
2493
+ except Exception:
2494
+ with suppress(Exception):
2495
+ chrome_options.add_extension(abs_path)
2471
2496
  if extension_dir:
2472
2497
  # load-extension input can be a comma-separated list
2473
2498
  abs_path = (
2474
- ",".join(os.path.abspath(p) for p in extension_dir.split(","))
2499
+ ",".join(os.path.realpath(p) for p in extension_dir.split(","))
2475
2500
  )
2476
2501
  chrome_options = add_chrome_ext_dir(chrome_options, abs_path)
2502
+ for p in extension_dir.split(","):
2503
+ sb_config._ext_dirs.append(os.path.realpath(p))
2477
2504
  if (
2478
2505
  page_load_strategy
2479
2506
  and page_load_strategy.lower() in ["eager", "none"]
@@ -2508,37 +2535,32 @@ def _set_chrome_options(
2508
2535
  if (settings.DISABLE_CSP_ON_CHROME or disable_csp) and not headless:
2509
2536
  # Headless Chrome does not support extensions, which are required
2510
2537
  # for disabling the Content Security Policy on Chrome.
2511
- if is_using_uc(undetectable, browser_name):
2512
- disable_csp_zip = DISABLE_CSP_ZIP_PATH
2513
- disable_csp_dir = os.path.join(DOWNLOADS_FOLDER, "disable_csp")
2514
- _unzip_to_new_folder(disable_csp_zip, disable_csp_dir)
2515
- chrome_options = add_chrome_ext_dir(
2516
- chrome_options, disable_csp_dir
2517
- )
2518
- else:
2519
- chrome_options = _add_chrome_disable_csp_extension(chrome_options)
2538
+ disable_csp_zip = DISABLE_CSP_ZIP_PATH
2539
+ disable_csp_dir = os.path.join(DOWNLOADS_FOLDER, "disable_csp")
2540
+ _unzip_to_new_folder(disable_csp_zip, disable_csp_dir)
2541
+ chrome_options = add_chrome_ext_dir(
2542
+ chrome_options, disable_csp_dir
2543
+ )
2544
+ sb_config._ext_dirs.append(disable_csp_dir)
2520
2545
  if ad_block_on and not headless:
2521
2546
  # Headless Chrome does not support extensions.
2522
- if is_using_uc(undetectable, browser_name):
2523
- ad_block_zip = AD_BLOCK_ZIP_PATH
2524
- ad_block_dir = os.path.join(DOWNLOADS_FOLDER, "ad_block")
2525
- _unzip_to_new_folder(ad_block_zip, ad_block_dir)
2526
- chrome_options = add_chrome_ext_dir(chrome_options, ad_block_dir)
2527
- else:
2528
- chrome_options = _add_chrome_ad_block_extension(chrome_options)
2547
+ ad_block_zip = AD_BLOCK_ZIP_PATH
2548
+ ad_block_dir = os.path.join(DOWNLOADS_FOLDER, "ad_block")
2549
+ _unzip_to_new_folder(ad_block_zip, ad_block_dir)
2550
+ chrome_options = add_chrome_ext_dir(chrome_options, ad_block_dir)
2551
+ sb_config._ext_dirs.append(ad_block_dir)
2529
2552
  if recorder_ext and not headless:
2530
- if is_using_uc(undetectable, browser_name):
2531
- recorder_zip = RECORDER_ZIP_PATH
2532
- recorder_dir = os.path.join(DOWNLOADS_FOLDER, "recorder")
2533
- _unzip_to_new_folder(recorder_zip, recorder_dir)
2534
- chrome_options = add_chrome_ext_dir(chrome_options, recorder_dir)
2535
- else:
2536
- chrome_options = _add_chrome_recorder_extension(chrome_options)
2553
+ recorder_zip = RECORDER_ZIP_PATH
2554
+ recorder_dir = os.path.join(DOWNLOADS_FOLDER, "recorder")
2555
+ _unzip_to_new_folder(recorder_zip, recorder_dir)
2556
+ chrome_options = add_chrome_ext_dir(chrome_options, recorder_dir)
2557
+ sb_config._ext_dirs.append(recorder_dir)
2537
2558
  if chromium_arg and "sbase" in chromium_arg:
2538
2559
  sbase_ext_zip = SBASE_EXT_ZIP_PATH
2539
2560
  sbase_ext_dir = os.path.join(DOWNLOADS_FOLDER, "sbase_ext")
2540
2561
  _unzip_to_new_folder(sbase_ext_zip, sbase_ext_dir)
2541
2562
  chrome_options = add_chrome_ext_dir(chrome_options, sbase_ext_dir)
2563
+ sb_config._ext_dirs.append(sbase_ext_dir)
2542
2564
  if proxy_string:
2543
2565
  if proxy_auth:
2544
2566
  zip_it = True
@@ -2722,8 +2744,14 @@ def _set_chrome_options(
2722
2744
  included_disabled_features.append(item)
2723
2745
  d_f_string = ",".join(included_disabled_features)
2724
2746
  chrome_options.add_argument("--disable-features=%s" % d_f_string)
2747
+ chrome_options.add_argument("--enable-unsafe-extension-debugging")
2725
2748
  if proxy_auth:
2726
2749
  chrome_options.add_argument("--test-type")
2750
+ if proxy_auth or sb_config._ext_dirs:
2751
+ if not is_using_uc(undetectable, browser_name):
2752
+ chrome_options.add_argument("--remote-debugging-pipe")
2753
+ chrome_options.enable_webextensions = True
2754
+ chrome_options.enable_bidi = True
2727
2755
  if (
2728
2756
  is_using_uc(undetectable, browser_name)
2729
2757
  and (
@@ -2988,6 +3016,7 @@ def get_driver(
2988
3016
  device_pixel_ratio=None,
2989
3017
  browser=None, # A duplicate of browser_name to avoid confusion
2990
3018
  ):
3019
+ sb_config._ext_dirs = []
2991
3020
  driver_dir = DRIVER_DIR
2992
3021
  if (
2993
3022
  hasattr(sb_config, "binary_location")
@@ -4552,12 +4581,12 @@ def get_local_driver(
4552
4581
  # Can be a comma-separated list of .ZIP or .CRX files
4553
4582
  extension_zip_list = extension_zip.split(",")
4554
4583
  for extension_zip_item in extension_zip_list:
4555
- abs_path = os.path.abspath(extension_zip_item)
4584
+ abs_path = os.path.realpath(extension_zip_item)
4556
4585
  edge_options.add_extension(abs_path)
4557
4586
  if extension_dir:
4558
4587
  # load-extension input can be a comma-separated list
4559
4588
  abs_path = (
4560
- ",".join(os.path.abspath(p) for p in extension_dir.split(","))
4589
+ ",".join(os.path.realpath(p) for p in extension_dir.split(","))
4561
4590
  )
4562
4591
  edge_options = add_chrome_ext_dir(edge_options, abs_path)
4563
4592
  edge_options.add_argument("--disable-infobars")
@@ -1185,7 +1185,14 @@ class CDPMethods():
1185
1185
  self.page.evaluate("window.location.origin")
1186
1186
  )
1187
1187
 
1188
- def get_page_source(self):
1188
+ def get_html(self, include_shadow_dom=True):
1189
+ return self.get_page_source(
1190
+ include_shadow_dom=include_shadow_dom
1191
+ )
1192
+
1193
+ def get_page_source(self, include_shadow_dom=True):
1194
+ if include_shadow_dom:
1195
+ return self.find_element("html").get_html()
1189
1196
  try:
1190
1197
  source = self.loop.run_until_complete(
1191
1198
  self.page.evaluate("document.documentElement.outerHTML")
@@ -1293,8 +1293,11 @@ class BaseCase(unittest.TestCase):
1293
1293
  self.__check_scope()
1294
1294
  return self.execute_script("return window.location.origin;")
1295
1295
 
1296
- def get_page_source(self):
1297
- if self.__is_cdp_swap_needed():
1296
+ def get_html(self, *args, **kwargs):
1297
+ return self.get_page_source(*args, **kwargs)
1298
+
1299
+ def get_page_source(self, *args, **kwargs):
1300
+ if self.__is_cdp_swap_needed(*args, **kwargs):
1298
1301
  return self.cdp.get_page_source()
1299
1302
  self.wait_for_ready_state_complete()
1300
1303
  if self.__needs_minimum_wait:
@@ -4694,7 +4697,7 @@ class BaseCase(unittest.TestCase):
4694
4697
  if not os.path.exists(file_path):
4695
4698
  os.makedirs(file_path)
4696
4699
  cookies_file_path = os.path.join(file_path, name)
4697
- cookies_file = open(cookies_file_path, "w+", encoding="utf-8")
4700
+ cookies_file = open(cookies_file_path, mode="w+", encoding="utf-8")
4698
4701
  cookies_file.writelines(json_cookies)
4699
4702
  cookies_file.close()
4700
4703
 
@@ -5751,7 +5754,7 @@ class BaseCase(unittest.TestCase):
5751
5754
  extra_file_name = "__init__.py"
5752
5755
  extra_file_path = os.path.join(recordings_folder, extra_file_name)
5753
5756
  if not os.path.exists(extra_file_path):
5754
- out_file = open(extra_file_path, "w+", "utf-8")
5757
+ out_file = open(extra_file_path, mode="w+", encoding="utf-8")
5755
5758
  out_file.writelines("\r\n".join(data))
5756
5759
  out_file.close()
5757
5760
  sys.stdout.write("\nCreated recordings%s__init__.py" % os.sep)
@@ -5799,7 +5802,7 @@ class BaseCase(unittest.TestCase):
5799
5802
  extra_file_name = "pytest.ini"
5800
5803
  extra_file_path = os.path.join(recordings_folder, extra_file_name)
5801
5804
  if not os.path.exists(extra_file_path):
5802
- out_file = open(extra_file_path, "w+", "utf-8")
5805
+ out_file = open(extra_file_path, mode="w+", encoding="utf-8")
5803
5806
  out_file.writelines("\r\n".join(data))
5804
5807
  out_file.close()
5805
5808
  sys.stdout.write("\nCreated recordings%spytest.ini" % os.sep)
@@ -5820,7 +5823,7 @@ class BaseCase(unittest.TestCase):
5820
5823
  extra_file_name = "setup.cfg"
5821
5824
  extra_file_path = os.path.join(recordings_folder, extra_file_name)
5822
5825
  if not os.path.exists(extra_file_path):
5823
- out_file = open(extra_file_path, "w+", "utf-8")
5826
+ out_file = open(extra_file_path, mode="w+", encoding="utf-8")
5824
5827
  out_file.writelines("\r\n".join(data))
5825
5828
  out_file.close()
5826
5829
  sys.stdout.write("\nCreated recordings%ssetup.cfg" % os.sep)
@@ -5838,7 +5841,7 @@ class BaseCase(unittest.TestCase):
5838
5841
  elif context_filename:
5839
5842
  file_name = context_filename
5840
5843
  file_path = os.path.join(recordings_folder, file_name)
5841
- out_file = open(file_path, "w+", "utf-8")
5844
+ out_file = open(file_path, mode="w+", encoding="utf-8")
5842
5845
  out_file.writelines("\r\n".join(data))
5843
5846
  out_file.close()
5844
5847
  rec_message = ">>> RECORDING SAVED as: "
@@ -5940,7 +5943,7 @@ class BaseCase(unittest.TestCase):
5940
5943
  file_name = sb_config.behave_scenario.filename.replace(".", "_")
5941
5944
  file_name = file_name.split("/")[-1].split("\\")[-1] + "_rec.feature"
5942
5945
  file_path = os.path.join(features_folder, file_name)
5943
- out_file = open(file_path, "w+", "utf-8")
5946
+ out_file = open(file_path, mode="w+", encoding="utf-8")
5944
5947
  out_file.writelines("\r\n".join(data))
5945
5948
  out_file.close()
5946
5949
 
@@ -5978,7 +5981,7 @@ class BaseCase(unittest.TestCase):
5978
5981
  file_name = "__init__.py"
5979
5982
  file_path = os.path.join(features_folder, file_name)
5980
5983
  if not os.path.exists(file_path):
5981
- out_file = open(file_path, "w+", "utf-8")
5984
+ out_file = open(file_path, mode="w+", encoding="utf-8")
5982
5985
  out_file.writelines("\r\n".join(data))
5983
5986
  out_file.close()
5984
5987
  print("Created recordings/features/__init__.py")
@@ -5991,7 +5994,7 @@ class BaseCase(unittest.TestCase):
5991
5994
  file_name = "behave.ini"
5992
5995
  file_path = os.path.join(features_folder, file_name)
5993
5996
  if not os.path.exists(file_path):
5994
- out_file = open(file_path, "w+", "utf-8")
5997
+ out_file = open(file_path, mode="w+", encoding="utf-8")
5995
5998
  out_file.writelines("\r\n".join(data))
5996
5999
  out_file.close()
5997
6000
  print("Created recordings/features/behave.ini")
@@ -6030,7 +6033,7 @@ class BaseCase(unittest.TestCase):
6030
6033
  file_name = "environment.py"
6031
6034
  file_path = os.path.join(features_folder, file_name)
6032
6035
  if not os.path.exists(file_path):
6033
- out_file = open(file_path, "w+", "utf-8")
6036
+ out_file = open(file_path, mode="w+", encoding="utf-8")
6034
6037
  out_file.writelines("\r\n".join(data))
6035
6038
  out_file.close()
6036
6039
  print("Created recordings/features/environment.py")
@@ -6040,7 +6043,7 @@ class BaseCase(unittest.TestCase):
6040
6043
  file_name = "__init__.py"
6041
6044
  file_path = os.path.join(steps_folder, file_name)
6042
6045
  if not os.path.exists(file_path):
6043
- out_file = open(file_path, "w+", "utf-8")
6046
+ out_file = open(file_path, mode="w+", encoding="utf-8")
6044
6047
  out_file.writelines("\r\n".join(data))
6045
6048
  out_file.close()
6046
6049
  print("Created recordings/features/steps/__init__.py")
@@ -6051,7 +6054,7 @@ class BaseCase(unittest.TestCase):
6051
6054
  file_name = "imported.py"
6052
6055
  file_path = os.path.join(steps_folder, file_name)
6053
6056
  if not os.path.exists(file_path):
6054
- out_file = open(file_path, "w+", "utf-8")
6057
+ out_file = open(file_path, mode="w+", encoding="utf-8")
6055
6058
  out_file.writelines("\r\n".join(data))
6056
6059
  out_file.close()
6057
6060
  print("Created recordings/features/steps/imported.py")
@@ -11120,7 +11123,7 @@ class BaseCase(unittest.TestCase):
11120
11123
  return # Skip the rest when deferred visual asserts are used
11121
11124
  the_html = visual_helper.get_sbs_html()
11122
11125
  file_path = os.path.join(test_logpath, constants.SideBySide.HTML_FILE)
11123
- out_file = open(file_path, "w+", encoding="utf-8")
11126
+ out_file = open(file_path, mode="w+", encoding="utf-8")
11124
11127
  out_file.writelines(the_html)
11125
11128
  out_file.close()
11126
11129
 
@@ -11280,16 +11283,16 @@ class BaseCase(unittest.TestCase):
11280
11283
  self.save_screenshot(
11281
11284
  baseline_png, visual_baseline_path, selector="body"
11282
11285
  )
11283
- out_file = open(page_url_file, "w+", encoding="utf-8")
11286
+ out_file = open(page_url_file, mode="w+", encoding="utf-8")
11284
11287
  out_file.writelines(page_url)
11285
11288
  out_file.close()
11286
- out_file = open(level_1_file, "w+", encoding="utf-8")
11289
+ out_file = open(level_1_file, mode="w+", encoding="utf-8")
11287
11290
  out_file.writelines(json.dumps(level_1))
11288
11291
  out_file.close()
11289
- out_file = open(level_2_file, "w+", encoding="utf-8")
11292
+ out_file = open(level_2_file, mode="w+", encoding="utf-8")
11290
11293
  out_file.writelines(json.dumps(level_2))
11291
11294
  out_file.close()
11292
- out_file = open(level_3_file, "w+", encoding="utf-8")
11295
+ out_file = open(level_3_file, mode="w+", encoding="utf-8")
11293
11296
  out_file.writelines(json.dumps(level_3))
11294
11297
  out_file.close()
11295
11298
 
@@ -11428,7 +11431,7 @@ class BaseCase(unittest.TestCase):
11428
11431
  alpha_n_d_name = "".join([x if x.isalnum() else "_" for x in name])
11429
11432
  side_by_side_name = "side_by_side_%s.html" % alpha_n_d_name
11430
11433
  file_path = os.path.join(test_logpath, side_by_side_name)
11431
- out_file = open(file_path, "w+", encoding="utf-8")
11434
+ out_file = open(file_path, mode="w+", encoding="utf-8")
11432
11435
  out_file.writelines(the_html)
11433
11436
  out_file.close()
11434
11437
 
@@ -12120,7 +12123,7 @@ class BaseCase(unittest.TestCase):
12120
12123
  with suppress(Exception):
12121
12124
  os.makedirs(saved_presentations_folder)
12122
12125
  file_path = os.path.join(saved_presentations_folder, filename)
12123
- out_file = open(file_path, "w+", encoding="utf-8")
12126
+ out_file = open(file_path, mode="w+", encoding="utf-8")
12124
12127
  out_file.writelines(the_html)
12125
12128
  out_file.close()
12126
12129
  if self._output_file_saves:
@@ -12815,7 +12818,7 @@ class BaseCase(unittest.TestCase):
12815
12818
  with suppress(Exception):
12816
12819
  os.makedirs(saved_charts_folder)
12817
12820
  file_path = os.path.join(saved_charts_folder, filename)
12818
- out_file = open(file_path, "w+", encoding="utf-8")
12821
+ out_file = open(file_path, mode="w+", encoding="utf-8")
12819
12822
  out_file.writelines(the_html)
12820
12823
  out_file.close()
12821
12824
  if self._output_file_saves:
@@ -16378,7 +16381,7 @@ class BaseCase(unittest.TestCase):
16378
16381
  dash_pie = json.dumps(sb_config._saved_dashboard_pie)
16379
16382
  dash_pie_loc = constants.Dashboard.DASH_PIE
16380
16383
  pie_path = os.path.join(abs_path, dash_pie_loc)
16381
- pie_file = open(pie_path, "w+", encoding="utf-8")
16384
+ pie_file = open(pie_path, mode="w+", encoding="utf-8")
16382
16385
  pie_file.writelines(dash_pie)
16383
16386
  pie_file.close()
16384
16387
  DASH_PIE_PNG_1 = constants.Dashboard.get_dash_pie_1()
@@ -16538,7 +16541,7 @@ class BaseCase(unittest.TestCase):
16538
16541
  )
16539
16542
  abs_path = os.path.abspath(".")
16540
16543
  file_path = os.path.join(abs_path, "dashboard.html")
16541
- out_file = open(file_path, "w+", encoding="utf-8")
16544
+ out_file = open(file_path, mode="w+", encoding="utf-8")
16542
16545
  out_file.writelines(the_html)
16543
16546
  out_file.close()
16544
16547
  sb_config._dash_html = the_html
@@ -16551,7 +16554,7 @@ class BaseCase(unittest.TestCase):
16551
16554
  dash_json = json.dumps((_results, _display_id, _rt, _tlp, d_stats))
16552
16555
  dash_json_loc = constants.Dashboard.DASH_JSON
16553
16556
  dash_jsonpath = os.path.join(abs_path, dash_json_loc)
16554
- dash_json_file = open(dash_jsonpath, "w+", encoding="utf-8")
16557
+ dash_json_file = open(dash_jsonpath, mode="w+", encoding="utf-8")
16555
16558
  dash_json_file.writelines(dash_json)
16556
16559
  dash_json_file.close()
16557
16560
 
@@ -1,9 +1,7 @@
1
- import fasteners
2
1
  import json
3
2
  import logging
4
3
  import requests
5
- from seleniumbase.fixtures import constants
6
- from seleniumbase.fixtures import shared_utils
4
+ import websockets
7
5
 
8
6
  log = logging.getLogger(__name__)
9
7
 
@@ -107,15 +105,6 @@ class CDP:
107
105
  return resp.json()
108
106
 
109
107
  async def send(self, method, params):
110
- pip_find_lock = fasteners.InterProcessLock(
111
- constants.PipInstall.FINDLOCK
112
- )
113
- with pip_find_lock:
114
- try:
115
- import websockets
116
- except Exception:
117
- shared_utils.pip_install("websockets")
118
- import websockets
119
108
  self._reqid += 1
120
109
  async with websockets.connect(self.wsurl) as ws:
121
110
  await ws.send(
@@ -350,8 +350,7 @@ class Browser:
350
350
  if _cdp_geolocation:
351
351
  await connection.send(cdp.page.navigate("about:blank"))
352
352
  await connection.set_geolocation(_cdp_geolocation)
353
- # This part isn't needed now, but may be needed later
354
- """
353
+ # (The code below is for the Chrome 142 extension fix)
355
354
  if (
356
355
  hasattr(sb_config, "_cdp_proxy")
357
356
  and "@" in sb_config._cdp_proxy
@@ -363,7 +362,6 @@ class Browser:
363
362
  proxy_pass = username_and_password.split(":")[1]
364
363
  await connection.set_auth(proxy_user, proxy_pass, self.tabs[0])
365
364
  time.sleep(0.25)
366
- """
367
365
  if "auth" in kwargs and kwargs["auth"] and ":" in kwargs["auth"]:
368
366
  username_and_password = kwargs["auth"]
369
367
  proxy_user = username_and_password.split(":")[0]
@@ -375,12 +373,12 @@ class Browser:
375
373
  cdp.page.navigate(url)
376
374
  )
377
375
  if _cdp_recorder:
378
- pass # (The code below was for the Chrome 137 extension fix)
379
- '''from seleniumbase.js_code.recorder_js import recorder_js
376
+ # (The code below is for the Chrome 142 extension fix)
377
+ from seleniumbase.js_code.recorder_js import recorder_js
380
378
  recorder_code = (
381
379
  """window.onload = function() { %s };""" % recorder_js
382
380
  )
383
- await connection.send(cdp.runtime.evaluate(recorder_code))'''
381
+ await connection.send(cdp.runtime.evaluate(recorder_code))
384
382
  # Update the frame_id on the tab
385
383
  connection.frame_id = frame_id
386
384
  connection.browser = self
@@ -79,7 +79,8 @@ class Config:
79
79
  if not browser_args:
80
80
  browser_args = []
81
81
  if not user_data_dir:
82
- self._user_data_dir = temp_profile_dir()
82
+ self.user_data_dir = temp_profile_dir()
83
+ self._user_data_dir = self.user_data_dir
83
84
  self._custom_data_dir = False
84
85
  else:
85
86
  self.user_data_dir = user_data_dir
@@ -129,6 +130,7 @@ class Config:
129
130
  "--no-default-browser-check",
130
131
  "--homepage=about:blank",
131
132
  "--no-pings",
133
+ "--enable-unsafe-extension-debugging",
132
134
  "--wm-window-animations-disabled",
133
135
  "--animation-duration-scale=0",
134
136
  "--enable-privacy-sandbox-ads-apis",
@@ -315,10 +317,13 @@ def find_chrome_executable(return_all=False):
315
317
  for item in os.environ.get("PATH").split(os.pathsep):
316
318
  for subitem in (
317
319
  "google-chrome",
320
+ "google-chrome-stable",
321
+ "google-chrome-beta",
322
+ "google-chrome-dev",
323
+ "google-chrome-unstable",
324
+ "chrome",
318
325
  "chromium",
319
326
  "chromium-browser",
320
- "chrome",
321
- "google-chrome-stable",
322
327
  ):
323
328
  candidates.append(os.sep.join((item, subitem)))
324
329
  if "darwin" in sys.platform:
@@ -347,7 +352,11 @@ def find_chrome_executable(return_all=False):
347
352
  )
348
353
  rv = []
349
354
  for candidate in candidates:
350
- if os.path.exists(candidate) and os.access(candidate, os.X_OK):
355
+ if (
356
+ os.path.exists(candidate)
357
+ and os.access(candidate, os.R_OK)
358
+ and os.access(candidate, os.X_OK)
359
+ ):
351
360
  logger.debug("%s is a valid candidate... " % candidate)
352
361
  rv.append(candidate)
353
362
  else:
@@ -806,7 +806,10 @@ class Element:
806
806
 
807
807
  async def get_html_async(self):
808
808
  return await self._tab.send(
809
- cdp.dom.get_outer_html(backend_node_id=self.backend_node_id)
809
+ cdp.dom.get_outer_html(
810
+ backend_node_id=self.backend_node_id,
811
+ include_shadow_dom=True,
812
+ )
810
813
  )
811
814
 
812
815
  @property
@@ -899,7 +899,10 @@ class Tab(Connection):
899
899
  """Gets the current page source content (html)"""
900
900
  doc: cdp.dom.Node = await self.send(cdp.dom.get_document(-1, True))
901
901
  return await self.send(
902
- cdp.dom.get_outer_html(backend_node_id=doc.backend_node_id)
902
+ cdp.dom.get_outer_html(
903
+ backend_node_id=doc.backend_node_id,
904
+ include_shadow_dom=True,
905
+ )
903
906
  )
904
907
 
905
908
  async def maximize(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.44.2
3
+ Version: 4.44.4
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
@@ -75,7 +75,7 @@ Requires-Dist: filelock~=3.16.1; python_version < "3.9"
75
75
  Requires-Dist: filelock~=3.19.1; python_version >= "3.9" and python_version < "3.10"
76
76
  Requires-Dist: filelock>=3.20.0; python_version >= "3.10"
77
77
  Requires-Dist: fasteners>=0.20
78
- Requires-Dist: mycdp>=1.2.1
78
+ Requires-Dist: mycdp>=1.3.0
79
79
  Requires-Dist: pynose>=1.5.5
80
80
  Requires-Dist: platformdirs~=4.3.6; python_version < "3.9"
81
81
  Requires-Dist: platformdirs~=4.4.0; python_version >= "3.9" and python_version < "3.10"
@@ -106,7 +106,8 @@ Requires-Dist: sniffio==1.3.1
106
106
  Requires-Dist: h11==0.16.0
107
107
  Requires-Dist: outcome==1.3.0.post0
108
108
  Requires-Dist: trio==0.27.0; python_version < "3.9"
109
- Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9"
109
+ Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9" and python_version < "3.10"
110
+ Requires-Dist: trio<1,>=0.32.0; python_version >= "3.10"
110
111
  Requires-Dist: trio-websocket~=0.12.2
111
112
  Requires-Dist: wsproto==1.2.0
112
113
  Requires-Dist: websocket-client~=1.8.0; python_version < "3.9"
@@ -3,7 +3,7 @@ wheel>=0.45.1
3
3
  certifi>=2025.10.5
4
4
  exceptiongroup>=1.3.0
5
5
  fasteners>=0.20
6
- mycdp>=1.2.1
6
+ mycdp>=1.3.0
7
7
  pynose>=1.5.5
8
8
  sbvirtualdisplay>=1.4.0
9
9
  Jinja2>=3.1.6
@@ -72,6 +72,7 @@ setuptools>=80.9.0
72
72
  filelock>=3.20.0
73
73
  platformdirs>=4.5.0
74
74
  urllib3<2.6.0,>=1.26.20
75
+ trio<1,>=0.32.0
75
76
  selenium==4.38.0
76
77
  iniconfig==2.3.0
77
78
  pytest-rerunfailures==16.1
@@ -84,7 +85,6 @@ websockets>=15.0.1
84
85
  typing-extensions>=4.15.0
85
86
  MarkupSafe>=3.0.3
86
87
  requests~=2.32.5
87
- trio<1,>=0.31.0
88
88
  websocket-client~=1.9.0
89
89
  cssselect==1.3.0
90
90
  pluggy==1.6.0
@@ -95,6 +95,7 @@ soupsieve~=2.8
95
95
  [:python_version >= "3.9" and python_version < "3.10"]
96
96
  filelock~=3.19.1
97
97
  platformdirs~=4.4.0
98
+ trio<1,>=0.31.0
98
99
  selenium==4.32.0
99
100
  pytest-rerunfailures==16.0.1
100
101
 
@@ -163,7 +163,7 @@ setup(
163
163
  'filelock~=3.19.1;python_version>="3.9" and python_version<"3.10"',
164
164
  'filelock>=3.20.0;python_version>="3.10"',
165
165
  'fasteners>=0.20',
166
- "mycdp>=1.2.1",
166
+ "mycdp>=1.3.0",
167
167
  "pynose>=1.5.5",
168
168
  'platformdirs~=4.3.6;python_version<"3.9"',
169
169
  'platformdirs~=4.4.0;python_version>="3.9" and python_version<"3.10"',
@@ -194,7 +194,8 @@ setup(
194
194
  'h11==0.16.0',
195
195
  'outcome==1.3.0.post0',
196
196
  'trio==0.27.0;python_version<"3.9"',
197
- 'trio>=0.31.0,<1;python_version>="3.9"',
197
+ 'trio>=0.31.0,<1;python_version>="3.9" and python_version<"3.10"',
198
+ 'trio>=0.32.0,<1;python_version>="3.10"',
198
199
  'trio-websocket~=0.12.2',
199
200
  'wsproto==1.2.0',
200
201
  'websocket-client~=1.8.0;python_version<"3.9"',
File without changes
File without changes
File without changes
File without changes
File without changes