seleniumbase 4.34.15__tar.gz → 4.34.17__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. {seleniumbase-4.34.15/seleniumbase.egg-info → seleniumbase-4.34.17}/PKG-INFO +6 -6
  2. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/requirements.txt +5 -5
  3. seleniumbase-4.34.17/seleniumbase/__version__.py +2 -0
  4. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/browser_launcher.py +7 -0
  5. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/sb_cdp.py +139 -35
  6. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/base_case.py +14 -3
  7. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/js_utils.py +31 -9
  8. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/base_plugin.py +12 -15
  9. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/selenium_plugin.py +1 -0
  10. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp_driver/browser.py +2 -0
  11. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp_driver/cdp_util.py +104 -2
  12. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp_driver/config.py +10 -0
  13. {seleniumbase-4.34.15 → seleniumbase-4.34.17/seleniumbase.egg-info}/PKG-INFO +6 -6
  14. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase.egg-info/requires.txt +5 -5
  15. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/setup.py +6 -6
  16. seleniumbase-4.34.15/seleniumbase/__version__.py +0 -2
  17. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/.gitignore +0 -0
  18. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/LICENSE +0 -0
  19. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/MANIFEST.in +0 -0
  20. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/README.md +0 -0
  21. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/install.sh +0 -0
  22. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/pyproject.toml +0 -0
  23. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/pytest.ini +0 -0
  24. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/sbase/__init__.py +0 -0
  25. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/sbase/__main__.py +0 -0
  26. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/sbase/steps.py +0 -0
  27. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/__init__.py +0 -0
  28. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/__main__.py +0 -0
  29. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/behave/__init__.py +0 -0
  30. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/behave/behave_helper.py +0 -0
  31. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/behave/behave_sb.py +0 -0
  32. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/behave/steps.py +0 -0
  33. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/common/__init__.py +0 -0
  34. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/common/decorators.py +0 -0
  35. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/common/encryption.py +0 -0
  36. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/common/exceptions.py +0 -0
  37. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/common/obfuscate.py +0 -0
  38. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/common/unobfuscate.py +0 -0
  39. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/config/__init__.py +0 -0
  40. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/config/ad_block_list.py +0 -0
  41. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/config/proxy_list.py +0 -0
  42. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/config/settings.py +0 -0
  43. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/__init__.py +0 -0
  44. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/logo_helper.py +0 -0
  45. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/rich_helper.py +0 -0
  46. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/run.py +0 -0
  47. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  48. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  49. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_commander.py +0 -0
  50. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_install.py +0 -0
  51. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  52. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  53. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  54. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  55. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  56. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  57. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_print.py +0 -0
  58. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  59. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/__init__.py +0 -0
  60. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/application_manager.py +0 -0
  61. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/capabilities_parser.py +0 -0
  62. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/colored_traceback.py +0 -0
  63. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/create_db_tables.sql +0 -0
  64. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/detect_b_ver.py +0 -0
  65. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/download_helper.py +0 -0
  66. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/encoded_images.py +0 -0
  67. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/jqc_helper.py +0 -0
  68. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/log_helper.py +0 -0
  69. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/mysql.py +0 -0
  70. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/proxy_helper.py +0 -0
  71. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/recorder_helper.py +0 -0
  72. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/report_helper.py +0 -0
  73. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/s3_manager.py +0 -0
  74. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/sb_driver.py +0 -0
  75. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/session_helper.py +0 -0
  76. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/settings_parser.py +0 -0
  77. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/style_sheet.py +0 -0
  78. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/testcase_manager.py +0 -0
  79. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/tour_helper.py +0 -0
  80. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/core/visual_helper.py +0 -0
  81. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/drivers/__init__.py +0 -0
  82. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/extensions/__init__.py +0 -0
  83. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/extensions/ad_block.zip +0 -0
  84. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/extensions/disable_csp.zip +0 -0
  85. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/extensions/recorder.zip +0 -0
  86. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/extensions/sbase_ext.zip +0 -0
  87. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/__init__.py +0 -0
  88. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/constants.py +0 -0
  89. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  90. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/errors.py +0 -0
  91. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/page_actions.py +0 -0
  92. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/page_utils.py +0 -0
  93. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/shared_utils.py +0 -0
  94. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/unittest_helper.py +0 -0
  95. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/words.py +0 -0
  96. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  97. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/js_code/__init__.py +0 -0
  98. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/js_code/active_css_js.py +0 -0
  99. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/js_code/live_js.py +0 -0
  100. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/js_code/recorder_js.py +0 -0
  101. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/masterqa/__init__.py +0 -0
  102. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/masterqa/master_qa.py +0 -0
  103. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/__init__.py +0 -0
  104. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/basic_test_info.py +0 -0
  105. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  106. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/driver_manager.py +0 -0
  107. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/page_source.py +0 -0
  108. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/pytest_plugin.py +0 -0
  109. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  110. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/sb_manager.py +0 -0
  111. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/plugins/screen_shots.py +0 -0
  112. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/resources/__init__.py +0 -0
  113. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/__init__.py +0 -0
  114. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/chinese.py +0 -0
  115. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/dutch.py +0 -0
  116. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/french.py +0 -0
  117. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/italian.py +0 -0
  118. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/japanese.py +0 -0
  119. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/korean.py +0 -0
  120. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/master_dict.py +0 -0
  121. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/portuguese.py +0 -0
  122. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/russian.py +0 -0
  123. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/spanish.py +0 -0
  124. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/translate/translator.py +0 -0
  125. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/__init__.py +0 -0
  126. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp.py +0 -0
  127. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  128. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  129. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  130. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  131. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  132. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/dprocess.py +0 -0
  133. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/options.py +0 -0
  134. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/patcher.py +0 -0
  135. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/reactor.py +0 -0
  136. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/undetected/webelement.py +0 -0
  137. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/__init__.py +0 -0
  138. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  139. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  140. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  141. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  142. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  143. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  144. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  145. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  146. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  147. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  148. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  149. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  150. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  151. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase.egg-info/SOURCES.txt +0 -0
  152. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase.egg-info/dependency_links.txt +0 -0
  153. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase.egg-info/entry_points.txt +0 -0
  154. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/seleniumbase.egg-info/top_level.txt +0 -0
  155. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/setup.cfg +0 -0
  156. {seleniumbase-4.34.15 → seleniumbase-4.34.17}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.34.15
3
+ Version: 4.34.17
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
@@ -68,12 +68,12 @@ Requires-Dist: attrs>=25.1.0
68
68
  Requires-Dist: certifi>=2025.1.31
69
69
  Requires-Dist: exceptiongroup>=1.2.2
70
70
  Requires-Dist: websockets~=13.1; python_version < "3.9"
71
- Requires-Dist: websockets>=14.2; python_version >= "3.9"
71
+ Requires-Dist: websockets>=15.0; python_version >= "3.9"
72
72
  Requires-Dist: filelock~=3.16.1; python_version < "3.9"
73
73
  Requires-Dist: filelock>=3.17.0; python_version >= "3.9"
74
74
  Requires-Dist: fasteners>=0.19
75
75
  Requires-Dist: mycdp>=1.1.0
76
- Requires-Dist: pynose>=1.5.3
76
+ Requires-Dist: pynose>=1.5.4
77
77
  Requires-Dist: platformdirs>=4.3.6
78
78
  Requires-Dist: typing-extensions>=4.12.2
79
79
  Requires-Dist: sbvirtualdisplay>=1.4.0
@@ -99,8 +99,8 @@ Requires-Dist: sniffio==1.3.1
99
99
  Requires-Dist: h11==0.14.0
100
100
  Requires-Dist: outcome==1.3.0.post0
101
101
  Requires-Dist: trio==0.27.0; python_version < "3.9"
102
- Requires-Dist: trio==0.28.0; python_version >= "3.9"
103
- Requires-Dist: trio-websocket==0.11.1
102
+ Requires-Dist: trio==0.29.0; python_version >= "3.9"
103
+ Requires-Dist: trio-websocket==0.12.1
104
104
  Requires-Dist: wsproto==1.2.0
105
105
  Requires-Dist: websocket-client==1.8.0
106
106
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
@@ -137,7 +137,7 @@ Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
137
137
  Requires-Dist: pytest-cov>=6.0.0; python_version >= "3.9" and extra == "coverage"
138
138
  Provides-Extra: flake8
139
139
  Requires-Dist: flake8==5.0.4; python_version < "3.9" and extra == "flake8"
140
- Requires-Dist: flake8==7.1.1; python_version >= "3.9" and extra == "flake8"
140
+ Requires-Dist: flake8==7.1.2; python_version >= "3.9" and extra == "flake8"
141
141
  Requires-Dist: mccabe==0.7.0; extra == "flake8"
142
142
  Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
143
143
  Requires-Dist: pyflakes==3.2.0; python_version >= "3.9" and extra == "flake8"
@@ -7,12 +7,12 @@ attrs>=25.1.0
7
7
  certifi>=2025.1.31
8
8
  exceptiongroup>=1.2.2
9
9
  websockets~=13.1;python_version<"3.9"
10
- websockets>=14.2;python_version>="3.9"
10
+ websockets>=15.0;python_version>="3.9"
11
11
  filelock~=3.16.1;python_version<"3.9"
12
12
  filelock>=3.17.0;python_version>="3.9"
13
13
  fasteners>=0.19
14
14
  mycdp>=1.1.0
15
- pynose>=1.5.3
15
+ pynose>=1.5.4
16
16
  platformdirs>=4.3.6
17
17
  typing-extensions>=4.12.2
18
18
  sbvirtualdisplay>=1.4.0
@@ -38,8 +38,8 @@ sniffio==1.3.1
38
38
  h11==0.14.0
39
39
  outcome==1.3.0.post0
40
40
  trio==0.27.0;python_version<"3.9"
41
- trio==0.28.0;python_version>="3.9"
42
- trio-websocket==0.11.1
41
+ trio==0.29.0;python_version>="3.9"
42
+ trio-websocket==0.12.1
43
43
  wsproto==1.2.0
44
44
  websocket-client==1.8.0
45
45
  selenium==4.27.1;python_version<"3.9"
@@ -74,7 +74,7 @@ coverage>=7.6.12;python_version>="3.9"
74
74
  pytest-cov>=5.0.0;python_version<"3.9"
75
75
  pytest-cov>=6.0.0;python_version>="3.9"
76
76
  flake8==5.0.4;python_version<"3.9"
77
- flake8==7.1.1;python_version>="3.9"
77
+ flake8==7.1.2;python_version>="3.9"
78
78
  mccabe==0.7.0
79
79
  pyflakes==2.5.0;python_version<"3.9"
80
80
  pyflakes==3.2.0;python_version>="3.9"
@@ -0,0 +1,2 @@
1
+ # seleniumbase package
2
+ __version__ = "4.34.17"
@@ -718,6 +718,10 @@ def uc_open_with_cdp_mode(driver, url=None):
718
718
  cdp.is_selected = CDPM.is_selected
719
719
  cdp.is_element_present = CDPM.is_element_present
720
720
  cdp.is_element_visible = CDPM.is_element_visible
721
+ cdp.is_text_visible = CDPM.is_text_visible
722
+ cdp.is_exact_text_visible = CDPM.is_exact_text_visible
723
+ cdp.wait_for_text = CDPM.wait_for_text
724
+ cdp.wait_for_text_not_visible = CDPM.wait_for_text_not_visible
721
725
  cdp.wait_for_element_visible = CDPM.wait_for_element_visible
722
726
  cdp.assert_element = CDPM.assert_element
723
727
  cdp.assert_element_visible = CDPM.assert_element_visible
@@ -731,6 +735,7 @@ def uc_open_with_cdp_mode(driver, url=None):
731
735
  cdp.assert_url_contains = CDPM.assert_url_contains
732
736
  cdp.assert_text = CDPM.assert_text
733
737
  cdp.assert_exact_text = CDPM.assert_exact_text
738
+ cdp.assert_text_not_visible = CDPM.assert_text_not_visible
734
739
  cdp.assert_true = CDPM.assert_true
735
740
  cdp.assert_false = CDPM.assert_false
736
741
  cdp.assert_equal = CDPM.assert_equal
@@ -2280,6 +2285,7 @@ def _set_chrome_options(
2280
2285
  or proxy_string
2281
2286
  ):
2282
2287
  chrome_options.add_argument("--ignore-certificate-errors")
2288
+ chrome_options.add_argument("--ignore-ssl-errors=yes")
2283
2289
  if not enable_ws:
2284
2290
  chrome_options.add_argument("--disable-web-security")
2285
2291
  if (
@@ -4231,6 +4237,7 @@ def get_local_driver(
4231
4237
  edge_options.add_argument("--log-level=3")
4232
4238
  edge_options.add_argument("--no-first-run")
4233
4239
  edge_options.add_argument("--ignore-certificate-errors")
4240
+ edge_options.add_argument("--ignore-ssl-errors=yes")
4234
4241
  if devtools and not headless:
4235
4242
  edge_options.add_argument("--auto-open-devtools-for-tabs")
4236
4243
  edge_options.add_argument("--allow-file-access-from-files")
@@ -56,12 +56,16 @@ class CDPMethods():
56
56
  element, *args, **kwargs
57
57
  )
58
58
  element.focus = lambda: self.__focus(element)
59
+ element.gui_click = (
60
+ lambda *args, **kwargs: self.__gui_click(element, *args, **kwargs)
61
+ )
59
62
  element.highlight_overlay = lambda: self.__highlight_overlay(element)
60
63
  element.mouse_click = lambda: self.__mouse_click(element)
61
64
  element.mouse_drag = (
62
65
  lambda destination: self.__mouse_drag(element, destination)
63
66
  )
64
67
  element.mouse_move = lambda: self.__mouse_move(element)
68
+ element.press_keys = lambda text: self.__press_keys(element, text)
65
69
  element.query_selector = (
66
70
  lambda selector: self.__query_selector(element, selector)
67
71
  )
@@ -211,7 +215,8 @@ class CDPMethods():
211
215
  element = self.__add_sync_methods(element.parent)
212
216
  return self.__add_sync_methods(element)
213
217
  elif (
214
- element.parent.parent
218
+ element.parent
219
+ and element.parent.parent
215
220
  and tag_name in element.parent.parent.tag_name.lower()
216
221
  and text.strip() in element.parent.parent.text
217
222
  ):
@@ -272,7 +277,8 @@ class CDPMethods():
272
277
  if element not in updated_elements:
273
278
  updated_elements.append(element)
274
279
  elif (
275
- element.parent.parent
280
+ element.parent
281
+ and element.parent.parent
276
282
  and tag_name in element.parent.parent.tag_name.lower()
277
283
  and text.strip() in element.parent.parent.text
278
284
  ):
@@ -423,6 +429,39 @@ class CDPMethods():
423
429
  self.loop.run_until_complete(element.focus_async())
424
430
  )
425
431
 
432
+ def __gui_click(self, element, timeframe=None):
433
+ element.scroll_into_view()
434
+ self.__add_light_pause()
435
+ position = element.get_position()
436
+ x = position.x
437
+ y = position.y
438
+ e_width = position.width
439
+ e_height = position.height
440
+ # Relative to window
441
+ element_rect = {"height": e_height, "width": e_width, "x": x, "y": y}
442
+ window_rect = self.get_window_rect()
443
+ w_bottom_y = window_rect["y"] + window_rect["height"]
444
+ viewport_height = window_rect["innerHeight"]
445
+ x = window_rect["x"] + element_rect["x"]
446
+ y = w_bottom_y - viewport_height + element_rect["y"]
447
+ y_scroll_offset = window_rect["pageYOffset"]
448
+ y = y - y_scroll_offset
449
+ x = x + window_rect["scrollX"]
450
+ y = y + window_rect["scrollY"]
451
+ # Relative to screen
452
+ element_rect = {"height": e_height, "width": e_width, "x": x, "y": y}
453
+ e_width = element_rect["width"]
454
+ e_height = element_rect["height"]
455
+ e_x = element_rect["x"]
456
+ e_y = element_rect["y"]
457
+ x, y = ((e_x + e_width / 2.0) + 0.5), ((e_y + e_height / 2.0) + 0.5)
458
+ if not timeframe or not isinstance(timeframe, (int, float)):
459
+ timeframe = 0.25
460
+ if timeframe > 3:
461
+ timeframe = 3
462
+ self.gui_click_x_y(x, y, timeframe=timeframe)
463
+ return self.loop.run_until_complete(self.page.wait())
464
+
426
465
  def __highlight_overlay(self, element):
427
466
  return (
428
467
  self.loop.run_until_complete(element.highlight_overlay_async())
@@ -445,6 +484,21 @@ class CDPMethods():
445
484
  self.loop.run_until_complete(element.mouse_move_async())
446
485
  )
447
486
 
487
+ def __press_keys(self, element, text):
488
+ element.scroll_into_view()
489
+ submit = False
490
+ if text.endswith("\n") or text.endswith("\r"):
491
+ submit = True
492
+ text = text[:-1]
493
+ for key in text:
494
+ element.send_keys(key)
495
+ time.sleep(0.044)
496
+ if submit:
497
+ element.send_keys("\r\n")
498
+ time.sleep(0.044)
499
+ self.__slow_mode_pause_if_set()
500
+ return self.loop.run_until_complete(self.page.wait())
501
+
448
502
  def __query_selector(self, element, selector):
449
503
  selector = self.__convert_to_css_if_xpath(selector)
450
504
  element2 = self.loop.run_until_complete(
@@ -1681,21 +1735,79 @@ class CDPMethods():
1681
1735
  return True
1682
1736
  return False
1683
1737
 
1684
- def wait_for_element_visible(self, selector, timeout=None):
1738
+ def is_text_visible(self, text, selector="body"):
1739
+ selector = self.__convert_to_css_if_xpath(selector)
1740
+ text = text.strip()
1741
+ element = None
1742
+ try:
1743
+ element = self.find_element(selector, timeout=0.1)
1744
+ except Exception:
1745
+ return False
1746
+ with suppress(Exception):
1747
+ if text in element.text_all:
1748
+ return True
1749
+ return False
1750
+
1751
+ def is_exact_text_visible(self, text, selector="body"):
1752
+ selector = self.__convert_to_css_if_xpath(selector)
1753
+ text = text.strip()
1754
+ element = None
1755
+ try:
1756
+ element = self.find_element(selector, timeout=0.1)
1757
+ except Exception:
1758
+ return False
1759
+ with suppress(Exception):
1760
+ if text == element.text_all.strip():
1761
+ return True
1762
+ return False
1763
+
1764
+ def wait_for_text(self, text, selector="body", timeout=None):
1685
1765
  if not timeout:
1686
1766
  timeout = settings.SMALL_TIMEOUT
1767
+ start_ms = time.time() * 1000.0
1768
+ stop_ms = start_ms + (timeout * 1000.0)
1769
+ text = text.strip()
1770
+ element = None
1687
1771
  try:
1688
- self.select(selector, timeout=timeout)
1772
+ element = self.find_element(selector, timeout=timeout)
1689
1773
  except Exception:
1690
- raise Exception("Element {%s} was not found!" % selector)
1691
- for i in range(30):
1692
- if self.is_element_visible(selector):
1693
- return self.select(selector)
1774
+ raise Exception("Element {%s} not found!" % selector)
1775
+ for i in range(int(timeout * 10)):
1776
+ with suppress(Exception):
1777
+ element = self.find_element(selector, timeout=0.1)
1778
+ if text in element.text_all:
1779
+ return True
1780
+ now_ms = time.time() * 1000.0
1781
+ if now_ms >= stop_ms:
1782
+ break
1694
1783
  time.sleep(0.1)
1695
- raise Exception("Element {%s} was not visible!" % selector)
1784
+ raise Exception(
1785
+ "Text {%s} not found in {%s}! Actual text: {%s}"
1786
+ % (text, selector, element.text_all)
1787
+ )
1696
1788
 
1697
- def assert_element(self, selector, timeout=None):
1698
- """Same as assert_element_visible()"""
1789
+ def wait_for_text_not_visible(self, text, selector="body", timeout=None):
1790
+ if not timeout:
1791
+ timeout = settings.SMALL_TIMEOUT
1792
+ text = text.strip()
1793
+ start_ms = time.time() * 1000.0
1794
+ stop_ms = start_ms + (timeout * 1000.0)
1795
+ for i in range(int(timeout * 10)):
1796
+ if not self.is_text_visible(text, selector):
1797
+ return True
1798
+ now_ms = time.time() * 1000.0
1799
+ if now_ms >= stop_ms:
1800
+ break
1801
+ time.sleep(0.1)
1802
+ plural = "s"
1803
+ if timeout == 1:
1804
+ plural = ""
1805
+ raise Exception(
1806
+ "Text {%s} in {%s} was still visible after %s second%s!"
1807
+ % (text, selector, timeout, plural)
1808
+ )
1809
+
1810
+ def wait_for_element_visible(self, selector, timeout=None):
1699
1811
  if not timeout:
1700
1812
  timeout = settings.SMALL_TIMEOUT
1701
1813
  try:
@@ -1704,10 +1816,15 @@ class CDPMethods():
1704
1816
  raise Exception("Element {%s} was not found!" % selector)
1705
1817
  for i in range(30):
1706
1818
  if self.is_element_visible(selector):
1707
- return True
1819
+ return self.select(selector)
1708
1820
  time.sleep(0.1)
1709
1821
  raise Exception("Element {%s} was not visible!" % selector)
1710
1822
 
1823
+ def assert_element(self, selector, timeout=None):
1824
+ """Same as assert_element_visible()"""
1825
+ self.assert_element_visible(selector, timeout=timeout)
1826
+ return True
1827
+
1711
1828
  def assert_element_visible(self, selector, timeout=None):
1712
1829
  """Same as assert_element()"""
1713
1830
  if not timeout:
@@ -1852,29 +1969,9 @@ class CDPMethods():
1852
1969
  raise Exception(error % (expected, actual))
1853
1970
 
1854
1971
  def assert_text(self, text, selector="body", timeout=None):
1855
- if not timeout:
1856
- timeout = settings.SMALL_TIMEOUT
1857
- start_ms = time.time() * 1000.0
1858
- stop_ms = start_ms + (timeout * 1000.0)
1859
- text = text.strip()
1860
- element = None
1861
- try:
1862
- element = self.find_element(selector, timeout=timeout)
1863
- except Exception:
1864
- raise Exception("Element {%s} not found!" % selector)
1865
- for i in range(int(timeout * 10)):
1866
- with suppress(Exception):
1867
- element = self.find_element(selector, timeout=0.1)
1868
- if text in element.text_all:
1869
- return True
1870
- now_ms = time.time() * 1000.0
1871
- if now_ms >= stop_ms:
1872
- break
1873
- time.sleep(0.1)
1874
- raise Exception(
1875
- "Text {%s} not found in {%s}! Actual text: {%s}"
1876
- % (text, selector, element.text_all)
1877
- )
1972
+ """Same as wait_for_text()"""
1973
+ self.wait_for_text(text, selector=selector, timeout=timeout)
1974
+ return True
1878
1975
 
1879
1976
  def assert_exact_text(self, text, selector="body", timeout=None):
1880
1977
  if not timeout:
@@ -1904,6 +2001,13 @@ class CDPMethods():
1904
2001
  % (text, element.text_all, selector)
1905
2002
  )
1906
2003
 
2004
+ def assert_text_not_visible(self, text, selector="body", timeout=None):
2005
+ """Raises an exception if the text is still visible after timeout."""
2006
+ self.wait_for_text_not_visible(
2007
+ text, selector=selector, timeout=timeout
2008
+ )
2009
+ return True
2010
+
1907
2011
  def assert_true(self, expression):
1908
2012
  if not expression:
1909
2013
  raise AssertionError("%s is not true" % expression)
@@ -1454,6 +1454,8 @@ class BaseCase(unittest.TestCase):
1454
1454
 
1455
1455
  def is_text_visible(self, text, selector="body", by="css selector"):
1456
1456
  """Returns whether the text substring is visible in the element."""
1457
+ if self.__is_cdp_swap_needed():
1458
+ return self.cdp.is_text_visible(text, selector)
1457
1459
  self.wait_for_ready_state_complete()
1458
1460
  time.sleep(0.01)
1459
1461
  selector, by = self.__recalculate_selector(selector, by)
@@ -1464,6 +1466,8 @@ class BaseCase(unittest.TestCase):
1464
1466
  def is_exact_text_visible(self, text, selector="body", by="css selector"):
1465
1467
  """Returns whether the text is exactly equal to the element text.
1466
1468
  (Leading and trailing whitespace is ignored in the verification.)"""
1469
+ if self.__is_cdp_swap_needed():
1470
+ return self.cdp.is_exact_text_visible(text, selector)
1467
1471
  self.wait_for_ready_state_complete()
1468
1472
  time.sleep(0.01)
1469
1473
  selector, by = self.__recalculate_selector(selector, by)
@@ -9281,7 +9285,8 @@ class BaseCase(unittest.TestCase):
9281
9285
  "bottom_left", "bottom_center", "bottom_right"]
9282
9286
  max_messages: The limit of concurrent messages to display."""
9283
9287
  self.__check_scope()
9284
- self._check_browser()
9288
+ if not self.__is_cdp_swap_needed():
9289
+ self._check_browser()
9285
9290
  if not theme:
9286
9291
  theme = "default" # "flat"
9287
9292
  if not location:
@@ -9308,7 +9313,8 @@ class BaseCase(unittest.TestCase):
9308
9313
  You can also post messages by using =>
9309
9314
  self.execute_script('Messenger().post("My Message")') """
9310
9315
  self.__check_scope()
9311
- self._check_browser()
9316
+ if not self.__is_cdp_swap_needed():
9317
+ self._check_browser()
9312
9318
  if style not in ["info", "success", "error"]:
9313
9319
  style = "info"
9314
9320
  if not duration:
@@ -10326,6 +10332,10 @@ class BaseCase(unittest.TestCase):
10326
10332
  if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
10327
10333
  timeout = self.__get_new_timeout(timeout)
10328
10334
  selector, by = self.__recalculate_selector(selector, by)
10335
+ if self.__is_cdp_swap_needed():
10336
+ return self.cdp.wait_for_text(
10337
+ text, selector=selector, timeout=timeout
10338
+ )
10329
10339
  return page_actions.wait_for_text_not_visible(
10330
10340
  self.driver, text, selector, by, timeout
10331
10341
  )
@@ -13909,7 +13919,8 @@ class BaseCase(unittest.TestCase):
13909
13919
  js_utils.highlight_element_with_js(self.driver, element, loops, o_bs)
13910
13920
 
13911
13921
  def __highlight_with_jquery(self, selector, loops, o_bs):
13912
- self.wait_for_ready_state_complete()
13922
+ if not self.__is_cdp_swap_needed():
13923
+ self.wait_for_ready_state_complete()
13913
13924
  js_utils.highlight_with_jquery(self.driver, selector, loops, o_bs)
13914
13925
 
13915
13926
  def __highlight_with_js_2(self, message, selector, o_bs):
@@ -585,52 +585,60 @@ def highlight_with_jquery(driver, selector, loops=4, o_bs=""):
585
585
  '0px 0px 6px 6px rgba(128, 128, 128, 0.5)');"""
586
586
  % selector
587
587
  )
588
- safe_execute_script(driver, script)
588
+ with suppress(Exception):
589
+ safe_execute_script(driver, script)
589
590
  for n in range(loops):
590
591
  script = (
591
592
  """jQuery('%s').css('box-shadow',
592
593
  '0px 0px 6px 6px rgba(255, 0, 0, 1)');"""
593
594
  % selector
594
595
  )
595
- execute_script(driver, script)
596
+ with suppress(Exception):
597
+ execute_script(driver, script)
596
598
  time.sleep(0.0181)
597
599
  script = (
598
600
  """jQuery('%s').css('box-shadow',
599
601
  '0px 0px 6px 6px rgba(128, 0, 128, 1)');"""
600
602
  % selector
601
603
  )
602
- execute_script(driver, script)
604
+ with suppress(Exception):
605
+ execute_script(driver, script)
603
606
  time.sleep(0.0181)
604
607
  script = (
605
608
  """jQuery('%s').css('box-shadow',
606
609
  '0px 0px 6px 6px rgba(0, 0, 255, 1)');"""
607
610
  % selector
608
611
  )
609
- execute_script(driver, script)
612
+ with suppress(Exception):
613
+ execute_script(driver, script)
610
614
  time.sleep(0.0181)
611
615
  script = (
612
616
  """jQuery('%s').css('box-shadow',
613
617
  '0px 0px 6px 6px rgba(0, 255, 0, 1)');"""
614
618
  % selector
615
619
  )
616
- execute_script(driver, script)
620
+ with suppress(Exception):
621
+ execute_script(driver, script)
617
622
  time.sleep(0.0181)
618
623
  script = (
619
624
  """jQuery('%s').css('box-shadow',
620
625
  '0px 0px 6px 6px rgba(128, 128, 0, 1)');"""
621
626
  % selector
622
627
  )
623
- execute_script(driver, script)
628
+ with suppress(Exception):
629
+ execute_script(driver, script)
624
630
  time.sleep(0.0181)
625
631
  script = (
626
632
  """jQuery('%s').css('box-shadow',
627
633
  '0px 0px 6px 6px rgba(128, 0, 128, 1)');"""
628
634
  % selector
629
635
  )
630
- execute_script(driver, script)
636
+ with suppress(Exception):
637
+ execute_script(driver, script)
631
638
  time.sleep(0.0181)
632
639
  script = """jQuery('%s').css('box-shadow', '%s');""" % (selector, o_bs)
633
- execute_script(driver, script)
640
+ with suppress(Exception):
641
+ execute_script(driver, script)
634
642
 
635
643
 
636
644
  def add_css_link(driver, css_link):
@@ -924,9 +932,20 @@ def post_message(driver, message, msg_dur=None, style="info"):
924
932
  """hideAfter: %s, hideOnNavigate: true});"""
925
933
  % (message, style, msg_dur)
926
934
  )
935
+ retry = False
927
936
  try:
928
937
  execute_script(driver, messenger_script)
938
+ except TypeError as e:
939
+ if (
940
+ shared_utils.is_cdp_swap_needed(driver)
941
+ and "cannot unpack non-iterable" in str(e)
942
+ ):
943
+ pass
944
+ else:
945
+ retry = True
929
946
  except Exception:
947
+ retry = True
948
+ if retry:
930
949
  activate_messenger(driver)
931
950
  set_messenger_theme(driver)
932
951
  try:
@@ -1273,7 +1292,10 @@ def slow_scroll_to_element(driver, element, *args, **kwargs):
1273
1292
  scroll_position = execute_script(driver, "return window.scrollY;")
1274
1293
  element_location_y = None
1275
1294
  try:
1276
- element_location_y = element.location["y"]
1295
+ if shared_utils.is_cdp_swap_needed(driver):
1296
+ element.get_position().y
1297
+ else:
1298
+ element_location_y = element.location["y"]
1277
1299
  except Exception:
1278
1300
  element.location_once_scrolled_into_view
1279
1301
  return
@@ -208,7 +208,6 @@ class Base(Plugin):
208
208
  self.duration = float(0)
209
209
  self.page_results_list = []
210
210
  self.test_count = 0
211
- self.import_error = False
212
211
  log_path = constants.Logs.LATEST + "/"
213
212
  archive_logs = options.archive_logs
214
213
  log_helper.log_folder_setup(log_path, archive_logs)
@@ -238,6 +237,7 @@ class Base(Plugin):
238
237
  )
239
238
  else:
240
239
  variables = {}
240
+ test.test.test_id = test.id()
241
241
  test.test.is_nosetest = True
242
242
  test.test.environment = self.options.environment
243
243
  test.test.env = self.options.environment # Add a shortened version
@@ -263,17 +263,16 @@ class Base(Plugin):
263
263
  )
264
264
  log_helper.clear_empty_logs()
265
265
  if self.report_on:
266
- if not self.import_error:
267
- report_helper.add_bad_page_log_file(self.page_results_list)
268
- report_log_path = report_helper.archive_new_report_logs()
269
- report_helper.build_report(
270
- report_log_path,
271
- self.page_results_list,
272
- self.successes,
273
- self.failures,
274
- self.options.browser,
275
- self.show_report,
276
- )
266
+ report_helper.add_bad_page_log_file(self.page_results_list)
267
+ report_log_path = report_helper.archive_new_report_logs()
268
+ report_helper.build_report(
269
+ report_log_path,
270
+ self.page_results_list,
271
+ self.successes,
272
+ self.failures,
273
+ self.options.browser,
274
+ self.show_report,
275
+ )
277
276
 
278
277
  def addSuccess(self, test, capt):
279
278
  if self.report_on:
@@ -293,9 +292,6 @@ class Base(Plugin):
293
292
  "%.2fs" % (float(time.time()) - float(self.start_time))
294
293
  )
295
294
  if test.id() == "nose.failure.Failure.runTest":
296
- print(">>> ERROR: Could not locate tests to run!")
297
- print(">>> The Test Report WILL NOT be generated!")
298
- self.import_error = True
299
295
  return
300
296
  self.failures.append(test.id())
301
297
  self.page_results_list.append(
@@ -314,6 +310,7 @@ class Base(Plugin):
314
310
  test._log_fail_data()
315
311
  sb_config._excinfo_tb = err
316
312
  log_path = None
313
+ source = None
317
314
  if hasattr(sb_config, "_test_logpath"):
318
315
  log_path = sb_config._test_logpath
319
316
  if hasattr(sb_config, "_last_page_source"):
@@ -1309,6 +1309,7 @@ class SeleniumBrowser(Plugin):
1309
1309
  test.test.dashboard = False
1310
1310
  test.test._multithreaded = False
1311
1311
  test.test._reuse_session = False
1312
+ sb_config.recorder_mode = test.test.recorder_mode
1312
1313
  sb_config.no_screenshot = test.test.no_screenshot_after_test
1313
1314
  if test.test.servername != "localhost":
1314
1315
  # Using Selenium Grid
@@ -265,6 +265,8 @@ class Browser:
265
265
  :param new_window: Open new window
266
266
  :return: Page
267
267
  """
268
+ if url and ":" not in url:
269
+ url = "https://" + url
268
270
  if new_tab or new_window:
269
271
  # Create new target using the browser session.
270
272
  target_id = await self.connection.send(