seleniumbase 4.50.1__tar.gz → 4.50.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 (163) hide show
  1. {seleniumbase-4.50.1/seleniumbase.egg-info → seleniumbase-4.50.2}/PKG-INFO +3 -3
  2. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/requirements.txt +2 -2
  3. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/__version__.py +1 -1
  4. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/sb_cdp.py +6 -1
  5. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/base_case.py +4 -4
  6. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/browser.py +66 -13
  7. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/cdp_util.py +2 -8
  8. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/config.py +1 -1
  9. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/element.py +25 -11
  10. {seleniumbase-4.50.1 → seleniumbase-4.50.2/seleniumbase.egg-info}/PKG-INFO +3 -3
  11. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/requires.txt +2 -2
  12. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/setup.py +2 -2
  13. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/.gitignore +0 -0
  14. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/LICENSE +0 -0
  15. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/MANIFEST.in +0 -0
  16. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/README.md +0 -0
  17. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/install.sh +0 -0
  18. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/pyproject.toml +0 -0
  19. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/pytest.ini +0 -0
  20. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/sbase/__init__.py +0 -0
  21. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/sbase/__main__.py +0 -0
  22. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/sbase/steps.py +0 -0
  23. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/__init__.py +0 -0
  24. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/__main__.py +0 -0
  25. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/behave/__init__.py +0 -0
  26. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/behave/behave_helper.py +0 -0
  27. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/behave/behave_sb.py +0 -0
  28. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/behave/steps.py +0 -0
  29. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/__init__.py +0 -0
  30. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/decorators.py +0 -0
  31. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/encryption.py +0 -0
  32. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/exceptions.py +0 -0
  33. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/obfuscate.py +0 -0
  34. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/common/unobfuscate.py +0 -0
  35. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/config/__init__.py +0 -0
  36. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/config/ad_block_list.py +0 -0
  37. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/config/proxy_list.py +0 -0
  38. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/config/settings.py +0 -0
  39. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/__init__.py +0 -0
  40. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/logo_helper.py +0 -0
  41. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/rich_helper.py +0 -0
  42. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/run.py +0 -0
  43. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  44. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  45. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_commander.py +0 -0
  46. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_install.py +0 -0
  47. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  48. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  49. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  50. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  51. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  52. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  53. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_print.py +0 -0
  54. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  55. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/__init__.py +0 -0
  56. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/application_manager.py +0 -0
  57. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/browser_launcher.py +0 -0
  58. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/capabilities_parser.py +0 -0
  59. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/colored_traceback.py +0 -0
  60. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/create_db_tables.sql +0 -0
  61. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/detect_b_ver.py +0 -0
  62. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/download_helper.py +0 -0
  63. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/encoded_images.py +0 -0
  64. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/jqc_helper.py +0 -0
  65. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/log_helper.py +0 -0
  66. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/mysql.py +0 -0
  67. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/nest_asyncio.py +0 -0
  68. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/proxy_helper.py +0 -0
  69. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/recorder_helper.py +0 -0
  70. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/report_helper.py +0 -0
  71. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/s3_manager.py +0 -0
  72. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/sb_driver.py +0 -0
  73. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/session_helper.py +0 -0
  74. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/settings_parser.py +0 -0
  75. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/style_sheet.py +0 -0
  76. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/testcase_manager.py +0 -0
  77. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/tour_helper.py +0 -0
  78. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/core/visual_helper.py +0 -0
  79. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/__init__.py +0 -0
  80. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  81. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  82. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  83. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  84. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  85. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  86. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  87. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/__init__.py +0 -0
  88. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/ad_block.zip +0 -0
  89. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/disable_csp.zip +0 -0
  90. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/recorder.zip +0 -0
  91. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/extensions/sbase_ext.zip +0 -0
  92. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/__init__.py +0 -0
  93. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/constants.py +0 -0
  94. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  95. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/errors.py +0 -0
  96. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/js_utils.py +0 -0
  97. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/page_actions.py +0 -0
  98. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/page_utils.py +0 -0
  99. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/shared_utils.py +0 -0
  100. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/unittest_helper.py +0 -0
  101. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/words.py +0 -0
  102. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  103. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/js_code/__init__.py +0 -0
  104. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/js_code/active_css_js.py +0 -0
  105. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/js_code/live_js.py +0 -0
  106. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/js_code/recorder_js.py +0 -0
  107. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/masterqa/__init__.py +0 -0
  108. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/masterqa/master_qa.py +0 -0
  109. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/__init__.py +0 -0
  110. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/base_plugin.py +0 -0
  111. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/basic_test_info.py +0 -0
  112. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  113. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/driver_manager.py +0 -0
  114. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/page_source.py +0 -0
  115. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/pytest_plugin.py +0 -0
  116. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  117. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/sb_manager.py +0 -0
  118. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/screen_shots.py +0 -0
  119. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/plugins/selenium_plugin.py +0 -0
  120. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/resources/__init__.py +0 -0
  121. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/__init__.py +0 -0
  122. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/chinese.py +0 -0
  123. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/dutch.py +0 -0
  124. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/french.py +0 -0
  125. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/italian.py +0 -0
  126. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/japanese.py +0 -0
  127. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/korean.py +0 -0
  128. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/master_dict.py +0 -0
  129. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/portuguese.py +0 -0
  130. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/russian.py +0 -0
  131. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/spanish.py +0 -0
  132. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/translate/translator.py +0 -0
  133. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/__init__.py +0 -0
  134. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp.py +0 -0
  135. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  136. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  137. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  139. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/setup.cfg +0 -0
  163. {seleniumbase-4.50.1 → seleniumbase-4.50.2}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.50.1
3
+ Version: 4.50.2
4
4
  Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -117,7 +117,7 @@ Requires-Dist: iniconfig==2.1.0; python_version < "3.10"
117
117
  Requires-Dist: iniconfig==2.3.0; python_version >= "3.10"
118
118
  Requires-Dist: pluggy==1.6.0
119
119
  Requires-Dist: pytest==8.4.2; python_version < "3.11"
120
- Requires-Dist: pytest==9.1.0; python_version >= "3.11"
120
+ Requires-Dist: pytest==9.1.1; python_version >= "3.11"
121
121
  Requires-Dist: pytest-html==4.0.2
122
122
  Requires-Dist: pytest-metadata==3.1.1
123
123
  Requires-Dist: pytest-ordering==0.6
@@ -141,7 +141,7 @@ Requires-Dist: allure-python-commons>=2.16.0; extra == "allure"
141
141
  Requires-Dist: allure-behave>=2.16.0; extra == "allure"
142
142
  Provides-Extra: coverage
143
143
  Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
144
- Requires-Dist: coverage>=7.14.1; python_version >= "3.10" and extra == "coverage"
144
+ Requires-Dist: coverage>=7.14.3; python_version >= "3.10" and extra == "coverage"
145
145
  Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
146
146
  Provides-Extra: flake8
147
147
  Requires-Dist: flake8==7.3.0; extra == "flake8"
@@ -56,7 +56,7 @@ iniconfig==2.1.0;python_version<"3.10"
56
56
  iniconfig==2.3.0;python_version>="3.10"
57
57
  pluggy==1.6.0
58
58
  pytest==8.4.2;python_version<"3.11"
59
- pytest==9.1.0;python_version>="3.11"
59
+ pytest==9.1.1;python_version>="3.11"
60
60
  pytest-html==4.0.2
61
61
  pytest-metadata==3.1.1
62
62
  pytest-ordering==0.6
@@ -79,7 +79,7 @@ rich>=15.0.0,<16
79
79
  # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
80
80
 
81
81
  coverage>=7.10.7;python_version<"3.10"
82
- coverage>=7.14.1;python_version>="3.10"
82
+ coverage>=7.14.3;python_version>="3.10"
83
83
  pytest-cov>=7.1.0
84
84
  flake8==7.3.0
85
85
  mccabe==0.7.0
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.50.1"
2
+ __version__ = "4.50.2"
@@ -2163,6 +2163,10 @@ class CDPMethods():
2163
2163
  self.__slow_mode_pause_if_set()
2164
2164
  self.loop.run_until_complete(self.page.wait(0.2))
2165
2165
 
2166
+ def stop(self):
2167
+ """Same as quit()"""
2168
+ self.quit()
2169
+
2166
2170
  def quit(self):
2167
2171
  """Quit the browser in the Pure CDP Mode Sync format."""
2168
2172
  driver = self.driver
@@ -3544,8 +3548,9 @@ class Chrome(CDPMethods):
3544
3548
  def __init__(self, url=None, **kwargs):
3545
3549
  if not url:
3546
3550
  url = "about:blank"
3547
- driver = cdp_util.start_sync(**kwargs)
3548
3551
  loop = asyncio.new_event_loop()
3552
+ kwargs["loop"] = loop
3553
+ driver = cdp_util.start_sync(**kwargs)
3549
3554
  page = loop.run_until_complete(driver.get(url))
3550
3555
  wait_timeout = 30.0
3551
3556
  if hasattr(sb_config, "_cdp_proxy") and sb_config._cdp_proxy:
@@ -16841,13 +16841,13 @@ class BaseCase(unittest.TestCase):
16841
16841
  '<thead id="results-table-head">'
16842
16842
  '<tr style="background-color: #F7F7FD;">'
16843
16843
  '<th style="background-color: #FFF8F8; color: #FF2222;">'
16844
- 'Failed: %s</th>'
16844
+ 'Failed: %s </th>'
16845
16845
  '<th style="background-color: #FEFEF9; color: #FFA500;">'
16846
- 'Skipped: %s</th>'
16846
+ 'Skipped: %s </th>'
16847
16847
  '<th style="background-color: #F8FFF8; color: #12A212;">'
16848
- 'Passed: %s</th>'
16848
+ 'Passed: %s </th>'
16849
16849
  '<th style="background-color: #F9F9F9; color: #8C8C8C;">'
16850
- 'Untested: %s</th>'
16850
+ 'Untested: %s </th>'
16851
16851
  '<th style="background-color: #F4F4FF; color: #575792;">'
16852
16852
  'Total: %s</th>'
16853
16853
  "</tr></thead></table>"
@@ -50,23 +50,29 @@ def deconstruct_browser():
50
50
  _.config.user_data_dir, ignore_errors=False
51
51
  )
52
52
  if not os.path.exists(_.config.user_data_dir):
53
+ logger.debug(
54
+ "Temp profile %s was removed."
55
+ % _.config.user_data_dir
56
+ )
53
57
  break
54
58
  else:
55
59
  time.sleep(0.12)
56
60
  except FileNotFoundError:
61
+ logger.debug(
62
+ "Temp profile %s was removed." % _.config.user_data_dir
63
+ )
57
64
  break
58
65
  except (PermissionError, OSError) as e:
59
66
  if attempt == max_attempts - 1:
60
67
  logger.debug(
61
- "Problem removing data dir %s\n"
68
+ "Problem removing data dir %s.\n"
62
69
  "Consider checking whether it's there "
63
- "and remove it by hand\nerror: %s"
70
+ "and remove it by hand.\nError: %s"
64
71
  % (_.config.user_data_dir, e)
65
72
  )
66
73
  break
67
74
  time.sleep(0.12)
68
75
  continue
69
- logging.debug("Temp profile %s was removed." % _.config.user_data_dir)
70
76
 
71
77
 
72
78
  class Browser:
@@ -940,10 +946,12 @@ class Browser:
940
946
  logger.debug("Closed the connection using asyncio.run()")
941
947
  except Exception:
942
948
  pass
949
+ procs = []
943
950
  for _ in range(3):
944
951
  try:
945
952
  if connection_id not in sb_config._closed_connection_ids:
946
953
  self._process.terminate()
954
+ procs.append(psutil.Process(self._process.pid))
947
955
  logger.debug(
948
956
  "Terminated browser with pid %d successfully."
949
957
  % self._process.pid
@@ -955,20 +963,33 @@ class Browser:
955
963
  except (Exception,):
956
964
  try:
957
965
  self._process.kill()
966
+ procs.append(psutil.Process(self._process.pid))
958
967
  logger.debug(
959
968
  "Killed browser with pid %d successfully."
960
969
  % self._process.pid
961
970
  )
971
+ if connection_id:
972
+ sb_config._closed_connection_ids.append(connection_id)
973
+ close_success = True
962
974
  break
963
975
  except (Exception,):
964
976
  try:
965
- if hasattr(self, "browser_process_pid"):
977
+ if hasattr(self, "_process_pid") and self._process_pid:
966
978
  os.kill(self._process_pid, 15)
979
+ try:
980
+ procs.append(psutil.Process(self._process_pid))
981
+ except Exception:
982
+ pass
967
983
  logger.debug(
968
984
  "Killed browser with pid %d "
969
985
  "using signal 15 successfully."
970
- % self._process.pid
986
+ % self._process_pid
971
987
  )
988
+ if connection_id:
989
+ sb_config._closed_connection_ids.append(
990
+ connection_id
991
+ )
992
+ close_success = True
972
993
  break
973
994
  except (TypeError,):
974
995
  logger.info("TypeError", exc_info=True)
@@ -976,16 +997,33 @@ class Browser:
976
997
  except (PermissionError,):
977
998
  logger.info(
978
999
  "Browser already stopped, "
979
- "or no permission to kill. Skip."
1000
+ "or no permission to kill."
980
1001
  )
981
1002
  pass
982
1003
  except (ProcessLookupError,):
983
1004
  logger.info("ProcessLookupError")
984
- pass
1005
+ break
985
1006
  except (Exception,):
986
1007
  raise
987
- self._process = None
988
- self._process_pid = None
1008
+ self._process = None
1009
+ self._process_pid = None
1010
+ if procs:
1011
+ with suppress(Exception):
1012
+ gone, alive = psutil.wait_procs(procs, timeout=0.8)
1013
+ for p in gone:
1014
+ logger.debug("Process has been terminated: %d." % p.pid)
1015
+ for p in alive:
1016
+ logger.debug("Process is still alive: %d." % p.pid)
1017
+ if self.config.user_data_dir and not self.config.uses_custom_data_dir:
1018
+ for _ in range(3):
1019
+ try:
1020
+ time.sleep(0.005)
1021
+ if os.path.exists(self.config.user_data_dir):
1022
+ time.sleep(0.005)
1023
+ shutil.rmtree(self.config.user_data_dir)
1024
+ break
1025
+ except Exception:
1026
+ time.sleep(0.12)
989
1027
  if (
990
1028
  hasattr(sb_config, "_xvfb_users")
991
1029
  and isinstance(sb_config._xvfb_users, int)
@@ -1025,18 +1063,33 @@ class Browser:
1025
1063
  def silence_pipe_destruction_errors(unraisable):
1026
1064
  exc_type = unraisable.exc_type
1027
1065
  exc_value = unraisable.exc_value
1066
+ exc_value_str = str(exc_value) if exc_value else ""
1028
1067
  if (
1029
1068
  exc_type is ValueError
1030
- and "I/O operation on closed pipe" in str(exc_value)
1069
+ and "I/O operation on closed pipe" in exc_value_str
1070
+ ):
1071
+ return
1072
+ if (
1073
+ exc_type is RuntimeError
1074
+ and "Event loop is closed" in exc_value_str
1031
1075
  ):
1032
1076
  return
1033
1077
  default_unraisablehook(unraisable)
1034
1078
 
1035
1079
  sys.unraisablehook = silence_pipe_destruction_errors
1036
1080
  # Automatically restore Python's default behavior at program exit
1037
- atexit.register(
1038
- lambda: setattr(sys, "unraisablehook", default_unraisablehook)
1039
- )
1081
+ # (Looks like this isn't needed, but I'm saving it for reference)
1082
+ # atexit.register(
1083
+ # lambda: setattr(
1084
+ # sys, "unraisablehook", default_unraisablehook
1085
+ # )
1086
+ # )
1087
+
1088
+ # Custom user_data_dirs should be saved while temp ones are removed
1089
+ if os.path.exists("%s" % self.config.user_data_dir):
1090
+ logger.debug("%s still exists." % self.config.user_data_dir)
1091
+ else:
1092
+ logger.debug("%s was removed." % self.config.user_data_dir)
1040
1093
 
1041
1094
  def quit(self):
1042
1095
  self.stop()
@@ -764,14 +764,8 @@ async def start_async(*args, **kwargs) -> Browser:
764
764
 
765
765
 
766
766
  def start_sync(*args, **kwargs) -> Browser:
767
- loop = None
768
- if (
769
- "loop" in kwargs
770
- and kwargs["loop"]
771
- and hasattr(kwargs["loop"], "create_task")
772
- ):
773
- loop = kwargs["loop"]
774
- else:
767
+ loop = kwargs.pop("loop", None)
768
+ if not (loop and hasattr(loop, "create_task")):
775
769
  loop = asyncio.new_event_loop()
776
770
  return loop.run_until_complete(start(*args, **kwargs))
777
771
 
@@ -25,7 +25,7 @@ __all__ = [
25
25
  ]
26
26
 
27
27
  logger = logging.getLogger(__name__)
28
- is_posix = sys.platform.startswith(("darwin", "cygwin", "linux", "linux2"))
28
+ is_posix = sys.platform.startswith(("darwin", "cygwin", "linux"))
29
29
 
30
30
  PathLike = Union[str, pathlib.Path]
31
31
  AUTO = None
@@ -372,12 +372,17 @@ class Element:
372
372
  arguments = [cdp.runtime.CallArgument(
373
373
  object_id=self._remote_object.object_id
374
374
  )]
375
- script = 'sessionStorage.getItem("pxsid") !== null;'
375
+ # The next part may be getting detected. Comment-out for now.
376
+ '''script1 = 'sessionStorage.getItem("pxsid") !== null;'
377
+ script2 = 'sessionStorage.getItem("PIM-SESSION-ID") !== null;'
376
378
  using_px = True
379
+ using_pim = True
377
380
  with suppress(Exception):
378
- using_px = await self.tab.evaluate(script)
379
- if not using_px:
380
- await self.flash_async(0.25)
381
+ using_px = await self.tab.evaluate(script1)
382
+ with suppress(Exception):
383
+ using_pim = await self.tab.evaluate(script2)
384
+ if not using_px and not using_pim:
385
+ await self.flash_async(0.25)'''
381
386
  await self._tab.send(
382
387
  cdp.runtime.call_function_on(
383
388
  "(el) => el.click()",
@@ -506,12 +511,17 @@ class Element:
506
511
  logger.warning("Could not calculate box model for %s", self)
507
512
  return
508
513
  logger.debug("Clicking on location: %.2f, %.2f" % center)
509
- script = 'sessionStorage.getItem("pxsid") !== null;'
514
+ # The next part may be getting detected. Comment-out for now.
515
+ '''script1 = 'sessionStorage.getItem("pxsid") !== null;'
516
+ script2 = 'sessionStorage.getItem("PIM-SESSION-ID") !== null;'
510
517
  using_px = True
518
+ using_pim = True
519
+ with suppress(Exception):
520
+ using_px = await self.tab.evaluate(script1)
511
521
  with suppress(Exception):
512
- using_px = await self.tab.evaluate(script)
513
- if not using_px:
514
- asyncio.create_task(self.flash_async(0.25))
522
+ using_pim = await self.tab.evaluate(script2)
523
+ if not using_px and not using_pim:
524
+ asyncio.create_task(self.flash_async(0.25))'''
515
525
  asyncio.create_task(
516
526
  self._tab.send(
517
527
  cdp.input_.dispatch_mouse_event(
@@ -570,11 +580,15 @@ class Element:
570
580
  logger.debug("Clicking on location: %.2f, %.2f" % center_pos)
571
581
  else:
572
582
  logger.debug("Clicking on location: %.2f, %.2f" % (x_pos, y_pos))
573
- script = 'sessionStorage.getItem("pxsid") !== null;'
583
+ script1 = 'sessionStorage.getItem("pxsid") !== null;'
584
+ script2 = 'sessionStorage.getItem("PIM-SESSION-ID") !== null;'
574
585
  using_px = True
586
+ using_pim = True
587
+ with suppress(Exception):
588
+ using_px = await self.tab.evaluate(script1)
575
589
  with suppress(Exception):
576
- using_px = await self.tab.evaluate(script)
577
- if not using_px:
590
+ using_pim = await self.tab.evaluate(script2)
591
+ if not using_px and not using_pim:
578
592
  asyncio.create_task(
579
593
  self.flash_async(
580
594
  x_offset=x_offset - (width / 2),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.50.1
3
+ Version: 4.50.2
4
4
  Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -117,7 +117,7 @@ Requires-Dist: iniconfig==2.1.0; python_version < "3.10"
117
117
  Requires-Dist: iniconfig==2.3.0; python_version >= "3.10"
118
118
  Requires-Dist: pluggy==1.6.0
119
119
  Requires-Dist: pytest==8.4.2; python_version < "3.11"
120
- Requires-Dist: pytest==9.1.0; python_version >= "3.11"
120
+ Requires-Dist: pytest==9.1.1; python_version >= "3.11"
121
121
  Requires-Dist: pytest-html==4.0.2
122
122
  Requires-Dist: pytest-metadata==3.1.1
123
123
  Requires-Dist: pytest-ordering==0.6
@@ -141,7 +141,7 @@ Requires-Dist: allure-python-commons>=2.16.0; extra == "allure"
141
141
  Requires-Dist: allure-behave>=2.16.0; extra == "allure"
142
142
  Provides-Extra: coverage
143
143
  Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
144
- Requires-Dist: coverage>=7.14.1; python_version >= "3.10" and extra == "coverage"
144
+ Requires-Dist: coverage>=7.14.3; python_version >= "3.10" and extra == "coverage"
145
145
  Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
146
146
  Provides-Extra: flake8
147
147
  Requires-Dist: flake8==7.3.0; extra == "flake8"
@@ -85,7 +85,7 @@ pytest-rerunfailures==16.3
85
85
  markdown-it-py==4.2.0
86
86
 
87
87
  [:python_version >= "3.11"]
88
- pytest==9.1.0
88
+ pytest==9.1.1
89
89
 
90
90
  [allure]
91
91
  allure-pytest>=2.16.0
@@ -99,7 +99,7 @@ pytest-cov>=7.1.0
99
99
  coverage>=7.10.7
100
100
 
101
101
  [coverage:python_version >= "3.10"]
102
- coverage>=7.14.1
102
+ coverage>=7.14.3
103
103
 
104
104
  [flake8]
105
105
  flake8==7.3.0
@@ -220,7 +220,7 @@ setup(
220
220
  'iniconfig==2.3.0;python_version>="3.10"',
221
221
  'pluggy==1.6.0',
222
222
  'pytest==8.4.2;python_version<"3.11"',
223
- 'pytest==9.1.0;python_version>="3.11"',
223
+ 'pytest==9.1.1;python_version>="3.11"',
224
224
  'pytest-html==4.0.2', # Newer ones had issues
225
225
  'pytest-metadata==3.1.1',
226
226
  'pytest-ordering==0.6',
@@ -252,7 +252,7 @@ setup(
252
252
  # Usage: coverage run -m pytest; coverage html; coverage report
253
253
  "coverage": [
254
254
  'coverage>=7.10.7;python_version<"3.10"',
255
- 'coverage>=7.14.1;python_version>="3.10"',
255
+ 'coverage>=7.14.3;python_version>="3.10"',
256
256
  'pytest-cov>=7.1.0',
257
257
  ],
258
258
  # pip install -e .[flake8]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes