seleniumbase 4.36.0__tar.gz → 4.36.2__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 (155) hide show
  1. {seleniumbase-4.36.0/seleniumbase.egg-info → seleniumbase-4.36.2}/PKG-INFO +4 -4
  2. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/requirements.txt +2 -2
  3. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/__version__.py +1 -1
  4. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/browser_launcher.py +11 -1
  5. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/sb_cdp.py +6 -0
  6. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/base_case.py +20 -0
  7. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/__init__.py +6 -2
  8. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp_driver/tab.py +36 -4
  9. {seleniumbase-4.36.0 → seleniumbase-4.36.2/seleniumbase.egg-info}/PKG-INFO +4 -4
  10. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase.egg-info/requires.txt +3 -3
  11. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/setup.py +3 -3
  12. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/.gitignore +0 -0
  13. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/LICENSE +0 -0
  14. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/MANIFEST.in +0 -0
  15. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/README.md +0 -0
  16. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/install.sh +0 -0
  17. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/pyproject.toml +0 -0
  18. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/pytest.ini +0 -0
  19. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/sbase/steps.py +0 -0
  22. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/capabilities_parser.py +0 -0
  57. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/colored_traceback.py +0 -0
  58. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/create_db_tables.sql +0 -0
  59. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/detect_b_ver.py +0 -0
  60. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/download_helper.py +0 -0
  61. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/encoded_images.py +0 -0
  62. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/jqc_helper.py +0 -0
  63. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/log_helper.py +0 -0
  64. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/mysql.py +0 -0
  65. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/proxy_helper.py +0 -0
  66. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/recorder_helper.py +0 -0
  67. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/report_helper.py +0 -0
  68. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/s3_manager.py +0 -0
  69. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/sb_driver.py +0 -0
  70. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/session_helper.py +0 -0
  71. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/settings_parser.py +0 -0
  72. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/style_sheet.py +0 -0
  73. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/testcase_manager.py +0 -0
  74. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/tour_helper.py +0 -0
  75. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/core/visual_helper.py +0 -0
  76. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/drivers/__init__.py +0 -0
  77. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/extensions/__init__.py +0 -0
  78. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/extensions/ad_block.zip +0 -0
  79. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/extensions/disable_csp.zip +0 -0
  80. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/extensions/recorder.zip +0 -0
  81. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/extensions/sbase_ext.zip +0 -0
  82. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/__init__.py +0 -0
  83. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/constants.py +0 -0
  84. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  85. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/errors.py +0 -0
  86. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/js_utils.py +0 -0
  87. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/page_actions.py +0 -0
  88. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/page_utils.py +0 -0
  89. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/shared_utils.py +0 -0
  90. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/unittest_helper.py +0 -0
  91. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/words.py +0 -0
  92. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  93. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/js_code/__init__.py +0 -0
  94. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/js_code/active_css_js.py +0 -0
  95. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/js_code/live_js.py +0 -0
  96. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/js_code/recorder_js.py +0 -0
  97. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/masterqa/__init__.py +0 -0
  98. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/masterqa/master_qa.py +0 -0
  99. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/__init__.py +0 -0
  100. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/base_plugin.py +0 -0
  101. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/basic_test_info.py +0 -0
  102. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  103. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/driver_manager.py +0 -0
  104. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/page_source.py +0 -0
  105. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/pytest_plugin.py +0 -0
  106. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  107. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/sb_manager.py +0 -0
  108. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/screen_shots.py +0 -0
  109. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/plugins/selenium_plugin.py +0 -0
  110. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/resources/__init__.py +0 -0
  111. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/__init__.py +0 -0
  112. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/chinese.py +0 -0
  113. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/dutch.py +0 -0
  114. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/french.py +0 -0
  115. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/italian.py +0 -0
  116. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/japanese.py +0 -0
  117. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/korean.py +0 -0
  118. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/master_dict.py +0 -0
  119. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/portuguese.py +0 -0
  120. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/russian.py +0 -0
  121. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/spanish.py +0 -0
  122. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/translate/translator.py +0 -0
  123. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp.py +0 -0
  124. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  125. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  126. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  127. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  128. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  129. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  130. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  131. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/dprocess.py +0 -0
  132. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/options.py +0 -0
  133. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/patcher.py +0 -0
  134. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/reactor.py +0 -0
  135. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/undetected/webelement.py +0 -0
  136. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/__init__.py +0 -0
  137. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  138. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  139. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  140. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  141. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  142. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  143. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  144. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  145. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  146. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  147. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  148. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  149. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  150. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase.egg-info/SOURCES.txt +0 -0
  151. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase.egg-info/dependency_links.txt +0 -0
  152. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase.egg-info/entry_points.txt +0 -0
  153. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/seleniumbase.egg-info/top_level.txt +0 -0
  154. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/setup.cfg +0 -0
  155. {seleniumbase-4.36.0 → seleniumbase-4.36.2}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.36.0
3
+ Version: 4.36.2
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
@@ -62,7 +62,7 @@ License-File: LICENSE
62
62
  Requires-Dist: pip>=25.0.1
63
63
  Requires-Dist: packaging>=24.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
- Requires-Dist: setuptools>=77.0.3; python_version >= "3.10"
65
+ Requires-Dist: setuptools>=78.0.2; python_version >= "3.10"
66
66
  Requires-Dist: wheel>=0.45.1
67
67
  Requires-Dist: attrs>=25.3.0
68
68
  Requires-Dist: certifi>=2025.1.31
@@ -89,7 +89,7 @@ Requires-Dist: pyyaml>=6.0.2
89
89
  Requires-Dist: pygments>=2.19.1
90
90
  Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
91
91
  Requires-Dist: tabcompleter>=1.4.0
92
- Requires-Dist: pdbp>=1.6.1
92
+ Requires-Dist: pdbp>=1.7.0
93
93
  Requires-Dist: idna==3.10
94
94
  Requires-Dist: chardet==5.2.0
95
95
  Requires-Dist: charset-normalizer==3.4.1
@@ -151,7 +151,7 @@ Requires-Dist: ipython==7.34.0; extra == "ipdb"
151
151
  Provides-Extra: mss
152
152
  Requires-Dist: mss==9.0.2; extra == "mss"
153
153
  Provides-Extra: pdfminer
154
- Requires-Dist: pdfminer.six==20240706; extra == "pdfminer"
154
+ Requires-Dist: pdfminer.six==20250324; extra == "pdfminer"
155
155
  Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
156
156
  Requires-Dist: cryptography==44.0.2; python_version >= "3.9" and extra == "pdfminer"
157
157
  Requires-Dist: cffi==1.17.1; extra == "pdfminer"
@@ -1,7 +1,7 @@
1
1
  pip>=25.0.1
2
2
  packaging>=24.2
3
3
  setuptools~=70.2;python_version<"3.10"
4
- setuptools>=77.0.3;python_version>="3.10"
4
+ setuptools>=78.0.2;python_version>="3.10"
5
5
  wheel>=0.45.1
6
6
  attrs>=25.3.0
7
7
  certifi>=2025.1.31
@@ -28,7 +28,7 @@ pyyaml>=6.0.2
28
28
  pygments>=2.19.1
29
29
  pyreadline3>=3.5.3;platform_system=="Windows"
30
30
  tabcompleter>=1.4.0
31
- pdbp>=1.6.1
31
+ pdbp>=1.7.0
32
32
  idna==3.10
33
33
  chardet==5.2.0
34
34
  charset-normalizer==3.4.1
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.36.0"
2
+ __version__ = "4.36.2"
@@ -1,4 +1,5 @@
1
1
  import fasteners
2
+ import json
2
3
  import logging
3
4
  import os
4
5
  import platform
@@ -769,6 +770,7 @@ def uc_open_with_cdp_mode(driver, url=None):
769
770
  cdp.scroll_up = CDPM.scroll_up
770
771
  cdp.scroll_down = CDPM.scroll_down
771
772
  cdp.save_screenshot = CDPM.save_screenshot
773
+ cdp.print_to_pdf = CDPM.print_to_pdf
772
774
  cdp.page = page # async world
773
775
  cdp.driver = driver.cdp_base # async world
774
776
  cdp.tab = cdp.page # shortcut (original)
@@ -2125,6 +2127,15 @@ def _set_chrome_options(
2125
2127
  prefs["enable_do_not_track"] = True
2126
2128
  if external_pdf:
2127
2129
  prefs["plugins.always_open_pdf_externally"] = True
2130
+ pdf_settings = {
2131
+ "recentDestinations": [
2132
+ {"id": "Save as PDF", "origin": "local", "account": ""}
2133
+ ],
2134
+ "selectedDestinationId": "Save as PDF",
2135
+ "version": 2,
2136
+ }
2137
+ app_state = "printing.print_preview_sticky_settings.appState"
2138
+ prefs[app_state] = json.dumps(pdf_settings)
2128
2139
  if proxy_string or proxy_pac_url:
2129
2140
  # Implementation of https://stackoverflow.com/q/65705775/7058266
2130
2141
  prefs["webrtc.ip_handling_policy"] = "disable_non_proxied_udp"
@@ -3299,7 +3310,6 @@ def get_remote_driver(
3299
3310
  from seleniumbase.core import capabilities_parser
3300
3311
  desired_caps = capabilities_parser.get_desired_capabilities(cap_file)
3301
3312
  if cap_string:
3302
- import json
3303
3313
  try:
3304
3314
  extra_caps = json.loads(str(cap_string))
3305
3315
  except Exception as e:
@@ -2181,6 +2181,12 @@ class CDPMethods():
2181
2181
  else:
2182
2182
  self.select(selector).save_screenshot(filename)
2183
2183
 
2184
+ def print_to_pdf(self, name, folder=None):
2185
+ filename = name
2186
+ if folder:
2187
+ filename = os.path.join(folder, name)
2188
+ self.loop.run_until_complete(self.page.print_to_pdf(filename))
2189
+
2184
2190
 
2185
2191
  class Chrome(CDPMethods):
2186
2192
  def __init__(self, url=None, **kwargs):
@@ -3993,6 +3993,7 @@ class BaseCase(unittest.TestCase):
3993
3993
  d_width=None,
3994
3994
  d_height=None,
3995
3995
  d_p_r=None,
3996
+ **kwargs,
3996
3997
  ):
3997
3998
  """This method spins up an extra browser for tests that require
3998
3999
  more than one. The first browser is already provided by tests
@@ -4081,6 +4082,11 @@ class BaseCase(unittest.TestCase):
4081
4082
  " for examples!)"
4082
4083
  % (browserstack_ref, sauce_labs_ref)
4083
4084
  )
4085
+ shortcuts = ["dark", "guest", "locale", "mobile", "pls", "uc", "wire"]
4086
+ if kwargs:
4087
+ for key in kwargs.keys():
4088
+ if key not in shortcuts:
4089
+ raise TypeError("Unexpected keyword argument '%s'" % key)
4084
4090
  if browser is None:
4085
4091
  browser = self.browser
4086
4092
  browser_name = browser
@@ -4088,6 +4094,8 @@ class BaseCase(unittest.TestCase):
4088
4094
  headless = self.headless
4089
4095
  if locale_code is None:
4090
4096
  locale_code = self.locale_code
4097
+ if "locale" in kwargs and not locale_code:
4098
+ locale_code = kwargs["locale"]
4091
4099
  if protocol is None:
4092
4100
  protocol = self.protocol
4093
4101
  if servername is None:
@@ -4130,6 +4138,8 @@ class BaseCase(unittest.TestCase):
4130
4138
  uc_cdp_events = self.uc_cdp_events
4131
4139
  if uc_subprocess is None:
4132
4140
  uc_subprocess = self.uc_subprocess
4141
+ if "uc" in kwargs and not undetectable:
4142
+ undetectable = kwargs["uc"]
4133
4143
  if log_cdp_events is None:
4134
4144
  log_cdp_events = self.log_cdp_events
4135
4145
  if no_sandbox is None:
@@ -4144,8 +4154,12 @@ class BaseCase(unittest.TestCase):
4144
4154
  incognito = self.incognito
4145
4155
  if guest_mode is None:
4146
4156
  guest_mode = self.guest_mode
4157
+ if "guest" in kwargs and not guest_mode:
4158
+ guest_mode = kwargs["guest"]
4147
4159
  if dark_mode is None:
4148
4160
  dark_mode = self.dark_mode
4161
+ if "dark" in kwargs and not dark_mode:
4162
+ dark_mode = kwargs["dark"]
4149
4163
  if devtools is None:
4150
4164
  devtools = self.devtools
4151
4165
  if remote_debug is None:
@@ -4182,8 +4196,12 @@ class BaseCase(unittest.TestCase):
4182
4196
  driver_version = self.driver_version
4183
4197
  if page_load_strategy is None:
4184
4198
  page_load_strategy = self.page_load_strategy
4199
+ if "pls" in kwargs and not page_load_strategy:
4200
+ page_load_strategy = kwargs["pls"]
4185
4201
  if use_wire is None:
4186
4202
  use_wire = self.use_wire
4203
+ if "wire" in kwargs and not use_wire:
4204
+ use_wire = kwargs["wire"]
4187
4205
  if external_pdf is None:
4188
4206
  external_pdf = self.external_pdf
4189
4207
  test_id = self.__get_test_id()
@@ -4193,6 +4211,8 @@ class BaseCase(unittest.TestCase):
4193
4211
  cap_string = self.cap_string
4194
4212
  if is_mobile is None:
4195
4213
  is_mobile = self.mobile_emulator
4214
+ if "mobile" in kwargs and not is_mobile:
4215
+ is_mobile = kwargs["mobile"]
4196
4216
  if d_width is None:
4197
4217
  d_width = self.__device_width
4198
4218
  if d_height is None:
@@ -459,7 +459,9 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
459
459
  if self.current_url.startswith(
460
460
  "chrome-extension://"
461
461
  ):
462
- self.close()
462
+ # https://issues.chromium.org/issues/396611138
463
+ # (Uncomment below when resolved)
464
+ # self.close()
463
465
  if self.service.is_connectable():
464
466
  self.stop_client()
465
467
  self.service.stop()
@@ -496,7 +498,9 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
496
498
  if self.current_url.startswith(
497
499
  "chrome-extension://"
498
500
  ):
499
- self.close()
501
+ # https://issues.chromium.org/issues/396611138
502
+ # (Uncomment below when resolved)
503
+ # self.close()
500
504
  if self.service.is_connectable():
501
505
  self.stop_client()
502
506
  self.service.stop()
@@ -1,7 +1,10 @@
1
1
  from __future__ import annotations
2
2
  import asyncio
3
+ import base64
4
+ import datetime
3
5
  import logging
4
6
  import pathlib
7
+ import urllib.parse
5
8
  import warnings
6
9
  from typing import Dict, List, Union, Optional, Tuple
7
10
  from . import browser as cdp_browser
@@ -1133,9 +1136,6 @@ class Tab(Connection):
1133
1136
  :return: The path/filename of the saved screenshot.
1134
1137
  :rtype: str
1135
1138
  """
1136
- import urllib.parse
1137
- import datetime
1138
-
1139
1139
  await self.sleep() # Update the target's URL
1140
1140
  path = None
1141
1141
  if format.lower() in ["jpg", "jpeg"]:
@@ -1166,8 +1166,40 @@ class Tab(Connection):
1166
1166
  "Most possible cause is the page "
1167
1167
  "has not finished loading yet."
1168
1168
  )
1169
- import base64
1169
+ data_bytes = base64.b64decode(data)
1170
+ if not path:
1171
+ raise RuntimeError("Invalid filename or path: '%s'" % filename)
1172
+ path.write_bytes(data_bytes)
1173
+ return str(path)
1170
1174
 
1175
+ async def print_to_pdf(
1176
+ self,
1177
+ filename: Optional[PathLike] = "auto",
1178
+ ) -> str:
1179
+ """
1180
+ Saves a webpage as a PDF.
1181
+ :param filename: uses this as the save path
1182
+ :type filename: PathLike
1183
+ :return: The path/filename of the saved screenshot.
1184
+ :rtype: str
1185
+ """
1186
+ await self.sleep() # Update the target's URL
1187
+ path = None
1188
+ ext = ".pdf"
1189
+ if not filename or filename == "auto":
1190
+ parsed = urllib.parse.urlparse(self.target.url)
1191
+ parts = parsed.path.split("/")
1192
+ last_part = parts[-1]
1193
+ last_part = last_part.rsplit("?", 1)[0]
1194
+ dt_str = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
1195
+ candidate = f"{parsed.hostname}__{last_part}_{dt_str}"
1196
+ path = pathlib.Path(candidate + ext) # noqa
1197
+ else:
1198
+ path = pathlib.Path(filename)
1199
+ path.parent.mkdir(parents=True, exist_ok=True)
1200
+ data, _ = await self.send(cdp.page.print_to_pdf())
1201
+ if not data:
1202
+ raise ProtocolException("Could not save PDF.")
1171
1203
  data_bytes = base64.b64decode(data)
1172
1204
  if not path:
1173
1205
  raise RuntimeError("Invalid filename or path: '%s'" % filename)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.36.0
3
+ Version: 4.36.2
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
@@ -62,7 +62,7 @@ License-File: LICENSE
62
62
  Requires-Dist: pip>=25.0.1
63
63
  Requires-Dist: packaging>=24.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
- Requires-Dist: setuptools>=77.0.3; python_version >= "3.10"
65
+ Requires-Dist: setuptools>=78.0.2; python_version >= "3.10"
66
66
  Requires-Dist: wheel>=0.45.1
67
67
  Requires-Dist: attrs>=25.3.0
68
68
  Requires-Dist: certifi>=2025.1.31
@@ -89,7 +89,7 @@ Requires-Dist: pyyaml>=6.0.2
89
89
  Requires-Dist: pygments>=2.19.1
90
90
  Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
91
91
  Requires-Dist: tabcompleter>=1.4.0
92
- Requires-Dist: pdbp>=1.6.1
92
+ Requires-Dist: pdbp>=1.7.0
93
93
  Requires-Dist: idna==3.10
94
94
  Requires-Dist: chardet==5.2.0
95
95
  Requires-Dist: charset-normalizer==3.4.1
@@ -151,7 +151,7 @@ Requires-Dist: ipython==7.34.0; extra == "ipdb"
151
151
  Provides-Extra: mss
152
152
  Requires-Dist: mss==9.0.2; extra == "mss"
153
153
  Provides-Extra: pdfminer
154
- Requires-Dist: pdfminer.six==20240706; extra == "pdfminer"
154
+ Requires-Dist: pdfminer.six==20250324; extra == "pdfminer"
155
155
  Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
156
156
  Requires-Dist: cryptography==44.0.2; python_version >= "3.9" and extra == "pdfminer"
157
157
  Requires-Dist: cffi==1.17.1; extra == "pdfminer"
@@ -17,7 +17,7 @@ colorama>=0.4.6
17
17
  pyyaml>=6.0.2
18
18
  pygments>=2.19.1
19
19
  tabcompleter>=1.4.0
20
- pdbp>=1.6.1
20
+ pdbp>=1.7.0
21
21
  idna==3.10
22
22
  chardet==5.2.0
23
23
  charset-normalizer==3.4.1
@@ -67,7 +67,7 @@ cssselect==1.2.0
67
67
  pytest-rerunfailures==14.0
68
68
 
69
69
  [:python_version >= "3.10"]
70
- setuptools>=77.0.3
70
+ setuptools>=78.0.2
71
71
  urllib3<2.4.0,>=1.26.20
72
72
 
73
73
  [:python_version >= "3.9"]
@@ -116,7 +116,7 @@ ipython==7.34.0
116
116
  mss==9.0.2
117
117
 
118
118
  [pdfminer]
119
- pdfminer.six==20240706
119
+ pdfminer.six==20250324
120
120
  cffi==1.17.1
121
121
  pycparser==2.22
122
122
 
@@ -150,7 +150,7 @@ setup(
150
150
  'pip>=25.0.1',
151
151
  'packaging>=24.2',
152
152
  'setuptools~=70.2;python_version<"3.10"', # Newer ones had issues
153
- 'setuptools>=77.0.3;python_version>="3.10"',
153
+ 'setuptools>=78.0.2;python_version>="3.10"',
154
154
  'wheel>=0.45.1',
155
155
  'attrs>=25.3.0',
156
156
  "certifi>=2025.1.31",
@@ -177,7 +177,7 @@ setup(
177
177
  'pygments>=2.19.1',
178
178
  'pyreadline3>=3.5.3;platform_system=="Windows"',
179
179
  "tabcompleter>=1.4.0",
180
- "pdbp>=1.6.1",
180
+ "pdbp>=1.7.0",
181
181
  "idna==3.10",
182
182
  'chardet==5.2.0',
183
183
  'charset-normalizer==3.4.1',
@@ -259,7 +259,7 @@ setup(
259
259
  # pip install -e .[pdfminer]
260
260
  # (An optional library for parsing PDF files.)
261
261
  "pdfminer": [
262
- 'pdfminer.six==20240706',
262
+ 'pdfminer.six==20250324',
263
263
  'cryptography==39.0.2;python_version<"3.9"',
264
264
  'cryptography==44.0.2;python_version>="3.9"',
265
265
  'cffi==1.17.1',
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes