seleniumbase 4.26.3__tar.gz → 4.27.0__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 (516) hide show
  1. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/PKG-INFO +12 -9
  2. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/README.md +1 -0
  3. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/hack_the_planet.py +9 -12
  4. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/presenter/fundamentals.py +0 -1
  5. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/raw_parameter_script.py +1 -0
  6. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/uc_cdp_events.py +1 -1
  7. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/customizing_test_runs.md +1 -0
  8. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/method_summary.md +2 -0
  9. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/recorder_mode.md +2 -0
  10. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/requirements.txt +6 -6
  11. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/requirements.txt +6 -5
  12. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/__version__.py +1 -1
  13. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/ReadMe.md +1 -0
  14. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/run.py +2 -0
  15. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_mkrec.py +39 -0
  16. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_recorder.py +2 -0
  17. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/browser_launcher.py +63 -6
  18. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/base_case.py +68 -4
  19. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/constants.py +1 -0
  20. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/pytest_plugin.py +12 -0
  21. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/selenium_plugin.py +12 -0
  22. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/undetected/webelement.py +1 -1
  23. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase.egg-info/PKG-INFO +12 -9
  24. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase.egg-info/requires.txt +14 -8
  25. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/setup.py +10 -8
  26. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/.github/Workflows.md +0 -0
  27. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/.github/workflows/pages.yml +0 -0
  28. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/.github/workflows/python-nightly-mac.yml +0 -0
  29. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/.github/workflows/python-nightly-ubuntu.yml +0 -0
  30. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/.github/workflows/python-nightly-windows.yml +0 -0
  31. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/.github/workflows/python-package.yml +0 -0
  32. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/.gitignore +0 -0
  33. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/CHANGELOG.md +0 -0
  34. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/CNAME +0 -0
  35. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/CODE_OF_CONDUCT.md +0 -0
  36. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/CONTRIBUTING.md +0 -0
  37. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/Dockerfile +0 -0
  38. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/LICENSE +0 -0
  39. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/MANIFEST.in +0 -0
  40. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/SECURITY.md +0 -0
  41. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/_config.yml +0 -0
  42. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/azure-pipelines.yml +0 -0
  43. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/ReadMe.md +0 -0
  44. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/__init__.py +0 -0
  45. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/basic_test.py +0 -0
  46. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/ReadMe.md +0 -0
  47. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/__init__.py +0 -0
  48. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/behave.ini +0 -0
  49. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/__init__.py +0 -0
  50. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/behave.ini +0 -0
  51. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/calculator.feature +0 -0
  52. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/environment.py +0 -0
  53. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/fail_page.feature +0 -0
  54. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/realworld.feature +0 -0
  55. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/steps/__init__.py +0 -0
  56. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/steps/calculator.py +0 -0
  57. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/steps/fail_page.py +0 -0
  58. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/steps/imported.py +0 -0
  59. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
  60. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/behave_bdd/features/swag_labs.feature +0 -0
  61. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/ReadMe.md +0 -0
  62. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/__init__.py +0 -0
  63. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/base_test_case.py +0 -0
  64. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/boilerplate_test.py +0 -0
  65. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/classic_obj_test.py +0 -0
  66. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/page_objects.py +0 -0
  67. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/__init__.py +0 -0
  68. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
  69. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
  70. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/file_parsing/qa_login_example.txt +0 -0
  71. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/file_parsing/staging_login_example.txt +0 -0
  72. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/google_objects.py +0 -0
  73. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/google_test.py +0 -0
  74. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/sb_swag_test.py +0 -0
  75. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/swag_labs_test.py +0 -0
  76. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/samples/test_page_objects.py +0 -0
  77. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/boilerplates/sb_fixture_test.py +0 -0
  78. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/capabilities/ReadMe.md +0 -0
  79. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/capabilities/mac_cap_file.py +0 -0
  80. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/capabilities/sample_cap_file_BS.py +0 -0
  81. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/capabilities/sample_cap_file_SL.py +0 -0
  82. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/capabilities/selenoid_cap_file.py +0 -0
  83. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/capabilities/win10_cap_file.py +0 -0
  84. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_plans/basic_test.MyTestClass.test_basics.md +0 -0
  85. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_plans/my_first_test.MyTestClass.test_swag_labs.md +0 -0
  86. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_plans/shadow_root_test.ShadowRootTest.test_shadow_root.md +0 -0
  87. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_plans/test_assert_elements.ListAssertTests.test_assert_list_of_elements.md +0 -0
  88. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_plans/test_calculator.CalculatorTests.test_6_times_7_plus_12_equals_54.md +0 -0
  89. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_plans/test_demo_site.DemoSiteTests.test_demo_site.md +0 -0
  90. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_plans/test_login.SwagLabsLoginTests.test_swag_labs_login.md +0 -0
  91. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_plans/test_mfa_login.TestMFALogin.test_mfa_login.md +0 -0
  92. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/case_summary.md +0 -0
  93. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/ReadMe.md +0 -0
  94. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/chart_presentation.py +0 -0
  95. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/my_chart.py +0 -0
  96. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/pie_charts.py +0 -0
  97. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/test_area_chart.py +0 -0
  98. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/test_display_chart.py +0 -0
  99. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/test_line_chart.py +0 -0
  100. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/test_multi_series.py +0 -0
  101. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/chart_maker/test_save_chart.py +0 -0
  102. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/coffee_cart_tests.py +0 -0
  103. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/custom_settings.py +0 -0
  104. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/desktop_apps/ReadMe.md +0 -0
  105. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/desktop_apps/recorder.py +0 -0
  106. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/dialog_boxes/ReadMe.md +0 -0
  107. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/dialog_boxes/dialog_box_tour.py +0 -0
  108. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/edge_test.py +0 -0
  109. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/example_config.cfg +0 -0
  110. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/example_logs/ReadMe.md +0 -0
  111. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/example_logs/basic_test_info.txt +0 -0
  112. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/example_logs/page_source.html +0 -0
  113. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/example_logs/screenshot.png +0 -0
  114. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/github_test.py +0 -0
  115. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/gui_test_runner.py +0 -0
  116. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/handle_alert_test.py +0 -0
  117. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/iframe_tests.py +0 -0
  118. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/locale_code_test.py +0 -0
  119. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/master_qa/ReadMe.md +0 -0
  120. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/master_qa/__init__.py +0 -0
  121. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/master_qa/basic_masterqa_test_0.py +0 -0
  122. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/master_qa/masterqa_test_1.py +0 -0
  123. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/master_qa/pytest.ini +0 -0
  124. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/__init__.py +0 -0
  125. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/protractor/ReadMe.md +0 -0
  126. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/protractor/__init__.py +0 -0
  127. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/protractor/example_spec.js +0 -0
  128. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/protractor/example_test.py +0 -0
  129. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/protractor/input_spec.js +0 -0
  130. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/protractor/input_test.py +0 -0
  131. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/protractor/mat_paginator_spec.js +0 -0
  132. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/protractor/mat_paginator_test.py +0 -0
  133. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/raw_selenium/ReadMe.md +0 -0
  134. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/raw_selenium/__init__.py +0 -0
  135. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
  136. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
  137. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/raw_selenium/messy_raw.py +0 -0
  138. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/raw_selenium/pytest.ini +0 -0
  139. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/raw_selenium/refined_raw.py +0 -0
  140. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/migration/raw_selenium/simple_sbase.py +0 -0
  141. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/my_first_test.py +0 -0
  142. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/nth_child_test.py +0 -0
  143. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/offline_examples/__init__.py +0 -0
  144. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/offline_examples/demo_page.html +0 -0
  145. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/offline_examples/load_html_test.py +0 -0
  146. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/offline_examples/test_demo_page.py +0 -0
  147. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/offline_examples/test_handle_alerts.py +0 -0
  148. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/offline_examples/test_request_fixture.py +0 -0
  149. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/offline_examples/test_user_agent.py +0 -0
  150. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/old_wordle_script.py +0 -0
  151. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/parameterized_test.py +0 -0
  152. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/performance_test.py +0 -0
  153. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/presenter/ReadMe.md +0 -0
  154. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/presenter/core_presentation.py +0 -0
  155. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/presenter/edge_presentation.py +0 -0
  156. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/presenter/my_presentation.py +0 -0
  157. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/presenter/py_virtual_envs.py +0 -0
  158. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/proxy_test.py +0 -0
  159. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/pytest.ini +0 -0
  160. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/rate_limiting_test.py +0 -0
  161. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/raw_call.py +0 -0
  162. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/raw_driver_context.py +0 -0
  163. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/raw_file_call.py +0 -0
  164. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/raw_main_call.py +0 -0
  165. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/raw_sb.py +0 -0
  166. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/raw_test_scripts.py +0 -0
  167. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/raw_uc_mode.py +0 -0
  168. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/setup.cfg +0 -0
  169. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/shadow_root_test.py +0 -0
  170. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/swag_labs_user_tests.py +0 -0
  171. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_apple_site.py +0 -0
  172. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_assert_elements.py +0 -0
  173. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_calculator.py +0 -0
  174. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_canvas.py +0 -0
  175. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_checkboxes.py +0 -0
  176. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_chinese_pdf.py +0 -0
  177. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_chromedriver.py +0 -0
  178. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_coffee_cart.py +0 -0
  179. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_console_logging.py +0 -0
  180. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_contains_selector.py +0 -0
  181. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_cycle_elements.py +0 -0
  182. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_decryption.py +0 -0
  183. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_deferred_asserts.py +0 -0
  184. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_demo_site.py +0 -0
  185. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_detect_404s.py +0 -0
  186. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_docs_site.py +0 -0
  187. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_double_click.py +0 -0
  188. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_download_files.py +0 -0
  189. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_download_images.py +0 -0
  190. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_drag_and_drop.py +0 -0
  191. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_error_page.py +0 -0
  192. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_event_firing.py +0 -0
  193. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_fail.py +0 -0
  194. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_geolocation.py +0 -0
  195. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_get_coffee.py +0 -0
  196. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_get_locale_code.py +0 -0
  197. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_get_pdf_text.py +0 -0
  198. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_get_user_agent.py +0 -0
  199. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_hack_search.py +0 -0
  200. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_image_saving.py +0 -0
  201. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_inspect_html.py +0 -0
  202. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_login.py +0 -0
  203. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_markers.py +0 -0
  204. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_mfa_login.py +0 -0
  205. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_multiple_drivers.py +0 -0
  206. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_null.py +0 -0
  207. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_override_driver.py +0 -0
  208. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_override_sb_fixture.py +0 -0
  209. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_parse_soup.py +0 -0
  210. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_pdf_asserts.py +0 -0
  211. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_pytest_parametrize.py +0 -0
  212. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_repeat_tests.py +0 -0
  213. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_request_sb_fixture.py +0 -0
  214. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_save_screenshots.py +0 -0
  215. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_sb_fixture.py +0 -0
  216. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_scrape_bing.py +0 -0
  217. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_select_options.py +0 -0
  218. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_shadow_dom.py +0 -0
  219. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_show_file_choosers.py +0 -0
  220. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_skype_site.py +0 -0
  221. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_suite.py +0 -0
  222. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_swag_labs.py +0 -0
  223. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_tinymce.py +0 -0
  224. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_todomvc.py +0 -0
  225. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_url_asserts.py +0 -0
  226. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_usefixtures.py +0 -0
  227. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_verify_chromedriver.py +0 -0
  228. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_window_switching.py +0 -0
  229. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_xfail.py +0 -0
  230. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/test_xkcd.py +0 -0
  231. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/time_limit_test.py +0 -0
  232. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/ReadMe.md +0 -0
  233. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/bootstrap_google_tour.py +0 -0
  234. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
  235. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/driverjs_maps_tour.py +0 -0
  236. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/google_tour.py +0 -0
  237. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/hopscotch_google_tour.py +0 -0
  238. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/introjs_google_tour.py +0 -0
  239. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/maps_introjs_tour.py +0 -0
  240. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/octocat_tour.py +0 -0
  241. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/shepherd_google_tour.py +0 -0
  242. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/tour_examples/xkcd_tour.py +0 -0
  243. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/ReadMe.md +0 -0
  244. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/chinese_test_1.py +0 -0
  245. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/dutch_test_1.py +0 -0
  246. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/english_test_1.py +0 -0
  247. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/french_test_1.py +0 -0
  248. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/italian_test_1.py +0 -0
  249. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/japanese_test_1.py +0 -0
  250. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/korean_test_1.py +0 -0
  251. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/portuguese_test_1.py +0 -0
  252. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/pytest.ini +0 -0
  253. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/russian_test_1.py +0 -0
  254. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/translations/spanish_test_1.py +0 -0
  255. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/unit_tests/ReadMe.md +0 -0
  256. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/unit_tests/verify_framework.py +0 -0
  257. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/upgrade_chromedriver.py +0 -0
  258. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/upload_file_test.py +0 -0
  259. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/user_agent_test.py +0 -0
  260. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/verify_undetected.py +0 -0
  261. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/ReadMe.md +0 -0
  262. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/__init__.py +0 -0
  263. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/case_plans/layout_test.VisualLayoutTests.test_applitools_layout_change.md +0 -0
  264. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/case_plans/python_home_test.VisualLayoutTests.test_python_home_layout_change.md +0 -0
  265. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_applitools_change.md +0 -0
  266. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_xkcd_logo_change.md +0 -0
  267. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/case_plans/test_layout_fail.VisualLayout_FixtureTests.test_python_home_change.md +0 -0
  268. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/case_plans/xkcd_visual_test.VisualLayoutTests.test_xkcd_layout_change.md +0 -0
  269. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/layout_test.py +0 -0
  270. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/python_home_test.py +0 -0
  271. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/test_layout_fail.py +0 -0
  272. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/visual_testing/xkcd_visual_test.py +0 -0
  273. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/wordle_test.py +0 -0
  274. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/xpath_test.py +0 -0
  275. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/examples/youtube_search_test.py +0 -0
  276. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/ReadMe.md +0 -0
  277. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/behave_gui.md +0 -0
  278. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/case_plans.md +0 -0
  279. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/chinese.md +0 -0
  280. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/commander.md +0 -0
  281. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/demo_mode.md +0 -0
  282. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/desired_capabilities.md +0 -0
  283. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/features_list.md +0 -0
  284. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/handling_iframes.md +0 -0
  285. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/happy_customers.md +0 -0
  286. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/hidden_files_info.md +0 -0
  287. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/how_it_works.md +0 -0
  288. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/html_inspector.md +0 -0
  289. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/install.md +0 -0
  290. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/install_python_pip_git.md +0 -0
  291. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/js_package_manager.md +0 -0
  292. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/locale_codes.md +0 -0
  293. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/mobile_testing.md +0 -0
  294. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/mysql_installation.md +0 -0
  295. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/shadow_dom.md +0 -0
  296. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/syntax_formats.md +0 -0
  297. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/thank_you.md +0 -0
  298. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/translations.md +0 -0
  299. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/useful_grep_commands.md +0 -0
  300. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/using_safari_driver.md +0 -0
  301. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/verify_webdriver.md +0 -0
  302. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/virtualenv_instructions.md +0 -0
  303. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/help_docs/webdriver_installation.md +0 -0
  304. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/install.sh +0 -0
  305. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/__init__.py +0 -0
  306. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/azure/azure_pipelines/ReadMe.md +0 -0
  307. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/azure/jenkins/ReadMe.md +0 -0
  308. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/ReadMe.md +0 -0
  309. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/behave.ini +0 -0
  310. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/__init__.py +0 -0
  311. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/behave.ini +0 -0
  312. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/calculator.feature +0 -0
  313. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/environment.py +0 -0
  314. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/fail_page.feature +0 -0
  315. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/realworld.feature +0 -0
  316. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/steps/__init__.py +0 -0
  317. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/steps/calculator.py +0 -0
  318. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/steps/fail_page.py +0 -0
  319. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/steps/real_world.py +0 -0
  320. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/steps/swag_labs.py +0 -0
  321. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/behave/features/swag_labs.feature +0 -0
  322. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/brython/ReadMe.md +0 -0
  323. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/brython/index.html +0 -0
  324. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/brython/index.py +0 -0
  325. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/brython/library.html +0 -0
  326. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/docker/ReadMe.md +0 -0
  327. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/docker/docker-entrypoint.sh +0 -0
  328. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/docker/run_docker_test_in_chrome.sh +0 -0
  329. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/github/ReadMe.md +0 -0
  330. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/github/workflows/ReadMe.md +0 -0
  331. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/github/workflows/extras.md +0 -0
  332. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/google_cloud/ReadMe.md +0 -0
  333. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/katalon/ReadMe.md +0 -0
  334. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/linux/Linuxfile.sh +0 -0
  335. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/linux/ReadMe.md +0 -0
  336. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/linux/Xvfb_launcher.sh +0 -0
  337. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/linux/jenkins_permissions.sh +0 -0
  338. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/linux/tomcat_permissions.sh +0 -0
  339. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/node_js/ReadMe.md +0 -0
  340. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/node_js/__init__.py +0 -0
  341. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/node_js/index.html +0 -0
  342. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/node_js/my_first_test.py +0 -0
  343. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/node_js/npm-shrinkwrap.json +0 -0
  344. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/node_js/package.json +0 -0
  345. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/node_js/server.js +0 -0
  346. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/node_js/test_demo_site.py +0 -0
  347. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/selenium_grid/ReadMe.md +0 -0
  348. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/integrations/selenium_ide/ReadMe.md +0 -0
  349. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs.yml +0 -0
  350. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/ReadMe.txt +0 -0
  351. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/docs_instructions.txt +0 -0
  352. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/dash_pie.png +0 -0
  353. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/dash_pie_2.png +0 -0
  354. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/dash_pie_3.png +0 -0
  355. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/favicon.ico +0 -0
  356. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/grad_logo.png +0 -0
  357. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/green_icon.png +0 -0
  358. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/green_logo.png +0 -0
  359. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/green_logo2.png +0 -0
  360. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/green_logo3.png +0 -0
  361. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/logo3.png +0 -0
  362. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/logo3a.png +0 -0
  363. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/logo3b.png +0 -0
  364. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/logo3c.png +0 -0
  365. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/logo4.png +0 -0
  366. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/logo5.png +0 -0
  367. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/logo6.png +0 -0
  368. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/logo7.png +0 -0
  369. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/sb_icon.png +0 -0
  370. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/sb_logo_10.png +0 -0
  371. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/sb_logo_7.png +0 -0
  372. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/side_by_side.png +0 -0
  373. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/social/share_facebook.svg +0 -0
  374. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/social/share_github.svg +0 -0
  375. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/social/share_gitter.svg +0 -0
  376. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/social/share_instagram.svg +0 -0
  377. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/img/social/share_twitter.svg +0 -0
  378. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/index.txt +0 -0
  379. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/mkdocs_build/prepare.py +0 -0
  380. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/pytest.ini +0 -0
  381. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/sbase/ReadMe.txt +0 -0
  382. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/sbase/__init__.py +0 -0
  383. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/sbase/__main__.py +0 -0
  384. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/sbase/steps.py +0 -0
  385. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/ReadMe.md +0 -0
  386. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/__init__.py +0 -0
  387. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/__main__.py +0 -0
  388. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/behave/__init__.py +0 -0
  389. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/behave/behave_helper.py +0 -0
  390. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/behave/behave_sb.py +0 -0
  391. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/behave/steps.py +0 -0
  392. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/common/ReadMe.md +0 -0
  393. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/common/__init__.py +0 -0
  394. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/common/decorators.py +0 -0
  395. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/common/encryption.py +0 -0
  396. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/common/exceptions.py +0 -0
  397. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/common/obfuscate.py +0 -0
  398. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/common/unobfuscate.py +0 -0
  399. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/config/__init__.py +0 -0
  400. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/config/ad_block_list.py +0 -0
  401. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/config/proxy_list.py +0 -0
  402. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/config/settings.py +0 -0
  403. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/__init__.py +0 -0
  404. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/logo_helper.py +0 -0
  405. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/rich_helper.py +0 -0
  406. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  407. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  408. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_commander.py +0 -0
  409. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_install.py +0 -0
  410. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  411. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  412. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  413. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  414. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  415. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/console_scripts/sb_print.py +0 -0
  416. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/__init__.py +0 -0
  417. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/application_manager.py +0 -0
  418. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/capabilities_parser.py +0 -0
  419. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/colored_traceback.py +0 -0
  420. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/create_db_tables.sql +0 -0
  421. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/detect_b_ver.py +0 -0
  422. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/download_helper.py +0 -0
  423. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/encoded_images.py +0 -0
  424. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/jqc_helper.py +0 -0
  425. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/log_helper.py +0 -0
  426. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/mysql.py +0 -0
  427. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/proxy_helper.py +0 -0
  428. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/recorder_helper.py +0 -0
  429. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/report_helper.py +0 -0
  430. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/s3_manager.py +0 -0
  431. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/sb_driver.py +0 -0
  432. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/session_helper.py +0 -0
  433. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/settings_parser.py +0 -0
  434. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/style_sheet.py +0 -0
  435. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/testcase_manager.py +0 -0
  436. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/tour_helper.py +0 -0
  437. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/core/visual_helper.py +0 -0
  438. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/drivers/ReadMe.md +0 -0
  439. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/drivers/__init__.py +0 -0
  440. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/extensions/ReadMe.md +0 -0
  441. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/extensions/__init__.py +0 -0
  442. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/extensions/ad_block.zip +0 -0
  443. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/extensions/disable_csp.zip +0 -0
  444. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/extensions/recorder.zip +0 -0
  445. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/extensions/sbase_ext.zip +0 -0
  446. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/__init__.py +0 -0
  447. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  448. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/errors.py +0 -0
  449. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/js_utils.py +0 -0
  450. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/page_actions.py +0 -0
  451. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/page_utils.py +0 -0
  452. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/shared_utils.py +0 -0
  453. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/unittest_helper.py +0 -0
  454. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/words.py +0 -0
  455. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  456. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/js_code/__init__.py +0 -0
  457. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/js_code/active_css_js.py +0 -0
  458. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/js_code/live_js.py +0 -0
  459. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/js_code/recorder_js.py +0 -0
  460. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/masterqa/ReadMe.md +0 -0
  461. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/masterqa/__init__.py +0 -0
  462. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/masterqa/master_qa.py +0 -0
  463. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/__init__.py +0 -0
  464. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/base_plugin.py +0 -0
  465. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/basic_test_info.py +0 -0
  466. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  467. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/driver_manager.py +0 -0
  468. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/page_source.py +0 -0
  469. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  470. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/sb_manager.py +0 -0
  471. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/plugins/screen_shots.py +0 -0
  472. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/resources/ReadMe.md +0 -0
  473. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/resources/__init__.py +0 -0
  474. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/resources/favicon.ico +0 -0
  475. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/__init__.py +0 -0
  476. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/chinese.py +0 -0
  477. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/dutch.py +0 -0
  478. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/french.py +0 -0
  479. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/italian.py +0 -0
  480. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/japanese.py +0 -0
  481. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/korean.py +0 -0
  482. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/master_dict.py +0 -0
  483. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/portuguese.py +0 -0
  484. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/russian.py +0 -0
  485. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/spanish.py +0 -0
  486. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/translate/translator.py +0 -0
  487. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/undetected/__init__.py +0 -0
  488. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/undetected/cdp.py +0 -0
  489. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/undetected/dprocess.py +0 -0
  490. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/undetected/options.py +0 -0
  491. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/undetected/patcher.py +0 -0
  492. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/undetected/reactor.py +0 -0
  493. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/__init__.py +0 -0
  494. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/ReadMe.md +0 -0
  495. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  496. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  497. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  498. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  499. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  500. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  501. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  502. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  503. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  504. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  505. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  506. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_ide/ReadMe.md +0 -0
  507. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  508. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  509. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase.egg-info/SOURCES.txt +0 -0
  510. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase.egg-info/dependency_links.txt +0 -0
  511. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase.egg-info/entry_points.txt +0 -0
  512. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/seleniumbase.egg-info/top_level.txt +0 -0
  513. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/setup.cfg +0 -0
  514. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/virtualenv_install.sh +0 -0
  515. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/win_install.bat +0 -0
  516. {seleniumbase-4.26.3 → seleniumbase-4.27.0}/win_virtualenv.bat +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.26.3
3
+ Version: 4.27.0
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
@@ -70,7 +70,7 @@ Requires-Dist: exceptiongroup>=1.2.1
70
70
  Requires-Dist: filelock>=3.12.2; python_version < "3.8"
71
71
  Requires-Dist: filelock>=3.14.0; python_version >= "3.8"
72
72
  Requires-Dist: platformdirs>=4.0.0; python_version < "3.8"
73
- Requires-Dist: platformdirs>=4.2.1; python_version >= "3.8"
73
+ Requires-Dist: platformdirs>=4.2.2; python_version >= "3.8"
74
74
  Requires-Dist: typing-extensions>=4.11.0; python_version >= "3.8"
75
75
  Requires-Dist: parse>=1.20.1
76
76
  Requires-Dist: parse-type>=0.6.2
@@ -87,11 +87,11 @@ Requires-Dist: sniffio==1.3.1
87
87
  Requires-Dist: h11==0.14.0
88
88
  Requires-Dist: outcome==1.3.0.post0
89
89
  Requires-Dist: trio==0.22.2; python_version < "3.8"
90
- Requires-Dist: trio==0.25.0; python_version >= "3.8"
90
+ Requires-Dist: trio==0.25.1; python_version >= "3.8"
91
91
  Requires-Dist: trio-websocket==0.11.1
92
92
  Requires-Dist: wsproto==1.2.0
93
93
  Requires-Dist: selenium==4.11.2; python_version < "3.8"
94
- Requires-Dist: selenium==4.20.0; python_version >= "3.8"
94
+ Requires-Dist: selenium==4.21.0; python_version >= "3.8"
95
95
  Requires-Dist: cssselect==1.2.0
96
96
  Requires-Dist: sortedcontainers==2.4.0
97
97
  Requires-Dist: fasteners==0.19
@@ -117,7 +117,8 @@ Requires-Dist: behave==1.2.6
117
117
  Requires-Dist: soupsieve==2.4.1; python_version < "3.8"
118
118
  Requires-Dist: soupsieve==2.5; python_version >= "3.8"
119
119
  Requires-Dist: beautifulsoup4==4.12.3
120
- Requires-Dist: pygments==2.17.2
120
+ Requires-Dist: pygments==2.17.2; python_version < "3.8"
121
+ Requires-Dist: pygments==2.18.0; python_version >= "3.8"
121
122
  Requires-Dist: pyreadline3==3.4.1; platform_system == "Windows"
122
123
  Requires-Dist: tabcompleter==1.3.0
123
124
  Requires-Dist: pdbp==1.5.0
@@ -133,7 +134,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
133
134
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
134
135
  Provides-Extra: coverage
135
136
  Requires-Dist: coverage==7.2.7; python_version < "3.8" and extra == "coverage"
136
- Requires-Dist: coverage>=7.5.0; python_version >= "3.8" and extra == "coverage"
137
+ Requires-Dist: coverage>=7.5.1; python_version >= "3.8" and extra == "coverage"
137
138
  Requires-Dist: pytest-cov==4.1.0; python_version < "3.8" and extra == "coverage"
138
139
  Requires-Dist: pytest-cov>=5.0.0; python_version >= "3.8" and extra == "coverage"
139
140
  Provides-Extra: flake8
@@ -151,7 +152,7 @@ Provides-Extra: pdfminer
151
152
  Requires-Dist: pdfminer.six==20221105; python_version < "3.8" and extra == "pdfminer"
152
153
  Requires-Dist: pdfminer.six==20231228; python_version >= "3.8" and extra == "pdfminer"
153
154
  Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
154
- Requires-Dist: cryptography==42.0.5; python_version >= "3.9" and extra == "pdfminer"
155
+ Requires-Dist: cryptography==42.0.7; python_version >= "3.9" and extra == "pdfminer"
155
156
  Requires-Dist: cffi==1.15.1; python_version < "3.8" and extra == "pdfminer"
156
157
  Requires-Dist: cffi==1.16.0; python_version >= "3.8" and extra == "pdfminer"
157
158
  Requires-Dist: pycparser==2.22; extra == "pdfminer"
@@ -161,7 +162,7 @@ Requires-Dist: Pillow>=10.3.0; python_version >= "3.8" and extra == "pillow"
161
162
  Provides-Extra: pip-system-certs
162
163
  Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
163
164
  Provides-Extra: proxy
164
- Requires-Dist: proxy.py==2.4.3; extra == "proxy"
165
+ Requires-Dist: proxy.py==2.4.4; extra == "proxy"
165
166
  Provides-Extra: psutil
166
167
  Requires-Dist: psutil==5.9.8; extra == "psutil"
167
168
  Provides-Extra: selenium-stealth
@@ -174,7 +175,8 @@ Requires-Dist: h2==4.1.0; extra == "selenium-wire"
174
175
  Requires-Dist: hpack==4.0.0; extra == "selenium-wire"
175
176
  Requires-Dist: hyperframe==6.0.1; extra == "selenium-wire"
176
177
  Requires-Dist: kaitaistruct==0.10; extra == "selenium-wire"
177
- Requires-Dist: pyasn1==0.5.1; extra == "selenium-wire"
178
+ Requires-Dist: pyasn1==0.5.1; python_version < "3.8" and extra == "selenium-wire"
179
+ Requires-Dist: pyasn1==0.6.0; python_version >= "3.8" and extra == "selenium-wire"
178
180
  Requires-Dist: zstandard==0.22.0; extra == "selenium-wire"
179
181
 
180
182
  <!-- SeleniumBase Docs -->
@@ -844,6 +846,7 @@ pytest test_coffee_cart.py --trace
844
846
  --block-images # (Block images from loading during tests.)
845
847
  --do-not-track # (Indicate to websites that you don't want to be tracked.)
846
848
  --verify-delay=SECONDS # (The delay before MasterQA verification checks.)
849
+ --ee | --esc-end # (Lets the user end the current test via the ESC key.)
847
850
  --recorder # (Enables the Recorder for turning browser actions into code.)
848
851
  --rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
849
852
  --rec-sleep # (If the Recorder is enabled, also records self.sleep calls.)
@@ -671,6 +671,7 @@ pytest test_coffee_cart.py --trace
671
671
  --block-images # (Block images from loading during tests.)
672
672
  --do-not-track # (Indicate to websites that you don't want to be tracked.)
673
673
  --verify-delay=SECONDS # (The delay before MasterQA verification checks.)
674
+ --ee | --esc-end # (Lets the user end the current test via the ESC key.)
674
675
  --recorder # (Enables the Recorder for turning browser actions into code.)
675
676
  --rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
676
677
  --rec-sleep # (If the Recorder is enabled, also records self.sleep calls.)
@@ -86,14 +86,11 @@ class HackTests(BaseCase):
86
86
  self.highlight('form[role="search"]', loops=8)
87
87
 
88
88
  self.open("https://github.com/features/actions")
89
- self.set_text_content('a[href="/pricing"]', aybabtu)
90
- self.set_text_content("h1 span:nth-child(1)", ayb)
91
- self.set_text_content("h1 span:nth-of-type(2)", "ARE")
92
- self.set_text_content("h1 span:nth-of-type(3)", "BELONG")
93
- self.set_text_content("h1 span:nth-of-type(4)", "TO")
94
- self.set_text_content("h1 span:nth-of-type(5)", "US")
95
- self.highlight('a[href="/pricing"]', loops=6, scroll=False)
96
- self.highlight("h1.h2-mktg", loops=7, scroll=False)
89
+ self.set_text_content("h2.h2-mktg", aybabtu)
90
+ self.set_text_content("a.btn-large-mktg", aybabtu)
91
+ self.highlight("h2.h2-mktg", loops=8, scroll=False)
92
+ self.scroll_to("h2.h2-mktg")
93
+ self.highlight("a.btn-large-mktg", loops=8, scroll=False)
97
94
 
98
95
  self.open("https://dev.to/top/infinity")
99
96
  self.click_if_visible('button[aria-label="Close campaign banner"]')
@@ -290,14 +287,14 @@ class HackTests(BaseCase):
290
287
  self.highlight("h1", loops=10, scroll=False)
291
288
 
292
289
  self.open("https://wordpress.com/")
293
- zoom_out = "h1.is-page-header{zoom: 0.8;-moz-transform: scale(0.8);}"
290
+ zoom_out = "h1{zoom: 0.8;-moz-transform: scale(0.8);}"
294
291
  self.add_css_style(zoom_out)
295
292
  zoom_in = "a.wp-element-button{zoom: 1.4;-moz-transform: scale(1.4);}"
296
293
  self.add_css_style(zoom_in)
297
- self.set_text_content("h1.is-page-header", aybabtu)
294
+ self.set_text_content("h1", aybabtu)
298
295
  self.set_text_content("a.wp-element-button", "Use SeleniumBase!")
299
- self.highlight("h1.is-page-header", loops=6, scroll=False)
300
- self.highlight("a.wp-element-button", loops=4, scroll=False)
296
+ self.highlight("h1", loops=8, scroll=False)
297
+ self.highlight("a.wp-element-button", loops=8, scroll=False)
301
298
 
302
299
  self.open("https://seleniumbase.com/")
303
300
  self.set_text_content("h1", aybabtu)
@@ -112,7 +112,6 @@ class MyTestClass(BaseCase):
112
112
  "driver = webdriver.Chrome(options=options)\n"
113
113
  ),
114
114
  )
115
-
116
115
  self.add_slide(
117
116
  "<h4>Test frameworks wrap Selenium to improve things!</h4><hr />\n"
118
117
  "<br />"
@@ -76,6 +76,7 @@ if pure_python:
76
76
  sb._reuse_session = False
77
77
  sb._crumbs = False
78
78
  sb._final_debug = False
79
+ sb.esc_end = False
79
80
  sb.use_wire = False
80
81
  sb.enable_3d_apis = False
81
82
  sb.window_size = None
@@ -14,7 +14,7 @@ class CDPTests(BaseCase):
14
14
 
15
15
  def click_turnstile_and_verify(sb):
16
16
  sb.switch_to_frame("iframe")
17
- sb.driver.uc_click("span.mark")
17
+ sb.driver.uc_click("span")
18
18
  sb.assert_element("img#captcha-success", timeout=3)
19
19
  sb.highlight("img#captcha-success", loops=8)
20
20
 
@@ -164,6 +164,7 @@ pytest my_first_test.py --settings-file=custom_settings.py
164
164
  --block-images # (Block images from loading during tests.)
165
165
  --do-not-track # (Indicate to websites that you don't want to be tracked.)
166
166
  --verify-delay=SECONDS # (The delay before MasterQA verification checks.)
167
+ --ee | --esc-end # (Lets the user end the current test via the ESC key.)
167
168
  --recorder # (Enables the Recorder for turning browser actions into code.)
168
169
  --rec-behave # (Same as Recorder Mode, but also generates behave-gherkin.)
169
170
  --rec-sleep # (If the Recorder is enabled, also records self.sleep calls.)
@@ -1046,6 +1046,8 @@ driver.uc_open_with_tab(url) # (New tab with default reconnect_time)
1046
1046
 
1047
1047
  driver.uc_open_with_reconnect(url, reconnect_time=None) # (New tab)
1048
1048
 
1049
+ driver.uc_open_with_disconnect(url) # Open in new tab + disconnect()
1050
+
1049
1051
  driver.reconnect(timeout) # disconnect() + sleep(timeout) + connect()
1050
1052
 
1051
1053
  driver.disconnect() # Stops the webdriver service to prevent detection
@@ -121,6 +121,8 @@ pytest TEST_NAME.py --trace --rec -s
121
121
 
122
122
  ⏺️ Inside recorded tests, you might find the <code>self.open_if_not_url(URL)</code> method, which opens the URL given if the browser is not currently on that page. SeleniumBase uses this method in recorded scripts when the Recorder detects that a browser action changed the current URL. This method prevents an unnecessary page load and shows what page the test visited after a browser action.
123
123
 
124
+ ⏺️ By launching the Recorder App with <code>sbase recorder --ee</code>, you can end the recording by pressing {<code>SHIFT</code>+<code>ESC</code>} instead of the usual way of ending the recording by typing <code>c</code> from a <code>breakpoint()</code> and pressing <code>Enter</code>. Those buttons don't need to be pressed at the same time, but <code>SHIFT</code> must be pressed directly before <code>ESC</code>.
125
+
124
126
  --------
125
127
 
126
128
  <div>To learn more about SeleniumBase, check out the Docs Site:</div>
@@ -1,26 +1,26 @@
1
1
  # mkdocs dependencies for generating the seleniumbase.io website
2
2
  # Minimum Python version: 3.8 (for generating docs only)
3
3
 
4
- regex>=2024.4.28
4
+ regex>=2024.5.15
5
5
  pymdown-extensions>=10.8.1
6
- pipdeptree>=2.19.1
6
+ pipdeptree>=2.20.0
7
7
  python-dateutil>=2.8.2
8
8
  Markdown==3.6
9
9
  markdown2==2.4.13
10
10
  MarkupSafe==2.1.5
11
- Jinja2==3.1.3
11
+ Jinja2==3.1.4
12
12
  click==8.1.7
13
13
  ghp-import==2.1.0
14
14
  watchdog==4.0.0
15
15
  cairocffi==1.7.0
16
16
  pathspec==0.12.1
17
- Babel==2.14.0
17
+ Babel==2.15.0
18
18
  paginate==0.5.6
19
- lxml==5.2.1
19
+ lxml==5.2.2
20
20
  pyquery==2.0.0
21
21
  readtime==3.0.0
22
22
  mkdocs==1.6.0
23
- mkdocs-material==9.5.21
23
+ mkdocs-material==9.5.23
24
24
  mkdocs-exclude-search==0.6.6
25
25
  mkdocs-simple-hooks==0.1.5
26
26
  mkdocs-material-extensions==1.3.1
@@ -10,7 +10,7 @@ exceptiongroup>=1.2.1
10
10
  filelock>=3.12.2;python_version<"3.8"
11
11
  filelock>=3.14.0;python_version>="3.8"
12
12
  platformdirs>=4.0.0;python_version<"3.8"
13
- platformdirs>=4.2.1;python_version>="3.8"
13
+ platformdirs>=4.2.2;python_version>="3.8"
14
14
  typing-extensions>=4.11.0;python_version>="3.8"
15
15
  parse>=1.20.1
16
16
  parse-type>=0.6.2
@@ -27,11 +27,11 @@ sniffio==1.3.1
27
27
  h11==0.14.0
28
28
  outcome==1.3.0.post0
29
29
  trio==0.22.2;python_version<"3.8"
30
- trio==0.25.0;python_version>="3.8"
30
+ trio==0.25.1;python_version>="3.8"
31
31
  trio-websocket==0.11.1
32
32
  wsproto==1.2.0
33
33
  selenium==4.11.2;python_version<"3.8"
34
- selenium==4.20.0;python_version>="3.8"
34
+ selenium==4.21.0;python_version>="3.8"
35
35
  cssselect==1.2.0
36
36
  sortedcontainers==2.4.0
37
37
  fasteners==0.19
@@ -57,7 +57,8 @@ behave==1.2.6
57
57
  soupsieve==2.4.1;python_version<"3.8"
58
58
  soupsieve==2.5;python_version>="3.8"
59
59
  beautifulsoup4==4.12.3
60
- pygments==2.17.2
60
+ pygments==2.17.2;python_version<"3.8"
61
+ pygments==2.18.0;python_version>="3.8"
61
62
  pyreadline3==3.4.1;platform_system=="Windows"
62
63
  tabcompleter==1.3.0
63
64
  pdbp==1.5.0
@@ -72,7 +73,7 @@ rich==13.7.1
72
73
  # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
73
74
 
74
75
  coverage==7.2.7;python_version<"3.8"
75
- coverage>=7.5.0;python_version>="3.8"
76
+ coverage>=7.5.1;python_version>="3.8"
76
77
  pytest-cov==4.1.0;python_version<"3.8"
77
78
  pytest-cov>=5.0.0;python_version>="3.8"
78
79
  flake8==5.0.4;python_version<"3.9"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.26.3"
2
+ __version__ = "4.27.0"
@@ -406,6 +406,7 @@ sbase codegen new_test.py --url=wikipedia.org
406
406
  ``--edge`` (Use Edge browser instead of Chrome.)
407
407
  ``--gui`` / ``--headed`` (Use headed mode on Linux.)
408
408
  ``--uc`` / ``--undetected`` (Use undetectable mode.)
409
+ ``--ee`` (Use SHIFT + ESC to end the recording.)
409
410
  ``--overwrite`` (Overwrite file when it exists.)
410
411
  ``--behave`` (Also output Behave/Gherkin files.)
411
412
 
@@ -310,6 +310,7 @@ def show_mkrec_usage():
310
310
  print(" --edge (Use Edge browser instead of Chrome.)")
311
311
  print(" --gui / --headed (Use headed mode on Linux.)")
312
312
  print(" --uc / --undetected (Use undetectable mode.)")
313
+ print(" --ee (Use SHIFT + ESC to end the recording.)")
313
314
  print(" --overwrite (Overwrite file when it exists.)")
314
315
  print(" --behave (Also output Behave/Gherkin files.)")
315
316
  print(" Output:")
@@ -336,6 +337,7 @@ def show_codegen_usage():
336
337
  print(" --edge (Use Edge browser instead of Chrome.)")
337
338
  print(" --gui / --headed (Use headed mode on Linux.)")
338
339
  print(" --uc / --undetected (Use undetectable mode.)")
340
+ print(" --ee (Use SHIFT + ESC to end the recording.)")
339
341
  print(" --overwrite (Overwrite file when it exists.)")
340
342
  print(" --behave (Also output Behave/Gherkin files.)")
341
343
  print(" Output:")
@@ -93,6 +93,7 @@ def main():
93
93
  invalid_cmd = None
94
94
  use_edge = False
95
95
  use_uc = False
96
+ esc_end = False
96
97
  start_page = None
97
98
  next_is_url = False
98
99
  use_colors = True
@@ -145,6 +146,8 @@ def main():
145
146
  help_me = True
146
147
  elif option.lower() == "--edge":
147
148
  use_edge = True
149
+ elif option.lower() == "--ee":
150
+ esc_end = True
148
151
  elif option.lower() in ("--gui", "--headed"):
149
152
  if "linux" in sys.platform:
150
153
  force_gui = True
@@ -183,6 +186,42 @@ def main():
183
186
  data.append(' # type "c", and press [Enter].')
184
187
  data.append(" import pdb; pdb.set_trace()")
185
188
  data.append("")
189
+
190
+ if esc_end:
191
+ msg = ">>> Use [SHIFT + ESC] in the browser to end recording!"
192
+ d2 = []
193
+ d2.append("from seleniumbase import BaseCase")
194
+ d2.append("")
195
+ d2.append("")
196
+ d2.append("class RecorderTest(BaseCase):")
197
+ d2.append(" def test_recording(self):")
198
+ d2.append(" if self.recorder_ext:")
199
+ d2.append(" print(")
200
+ d2.append(' "\\n\\n%s\\n"' % msg)
201
+ d2.append(" )")
202
+ d2.append(' script = self._get_rec_shift_esc_script()')
203
+ d2.append(' esc = "return document.sb_esc_end;"')
204
+ d2.append(" start_time = self.time()")
205
+ d2.append(" last_handles_num = self._get_num_handles()")
206
+ d2.append(" for i in range(1200):")
207
+ d2.append(" try:")
208
+ d2.append(" self.execute_script(script)")
209
+ d2.append(" handles_num = self._get_num_handles()")
210
+ d2.append(" if handles_num < 1:")
211
+ d2.append(" return")
212
+ d2.append(" elif handles_num != last_handles_num:")
213
+ d2.append(" self.switch_to_window(-1)")
214
+ d2.append(" last_handles_num = handles_num")
215
+ d2.append(' if self.execute_script(esc) == "yes":')
216
+ d2.append(" return")
217
+ d2.append(" elif self.time() - start_time > 600:")
218
+ d2.append(" return")
219
+ d2.append(" self.sleep(0.5)")
220
+ d2.append(" except Exception:")
221
+ d2.append(" return")
222
+ d2.append("")
223
+ data = d2
224
+
186
225
  file = codecs.open(file_path, "w+", "utf-8")
187
226
  file.writelines("\r\n".join(data))
188
227
  file.close()
@@ -162,6 +162,8 @@ def do_recording(file_name, url, overwrite_enabled, use_chrome, window):
162
162
  or "--undetectable" in command_args
163
163
  ):
164
164
  command += " --uc"
165
+ if "--ee" in command_args:
166
+ command += " --ee"
165
167
  command += add_on
166
168
  poll = None
167
169
  if sb_config.rec_subprocess_used:
@@ -443,8 +443,32 @@ def uc_open_with_reconnect(driver, url, reconnect_time=None):
443
443
  js_utils.call_me_later(driver, script, 3)
444
444
  time.sleep(0.007)
445
445
  driver.close()
446
- driver.reconnect(reconnect_time)
447
- driver.switch_to.window(driver.window_handles[-1])
446
+ if reconnect_time == "disconnect":
447
+ driver.disconnect()
448
+ time.sleep(0.007)
449
+ else:
450
+ driver.reconnect(reconnect_time)
451
+ driver.switch_to.window(driver.window_handles[-1])
452
+ else:
453
+ driver.default_get(url) # The original one
454
+ return None
455
+
456
+
457
+ def uc_open_with_disconnect(driver, url):
458
+ """Open a url and disconnect chromedriver.
459
+ Note: You can't perform Selenium actions again
460
+ until after you've called driver.connect()."""
461
+ if url.startswith("//"):
462
+ url = "https:" + url
463
+ elif ":" not in url:
464
+ url = "https://" + url
465
+ if (url.startswith("http:") or url.startswith("https:")):
466
+ script = 'window.open("%s","_blank");' % url
467
+ js_utils.call_me_later(driver, script, 3)
468
+ time.sleep(0.007)
469
+ driver.close()
470
+ driver.disconnect()
471
+ time.sleep(0.007)
448
472
  else:
449
473
  driver.default_get(url) # The original one
450
474
  return None
@@ -1748,14 +1772,28 @@ def get_remote_driver(
1748
1772
  pip_find_lock = fasteners.InterProcessLock(
1749
1773
  constants.PipInstall.FINDLOCK
1750
1774
  )
1751
- with pip_find_lock:
1775
+ with pip_find_lock: # Prevent issues with multiple processes
1752
1776
  try:
1753
1777
  from seleniumwire import webdriver
1778
+ import blinker
1779
+ try:
1780
+ use_blinker_ver = constants.SeleniumWire.BLINKER_VER
1781
+ if blinker.__version__ != use_blinker_ver:
1782
+ shared_utils.pip_install(
1783
+ "blinker", version=use_blinker_ver
1784
+ )
1785
+ except Exception:
1786
+ pass
1787
+ del blinker
1754
1788
  except Exception:
1789
+ shared_utils.pip_install(
1790
+ "blinker", version=constants.SeleniumWire.BLINKER_VER
1791
+ )
1755
1792
  shared_utils.pip_install(
1756
1793
  "selenium-wire", version=constants.SeleniumWire.VER
1757
1794
  )
1758
1795
  from seleniumwire import webdriver
1796
+ warnings.simplefilter("ignore", category=DeprecationWarning)
1759
1797
  else:
1760
1798
  from selenium import webdriver
1761
1799
 
@@ -2162,17 +2200,31 @@ def get_local_driver(
2162
2200
  downloads_path = DOWNLOADS_FOLDER
2163
2201
  b_path = binary_location
2164
2202
  if use_wire:
2165
- driver_fixing_lock = fasteners.InterProcessLock(
2166
- constants.MultiBrowser.DRIVER_FIXING_LOCK
2203
+ pip_find_lock = fasteners.InterProcessLock(
2204
+ constants.PipInstall.FINDLOCK
2167
2205
  )
2168
- with driver_fixing_lock: # Prevent multi-processes mode issues
2206
+ with pip_find_lock: # Prevent issues with multiple processes
2169
2207
  try:
2170
2208
  from seleniumwire import webdriver
2209
+ import blinker
2210
+ try:
2211
+ use_blinker_ver = constants.SeleniumWire.BLINKER_VER
2212
+ if blinker.__version__ != use_blinker_ver:
2213
+ shared_utils.pip_install(
2214
+ "blinker", version=use_blinker_ver
2215
+ )
2216
+ except Exception:
2217
+ pass
2218
+ del blinker
2171
2219
  except Exception:
2220
+ shared_utils.pip_install(
2221
+ "blinker", version=constants.SeleniumWire.BLINKER_VER
2222
+ )
2172
2223
  shared_utils.pip_install(
2173
2224
  "selenium-wire", version=constants.SeleniumWire.VER
2174
2225
  )
2175
2226
  from seleniumwire import webdriver
2227
+ warnings.simplefilter("ignore", category=DeprecationWarning)
2176
2228
  else:
2177
2229
  from selenium import webdriver
2178
2230
 
@@ -3754,6 +3806,11 @@ def get_local_driver(
3754
3806
  driver, *args, **kwargs
3755
3807
  )
3756
3808
  )
3809
+ driver.uc_open_with_disconnect = (
3810
+ lambda *args, **kwargs: uc_open_with_disconnect(
3811
+ driver, *args, **kwargs
3812
+ )
3813
+ )
3757
3814
  driver.uc_click = lambda *args, **kwargs: uc_click(
3758
3815
  driver, *args, **kwargs
3759
3816
  )
@@ -114,6 +114,7 @@ class BaseCase(unittest.TestCase):
114
114
  ]
115
115
  self.version_tuple = tuple(self.version_list)
116
116
  self.version_info = self.version_tuple
117
+ self.time = time.time
117
118
  self.__page_sources = []
118
119
  self.__extra_actions = []
119
120
  self.__js_start_time = 0
@@ -381,6 +382,7 @@ class BaseCase(unittest.TestCase):
381
382
  self, selector, by="css selector", timeout=None, delay=0, scroll=True
382
383
  ):
383
384
  self.__check_scope()
385
+ self.__skip_if_esc()
384
386
  if not timeout:
385
387
  timeout = settings.SMALL_TIMEOUT
386
388
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
@@ -671,6 +673,7 @@ class BaseCase(unittest.TestCase):
671
673
  self.__demo_mode_pause_if_active(tiny=True)
672
674
  elif self.slow_mode:
673
675
  self.__slow_mode_pause_if_active()
676
+ self.__set_esc_skip()
674
677
 
675
678
  def slow_click(self, selector, by="css selector", timeout=None):
676
679
  """Similar to click(), but pauses for a brief moment before clicking.
@@ -1586,6 +1589,7 @@ class BaseCase(unittest.TestCase):
1586
1589
  def click_link_text(self, link_text, timeout=None):
1587
1590
  """This method clicks link text on a page."""
1588
1591
  self.__check_scope()
1592
+ self.__skip_if_esc()
1589
1593
  if not timeout:
1590
1594
  timeout = settings.SMALL_TIMEOUT
1591
1595
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
@@ -4142,6 +4146,10 @@ class BaseCase(unittest.TestCase):
4142
4146
  self.uc_open_with_tab = new_driver.uc_open_with_tab
4143
4147
  if hasattr(new_driver, "uc_open_with_reconnect"):
4144
4148
  self.uc_open_with_reconnect = new_driver.uc_open_with_reconnect
4149
+ if hasattr(new_driver, "uc_open_with_disconnect"):
4150
+ self.uc_open_with_disconnect = (
4151
+ new_driver.uc_open_with_disconnect
4152
+ )
4145
4153
  if hasattr(new_driver, "reconnect"):
4146
4154
  self.reconnect = new_driver.reconnect
4147
4155
  if hasattr(new_driver, "disconnect"):
@@ -4404,11 +4412,35 @@ class BaseCase(unittest.TestCase):
4404
4412
  for cookie_dict in cookies:
4405
4413
  self.driver.add_cookie(cookie_dict)
4406
4414
 
4415
+ def __set_esc_skip(self):
4416
+ if hasattr(self, "esc_end") and self.esc_end:
4417
+ script = (
4418
+ """document.onkeydown = function(evt) {
4419
+ evt = evt || window.event;
4420
+ var isEscape = false;
4421
+ if ("key" in evt) {
4422
+ isEscape = (evt.key === "Escape" || evt.key === "Esc");
4423
+ } else {
4424
+ isEscape = (evt.keyCode === 27);
4425
+ }
4426
+ if (isEscape) {
4427
+ document.sb_esc_end = 'yes';
4428
+ }
4429
+ };"""
4430
+ )
4431
+ self.execute_script(script)
4432
+
4433
+ def __skip_if_esc(self):
4434
+ if hasattr(self, "esc_end") and self.esc_end:
4435
+ if self.execute_script("return document.sb_esc_end;") == "yes":
4436
+ self.skip()
4437
+
4407
4438
  def wait_for_ready_state_complete(self, timeout=None):
4408
4439
  """Waits for the "readyState" of the page to be "complete".
4409
4440
  Returns True when the method completes."""
4410
4441
  self.__check_scope()
4411
4442
  self._check_browser()
4443
+ self.__skip_if_esc()
4412
4444
  if not timeout:
4413
4445
  timeout = settings.EXTREME_TIMEOUT
4414
4446
  if self.timeout_multiplier and timeout == settings.EXTREME_TIMEOUT:
@@ -4427,6 +4459,7 @@ class BaseCase(unittest.TestCase):
4427
4459
  time.sleep(0.01)
4428
4460
  if self.undetectable:
4429
4461
  time.sleep(0.035)
4462
+ self.__set_esc_skip()
4430
4463
  return True
4431
4464
 
4432
4465
  def wait_for_angularjs(self, timeout=None, **kwargs):
@@ -5775,6 +5808,7 @@ class BaseCase(unittest.TestCase):
5775
5808
  scroll - the option to scroll to the element first (Default: True)
5776
5809
  timeout - the time to wait for the element to appear """
5777
5810
  self.__check_scope()
5811
+ self.__skip_if_esc()
5778
5812
  if isinstance(selector, WebElement):
5779
5813
  self.__highlight_element(selector, loops=loops, scroll=scroll)
5780
5814
  return
@@ -6760,10 +6794,7 @@ class BaseCase(unittest.TestCase):
6760
6794
  constants.PipInstall.FINDLOCK
6761
6795
  )
6762
6796
  with pip_find_lock:
6763
- if (
6764
- sys.version_info >= (3, 7)
6765
- and sys.version_info < (3, 9)
6766
- ):
6797
+ if sys.version_info < (3, 9):
6767
6798
  # Fix bug in newer cryptography for Python 3.7 and 3.8:
6768
6799
  # "pyo3_runtime.PanicException: Python API call failed"
6769
6800
  try:
@@ -8709,6 +8740,7 @@ class BaseCase(unittest.TestCase):
8709
8740
  ):
8710
8741
  """Same as self.wait_for_element()"""
8711
8742
  self.__check_scope()
8743
+ self.__skip_if_esc()
8712
8744
  if not timeout:
8713
8745
  timeout = settings.LARGE_TIMEOUT
8714
8746
  if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
@@ -13478,6 +13510,7 @@ class BaseCase(unittest.TestCase):
13478
13510
  self.slow_scroll_to(selector, by=by)
13479
13511
 
13480
13512
  def __demo_mode_highlight_if_active(self, selector, by):
13513
+ self.__skip_if_esc()
13481
13514
  if self.demo_mode:
13482
13515
  # Includes self.slow_scroll_to(selector, by=by) by default
13483
13516
  self.__highlight(selector, by=by)
@@ -14379,6 +14412,7 @@ class BaseCase(unittest.TestCase):
14379
14412
  self.firefox_arg = sb_config.firefox_arg
14380
14413
  self.firefox_pref = sb_config.firefox_pref
14381
14414
  self.verify_delay = sb_config.verify_delay
14415
+ self.esc_end = sb_config.esc_end
14382
14416
  self.recorder_mode = sb_config.recorder_mode
14383
14417
  self.recorder_ext = sb_config.recorder_mode
14384
14418
  self.rec_print = sb_config.rec_print
@@ -15698,6 +15732,31 @@ class BaseCase(unittest.TestCase):
15698
15732
  else:
15699
15733
  return None
15700
15734
 
15735
+ def _get_num_handles(self):
15736
+ return len(self.driver.window_handles)
15737
+
15738
+ def _get_rec_shift_esc_script(self):
15739
+ return (
15740
+ """document.onkeydown = function(evt) {
15741
+ evt = evt || window.event;
15742
+ var isEscape = false;
15743
+ if ("key" in evt) {
15744
+ isEscape = (evt.key === "Escape" || evt.key === "Esc");
15745
+ last_key = evt.key;
15746
+ } else {
15747
+ isEscape = (evt.keyCode === 27);
15748
+ last_key = evt.keyCode;
15749
+ if (last_key === 16) {
15750
+ last_key = "Shift";
15751
+ }
15752
+ }
15753
+ if (isEscape && document.sb_last_key === "Shift") {
15754
+ document.sb_esc_end = "yes";
15755
+ }
15756
+ document.sb_last_key = last_key;
15757
+ };"""
15758
+ )
15759
+
15701
15760
  def _addSkip(self, result, test_case, reason):
15702
15761
  """This method should NOT be called directly from tests."""
15703
15762
  addSkip = getattr(result, 'addSkip', None)
@@ -15828,6 +15887,11 @@ class BaseCase(unittest.TestCase):
15828
15887
  )
15829
15888
  raise Exception(message)
15830
15889
  # *** Start tearDown() officially ***
15890
+ if self.undetectable:
15891
+ try:
15892
+ self.driver.window_handles
15893
+ except urllib3.exceptions.MaxRetryError:
15894
+ self.driver.connect()
15831
15895
  self.__slow_mode_pause_if_active()
15832
15896
  has_exception = self.__has_exception()
15833
15897
  sb_config._has_exception = has_exception
@@ -351,6 +351,7 @@ class ProxyPy:
351
351
  class SeleniumWire:
352
352
  # The version installed if selenium-wire is not installed
353
353
  VER = "5.1.0"
354
+ BLINKER_VER = "1.7.0" # The "blinker" dependency version
354
355
 
355
356
 
356
357
  class Mobile: