seleniumbase 4.50.1__tar.gz → 4.50.3__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.

Potentially problematic release.


This version of seleniumbase might be problematic. Click here for more details.

Files changed (163) hide show
  1. {seleniumbase-4.50.1/seleniumbase.egg-info → seleniumbase-4.50.3}/PKG-INFO +4 -4
  2. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/README.md +1 -1
  3. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/requirements.txt +2 -2
  4. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/behave/behave_sb.py +5 -2
  6. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/run.py +5 -3
  7. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_install.py +4 -3
  8. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/browser_launcher.py +4 -1
  9. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/sb_cdp.py +8 -1
  10. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/base_case.py +4 -4
  11. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/driver_manager.py +4 -1
  12. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/pytest_plugin.py +2 -1
  13. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/sb_manager.py +4 -1
  14. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/selenium_plugin.py +2 -1
  15. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp_driver/browser.py +66 -13
  16. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp_driver/cdp_util.py +7 -9
  17. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp_driver/config.py +3 -1
  18. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp_driver/element.py +25 -11
  19. {seleniumbase-4.50.1 → seleniumbase-4.50.3/seleniumbase.egg-info}/PKG-INFO +4 -4
  20. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase.egg-info/requires.txt +2 -2
  21. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/setup.py +2 -2
  22. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/.gitignore +0 -0
  23. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/LICENSE +0 -0
  24. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/MANIFEST.in +0 -0
  25. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/install.sh +0 -0
  26. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/pyproject.toml +0 -0
  27. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/pytest.ini +0 -0
  28. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/sbase/__init__.py +0 -0
  29. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/sbase/__main__.py +0 -0
  30. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/sbase/steps.py +0 -0
  31. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/__init__.py +0 -0
  32. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/__main__.py +0 -0
  33. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/behave/__init__.py +0 -0
  34. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/behave/behave_helper.py +0 -0
  35. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/behave/steps.py +0 -0
  36. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/common/__init__.py +0 -0
  37. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/common/decorators.py +0 -0
  38. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/common/encryption.py +0 -0
  39. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/common/exceptions.py +0 -0
  40. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/common/obfuscate.py +0 -0
  41. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/common/unobfuscate.py +0 -0
  42. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/config/__init__.py +0 -0
  43. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/config/ad_block_list.py +0 -0
  44. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/config/proxy_list.py +0 -0
  45. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/config/settings.py +0 -0
  46. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/__init__.py +0 -0
  47. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/logo_helper.py +0 -0
  48. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/rich_helper.py +0 -0
  49. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  50. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  51. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_commander.py +0 -0
  52. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  53. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  54. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  55. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  56. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  57. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  58. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_print.py +0 -0
  59. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  60. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/__init__.py +0 -0
  61. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/application_manager.py +0 -0
  62. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/capabilities_parser.py +0 -0
  63. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/colored_traceback.py +0 -0
  64. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/create_db_tables.sql +0 -0
  65. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/detect_b_ver.py +0 -0
  66. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/download_helper.py +0 -0
  67. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/encoded_images.py +0 -0
  68. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/jqc_helper.py +0 -0
  69. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/log_helper.py +0 -0
  70. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/mysql.py +0 -0
  71. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/nest_asyncio.py +0 -0
  72. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/proxy_helper.py +0 -0
  73. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/recorder_helper.py +0 -0
  74. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/report_helper.py +0 -0
  75. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/s3_manager.py +0 -0
  76. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/sb_driver.py +0 -0
  77. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/session_helper.py +0 -0
  78. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/settings_parser.py +0 -0
  79. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/style_sheet.py +0 -0
  80. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/testcase_manager.py +0 -0
  81. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/tour_helper.py +0 -0
  82. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/core/visual_helper.py +0 -0
  83. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/drivers/__init__.py +0 -0
  84. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  85. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  86. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  87. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  88. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  89. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  90. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  91. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/extensions/__init__.py +0 -0
  92. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/extensions/ad_block.zip +0 -0
  93. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/extensions/disable_csp.zip +0 -0
  94. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/extensions/recorder.zip +0 -0
  95. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/extensions/sbase_ext.zip +0 -0
  96. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/__init__.py +0 -0
  97. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/constants.py +0 -0
  98. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  99. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/errors.py +0 -0
  100. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/js_utils.py +0 -0
  101. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/page_actions.py +0 -0
  102. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/page_utils.py +0 -0
  103. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/shared_utils.py +0 -0
  104. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/unittest_helper.py +0 -0
  105. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/words.py +0 -0
  106. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  107. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/js_code/__init__.py +0 -0
  108. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/js_code/active_css_js.py +0 -0
  109. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/js_code/live_js.py +0 -0
  110. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/js_code/recorder_js.py +0 -0
  111. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/masterqa/__init__.py +0 -0
  112. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/masterqa/master_qa.py +0 -0
  113. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/__init__.py +0 -0
  114. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/base_plugin.py +0 -0
  115. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/basic_test_info.py +0 -0
  116. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  117. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/page_source.py +0 -0
  118. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  119. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/plugins/screen_shots.py +0 -0
  120. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/resources/__init__.py +0 -0
  121. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/__init__.py +0 -0
  122. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/chinese.py +0 -0
  123. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/dutch.py +0 -0
  124. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/french.py +0 -0
  125. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/italian.py +0 -0
  126. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/japanese.py +0 -0
  127. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/korean.py +0 -0
  128. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/master_dict.py +0 -0
  129. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/portuguese.py +0 -0
  130. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/russian.py +0 -0
  131. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/spanish.py +0 -0
  132. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/translate/translator.py +0 -0
  133. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/__init__.py +0 -0
  134. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp.py +0 -0
  135. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  136. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  137. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  139. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/setup.cfg +0 -0
  163. {seleniumbase-4.50.1 → seleniumbase-4.50.3}/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.3
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"
@@ -335,7 +335,7 @@ for element in elements:
335
335
  <p>💡 You can set the Chromium browser to use via command line parameters:</p>
336
336
 
337
337
  ```zsh
338
- python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
338
+ python SCRIPT.py --chromium # Use the unbranded Chromium browser
339
339
  python SCRIPT.py --cft # Use Chrome-for-testing
340
340
  python SCRIPT.py --edge # Use Microsoft Edge
341
341
  python SCRIPT.py --brave # Use Brave browser
@@ -149,7 +149,7 @@ for element in elements:
149
149
  <p>💡 You can set the Chromium browser to use via command line parameters:</p>
150
150
 
151
151
  ```zsh
152
- python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
152
+ python SCRIPT.py --chromium # Use the unbranded Chromium browser
153
153
  python SCRIPT.py --cft # Use Chrome-for-testing
154
154
  python SCRIPT.py --edge # Use Microsoft Edge
155
155
  python SCRIPT.py --brave # Use Brave browser
@@ -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.3"
@@ -492,8 +492,11 @@ def get_configured_sb(context):
492
492
  sb.binary_location = binary_location
493
493
  sb_config.binary_location = binary_location
494
494
  continue
495
- # Handle: -D use-chromium
496
- if low_key in ["use-chromium"] and not sb_config.binary_location:
495
+ # Handle: -D use-chromium / chromium
496
+ if (
497
+ low_key in ["use-chromium", "chromium"]
498
+ and not sb_config.binary_location
499
+ ):
497
500
  binary_location = "_chromium_"
498
501
  sb.binary_location = binary_location
499
502
  sb_config.binary_location = binary_location
@@ -152,12 +152,14 @@ def show_install_usage():
152
152
  print(" sbase get chromedriver")
153
153
  print(" sbase get geckodriver")
154
154
  print(" sbase get edgedriver")
155
- print(" sbase get chromedriver 114")
156
- print(" sbase get chromedriver 114.0.5735.90")
155
+ print(" sbase get chromedriver 149")
156
+ print(" sbase get chromedriver 149.0.7827.115")
157
157
  print(" sbase get chromedriver stable")
158
158
  print(" sbase get chromedriver beta")
159
159
  print(" sbase get chromedriver -p")
160
- print(" sbase get cft 131")
160
+ print(" sbase get chromium")
161
+ print(" sbase get chromium --revision=1639046")
162
+ print(" sbase get cft 149")
161
163
  print(" sbase get chs")
162
164
  print(" Output:")
163
165
  print(" Downloads the webdriver to seleniumbase/drivers/")
@@ -14,13 +14,14 @@ Examples:
14
14
  sbase get chromedriver
15
15
  sbase get geckodriver
16
16
  sbase get edgedriver
17
- sbase get chromedriver 114
18
- sbase get chromedriver 114.0.5735.90
17
+ sbase get chromedriver 149
18
+ sbase get chromedriver 149.0.7827.115
19
19
  sbase get chromedriver stable
20
20
  sbase get chromedriver beta
21
21
  sbase get chromedriver -p
22
22
  sbase get chromium
23
- sbase get cft 131
23
+ sbase get chromium --revision=1639046
24
+ sbase get cft 149
24
25
  sbase get chs
25
26
  Output:
26
27
  Downloads the webdriver to seleniumbase/drivers/
@@ -5012,7 +5012,10 @@ def get_local_driver(
5012
5012
  device_height,
5013
5013
  device_pixel_ratio,
5014
5014
  )
5015
- if binary_location and "chromium_drivers" in binary_location:
5015
+ if (
5016
+ (binary_location and "chromium_drivers" in binary_location)
5017
+ or (binary_location and "Chromium.app" in binary_location)
5018
+ ):
5016
5019
  chrome_options.add_argument("--use-mock-keychain")
5017
5020
  use_version = "latest"
5018
5021
  major_chrome_version = None
@@ -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
@@ -2304,6 +2308,8 @@ class CDPMethods():
2304
2308
  time.sleep(0.48)
2305
2309
  self.loop.run_until_complete(self.page.wait(0.1))
2306
2310
  x2 = x2 + 22.5 # Overshoot drop to maximize compatibility
2311
+ y1 = y1 + 3
2312
+ y2 = y2 + 3
2307
2313
  self.gui_drag_drop_points(x1, y1, x2, y2, timeframe=0.55)
2308
2314
  time.sleep(0.25)
2309
2315
  self.loop.run_until_complete(self.page.wait(0.2))
@@ -3544,8 +3550,9 @@ class Chrome(CDPMethods):
3544
3550
  def __init__(self, url=None, **kwargs):
3545
3551
  if not url:
3546
3552
  url = "about:blank"
3547
- driver = cdp_util.start_sync(**kwargs)
3548
3553
  loop = asyncio.new_event_loop()
3554
+ kwargs["loop"] = loop
3555
+ driver = cdp_util.start_sync(**kwargs)
3549
3556
  page = loop.run_until_complete(driver.get(url))
3550
3557
  wait_timeout = 30.0
3551
3558
  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>"
@@ -668,7 +668,10 @@ def Driver(
668
668
  binary_location = "cft"
669
669
  elif chs and not binary_location:
670
670
  binary_location = "chs"
671
- if "--use-chromium" in sys_argv and not binary_location:
671
+ if (
672
+ ("--use-chromium" in sys_argv and not binary_location)
673
+ or ("--chromium" in sys_argv and not binary_location)
674
+ ):
672
675
  binary_location = "_chromium_"
673
676
  elif "--cft" in sys_argv and not binary_location:
674
677
  binary_location = "cft"
@@ -33,7 +33,7 @@ def pytest_addoption(parser):
33
33
  --brave (Shortcut for "--browser=brave".)
34
34
  --comet (Shortcut for "--browser=comet".)
35
35
  --atlas (Shortcut for "--browser=atlas".)
36
- --use-chromium (Shortcut for using base `Chromium`)
36
+ --chromium (Shortcut for using base `Chromium`)
37
37
  --cft (Shortcut for using `Chrome for Testing`)
38
38
  --chs (Shortcut for using `Chrome-Headless-Shell`)
39
39
  --settings-file=FILE (Override default SeleniumBase settings.)
@@ -223,6 +223,7 @@ def pytest_addoption(parser):
223
223
  )
224
224
  parser.addoption(
225
225
  "--use-chromium",
226
+ "--chromium",
226
227
  action="store_true",
227
228
  dest="use_chromium",
228
229
  default=False,
@@ -708,7 +708,10 @@ def SB(
708
708
  binary_location = "cft"
709
709
  elif chs and not binary_location:
710
710
  binary_location = "chs"
711
- if "--use-chromium" in sys_argv and not binary_location:
711
+ if (
712
+ ("--use-chromium" in sys_argv and not binary_location)
713
+ or ("--chromium" in sys_argv and not binary_location)
714
+ ):
712
715
  binary_location = "_chromium_"
713
716
  elif "--cft" in sys_argv and not binary_location:
714
717
  binary_location = "cft"
@@ -22,7 +22,7 @@ class SeleniumBrowser(Plugin):
22
22
  --brave (Shortcut for "--browser=brave".)
23
23
  --comet (Shortcut for "--browser=comet".)
24
24
  --atlas (Shortcut for "--browser=atlas".)
25
- --use-chromium (Shortcut for using base `Chromium`)
25
+ --chromium (Shortcut for using base `Chromium`)
26
26
  --cft (Shortcut for using `Chrome for Testing`)
27
27
  --chs (Shortcut for using `Chrome-Headless-Shell`)
28
28
  --user-data-dir=DIR (Set the Chrome user data directory to use.)
@@ -184,6 +184,7 @@ class SeleniumBrowser(Plugin):
184
184
  )
185
185
  parser.addoption(
186
186
  "--use-chromium",
187
+ "--chromium",
187
188
  action="store_true",
188
189
  dest="use_chromium",
189
190
  default=False,
@@ -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()
@@ -527,7 +527,11 @@ async def start(
527
527
  print(" Using default Chrome browser instead!")
528
528
  bin_loc = None
529
529
  browser_executable_path = bin_loc
530
- elif use_chromium or "--use-chromium" in arg_join:
530
+ elif (
531
+ use_chromium
532
+ or "--use-chromium" in arg_join
533
+ or "--chromium" in sys_argv
534
+ ):
531
535
  browser_executable_path = "_chromium_"
532
536
  elif cft or "--cft" in arg_join:
533
537
  browser_executable_path = "_cft_"
@@ -764,14 +768,8 @@ async def start_async(*args, **kwargs) -> Browser:
764
768
 
765
769
 
766
770
  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:
771
+ loop = kwargs.pop("loop", None)
772
+ if not (loop and hasattr(loop, "create_task")):
775
773
  loop = asyncio.new_event_loop()
776
774
  return loop.run_until_complete(start(*args, **kwargs))
777
775
 
@@ -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
@@ -195,6 +195,8 @@ class Config:
195
195
  f"Defaulting to regular Chrome!"
196
196
  )
197
197
  browser_executable_path = find_chrome_executable()
198
+ elif "Chromium.app" in browser_executable_path:
199
+ mock_keychain = True
198
200
  self._browser_args = browser_args
199
201
  self.browser_executable_path = browser_executable_path
200
202
  self.headless = headless
@@ -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.3
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"
@@ -335,7 +335,7 @@ for element in elements:
335
335
  <p>💡 You can set the Chromium browser to use via command line parameters:</p>
336
336
 
337
337
  ```zsh
338
- python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
338
+ python SCRIPT.py --chromium # Use the unbranded Chromium browser
339
339
  python SCRIPT.py --cft # Use Chrome-for-testing
340
340
  python SCRIPT.py --edge # Use Microsoft Edge
341
341
  python SCRIPT.py --brave # Use Brave browser
@@ -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