seleniumbase 4.27.5__tar.gz → 4.28.0a1__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 (518) hide show
  1. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/PKG-INFO +15 -9
  2. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/method_summary.md +14 -6
  3. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/requirements.txt +3 -3
  4. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/requirements.txt +12 -8
  5. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/__init__.py +3 -0
  6. seleniumbase-4.28.0a1/seleniumbase/__version__.py +2 -0
  7. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/behave/behave_sb.py +2 -1
  8. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/browser_launcher.py +214 -21
  9. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/sb_driver.py +58 -5
  10. seleniumbase-4.28.0a1/seleniumbase/extensions/recorder.zip +0 -0
  11. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/base_case.py +112 -24
  12. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/constants.py +6 -0
  13. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/page_actions.py +37 -3
  14. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/js_code/active_css_js.py +1 -1
  15. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/js_code/recorder_js.py +1 -1
  16. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/driver_manager.py +40 -31
  17. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/pytest_plugin.py +2 -1
  18. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/sb_manager.py +59 -55
  19. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/selenium_plugin.py +2 -1
  20. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase.egg-info/PKG-INFO +15 -9
  21. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase.egg-info/requires.txt +17 -8
  22. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/setup.py +16 -8
  23. seleniumbase-4.27.5/seleniumbase/__version__.py +0 -2
  24. seleniumbase-4.27.5/seleniumbase/extensions/recorder.zip +0 -0
  25. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/.github/Workflows.md +0 -0
  26. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/.github/workflows/pages.yml +0 -0
  27. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/.github/workflows/python-nightly-mac.yml +0 -0
  28. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/.github/workflows/python-nightly-ubuntu.yml +0 -0
  29. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/.github/workflows/python-nightly-windows.yml +0 -0
  30. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/.github/workflows/python-package.yml +0 -0
  31. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/.gitignore +0 -0
  32. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/CHANGELOG.md +0 -0
  33. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/CNAME +0 -0
  34. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/CODE_OF_CONDUCT.md +0 -0
  35. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/CONTRIBUTING.md +0 -0
  36. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/Dockerfile +0 -0
  37. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/LICENSE +0 -0
  38. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/MANIFEST.in +0 -0
  39. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/README.md +0 -0
  40. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/SECURITY.md +0 -0
  41. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/_config.yml +0 -0
  42. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/azure-pipelines.yml +0 -0
  43. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/ReadMe.md +0 -0
  44. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/__init__.py +0 -0
  45. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/basic_test.py +0 -0
  46. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/ReadMe.md +0 -0
  47. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/__init__.py +0 -0
  48. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/behave.ini +0 -0
  49. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/__init__.py +0 -0
  50. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/behave.ini +0 -0
  51. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/calculator.feature +0 -0
  52. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/environment.py +0 -0
  53. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/fail_page.feature +0 -0
  54. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/realworld.feature +0 -0
  55. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/steps/__init__.py +0 -0
  56. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/steps/calculator.py +0 -0
  57. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/steps/fail_page.py +0 -0
  58. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/steps/imported.py +0 -0
  59. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
  60. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/behave_bdd/features/swag_labs.feature +0 -0
  61. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/ReadMe.md +0 -0
  62. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/__init__.py +0 -0
  63. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/base_test_case.py +0 -0
  64. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/boilerplate_test.py +0 -0
  65. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/classic_obj_test.py +0 -0
  66. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/page_objects.py +0 -0
  67. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/__init__.py +0 -0
  68. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
  69. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
  70. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/file_parsing/qa_login_example.txt +0 -0
  71. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/file_parsing/staging_login_example.txt +0 -0
  72. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/google_objects.py +0 -0
  73. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/google_test.py +0 -0
  74. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/sb_swag_test.py +0 -0
  75. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/swag_labs_test.py +0 -0
  76. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/samples/test_page_objects.py +0 -0
  77. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/boilerplates/sb_fixture_test.py +0 -0
  78. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/capabilities/ReadMe.md +0 -0
  79. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/capabilities/mac_cap_file.py +0 -0
  80. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/capabilities/sample_cap_file_BS.py +0 -0
  81. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/capabilities/sample_cap_file_SL.py +0 -0
  82. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/capabilities/selenoid_cap_file.py +0 -0
  83. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/capabilities/win10_cap_file.py +0 -0
  84. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_plans/basic_test.MyTestClass.test_basics.md +0 -0
  85. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_plans/my_first_test.MyTestClass.test_swag_labs.md +0 -0
  86. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_plans/shadow_root_test.ShadowRootTest.test_shadow_root.md +0 -0
  87. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_plans/test_assert_elements.ListAssertTests.test_assert_list_of_elements.md +0 -0
  88. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_plans/test_calculator.CalculatorTests.test_6_times_7_plus_12_equals_54.md +0 -0
  89. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_plans/test_demo_site.DemoSiteTests.test_demo_site.md +0 -0
  90. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_plans/test_login.SwagLabsLoginTests.test_swag_labs_login.md +0 -0
  91. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_plans/test_mfa_login.TestMFALogin.test_mfa_login.md +0 -0
  92. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/case_summary.md +0 -0
  93. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/ReadMe.md +0 -0
  94. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/chart_presentation.py +0 -0
  95. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/my_chart.py +0 -0
  96. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/pie_charts.py +0 -0
  97. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/test_area_chart.py +0 -0
  98. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/test_display_chart.py +0 -0
  99. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/test_line_chart.py +0 -0
  100. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/test_multi_series.py +0 -0
  101. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/chart_maker/test_save_chart.py +0 -0
  102. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/coffee_cart_tests.py +0 -0
  103. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/custom_settings.py +0 -0
  104. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/desktop_apps/ReadMe.md +0 -0
  105. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/desktop_apps/recorder.py +0 -0
  106. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/dialog_boxes/ReadMe.md +0 -0
  107. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/dialog_boxes/dialog_box_tour.py +0 -0
  108. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/edge_test.py +0 -0
  109. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/example_config.cfg +0 -0
  110. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/example_logs/ReadMe.md +0 -0
  111. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/example_logs/basic_test_info.txt +0 -0
  112. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/example_logs/page_source.html +0 -0
  113. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/example_logs/screenshot.png +0 -0
  114. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/github_test.py +0 -0
  115. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/gui_test_runner.py +0 -0
  116. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/hack_the_planet.py +0 -0
  117. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/handle_alert_test.py +0 -0
  118. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/iframe_tests.py +0 -0
  119. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/locale_code_test.py +0 -0
  120. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/master_qa/ReadMe.md +0 -0
  121. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/master_qa/__init__.py +0 -0
  122. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/master_qa/basic_masterqa_test_0.py +0 -0
  123. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/master_qa/masterqa_test_1.py +0 -0
  124. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/master_qa/pytest.ini +0 -0
  125. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/__init__.py +0 -0
  126. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/protractor/ReadMe.md +0 -0
  127. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/protractor/__init__.py +0 -0
  128. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/protractor/example_spec.js +0 -0
  129. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/protractor/example_test.py +0 -0
  130. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/protractor/input_spec.js +0 -0
  131. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/protractor/input_test.py +0 -0
  132. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/protractor/mat_paginator_spec.js +0 -0
  133. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/protractor/mat_paginator_test.py +0 -0
  134. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/raw_selenium/ReadMe.md +0 -0
  135. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/raw_selenium/__init__.py +0 -0
  136. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
  137. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
  138. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/raw_selenium/messy_raw.py +0 -0
  139. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/raw_selenium/pytest.ini +0 -0
  140. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/raw_selenium/refined_raw.py +0 -0
  141. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/migration/raw_selenium/simple_sbase.py +0 -0
  142. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/my_first_test.py +0 -0
  143. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/nth_child_test.py +0 -0
  144. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/offline_examples/__init__.py +0 -0
  145. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/offline_examples/demo_page.html +0 -0
  146. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/offline_examples/load_html_test.py +0 -0
  147. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/offline_examples/test_demo_page.py +0 -0
  148. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/offline_examples/test_handle_alerts.py +0 -0
  149. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/offline_examples/test_request_fixture.py +0 -0
  150. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/offline_examples/test_user_agent.py +0 -0
  151. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/old_wordle_script.py +0 -0
  152. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/parameterized_test.py +0 -0
  153. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/performance_test.py +0 -0
  154. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/presenter/ReadMe.md +0 -0
  155. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/presenter/core_presentation.py +0 -0
  156. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/presenter/edge_presentation.py +0 -0
  157. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/presenter/fundamentals.py +0 -0
  158. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/presenter/my_presentation.py +0 -0
  159. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/presenter/py_virtual_envs.py +0 -0
  160. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/proxy_test.py +0 -0
  161. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/pytest.ini +0 -0
  162. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/rate_limiting_test.py +0 -0
  163. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/raw_call.py +0 -0
  164. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/raw_driver_context.py +0 -0
  165. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/raw_file_call.py +0 -0
  166. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/raw_main_call.py +0 -0
  167. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/raw_parameter_script.py +0 -0
  168. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/raw_sb.py +0 -0
  169. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/raw_test_scripts.py +0 -0
  170. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/raw_uc_mode.py +0 -0
  171. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/setup.cfg +0 -0
  172. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/shadow_root_test.py +0 -0
  173. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/swag_labs_user_tests.py +0 -0
  174. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_apple_site.py +0 -0
  175. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_assert_elements.py +0 -0
  176. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_calculator.py +0 -0
  177. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_canvas.py +0 -0
  178. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_checkboxes.py +0 -0
  179. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_chinese_pdf.py +0 -0
  180. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_chromedriver.py +0 -0
  181. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_coffee_cart.py +0 -0
  182. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_console_logging.py +0 -0
  183. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_contains_selector.py +0 -0
  184. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_cycle_elements.py +0 -0
  185. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_decryption.py +0 -0
  186. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_deferred_asserts.py +0 -0
  187. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_demo_site.py +0 -0
  188. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_detect_404s.py +0 -0
  189. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_docs_site.py +0 -0
  190. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_double_click.py +0 -0
  191. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_download_files.py +0 -0
  192. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_download_images.py +0 -0
  193. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_drag_and_drop.py +0 -0
  194. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_error_page.py +0 -0
  195. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_event_firing.py +0 -0
  196. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_fail.py +0 -0
  197. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_geolocation.py +0 -0
  198. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_get_coffee.py +0 -0
  199. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_get_locale_code.py +0 -0
  200. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_get_pdf_text.py +0 -0
  201. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_get_user_agent.py +0 -0
  202. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_hack_search.py +0 -0
  203. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_image_saving.py +0 -0
  204. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_inspect_html.py +0 -0
  205. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_login.py +0 -0
  206. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_markers.py +0 -0
  207. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_mfa_login.py +0 -0
  208. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_multiple_drivers.py +0 -0
  209. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_null.py +0 -0
  210. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_override_driver.py +0 -0
  211. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_override_sb_fixture.py +0 -0
  212. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_parse_soup.py +0 -0
  213. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_pdf_asserts.py +0 -0
  214. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_pytest_parametrize.py +0 -0
  215. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_repeat_tests.py +0 -0
  216. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_request_sb_fixture.py +0 -0
  217. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_save_screenshots.py +0 -0
  218. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_sb_fixture.py +0 -0
  219. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_scrape_bing.py +0 -0
  220. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_select_options.py +0 -0
  221. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_shadow_dom.py +0 -0
  222. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_show_file_choosers.py +0 -0
  223. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_skype_site.py +0 -0
  224. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_suite.py +0 -0
  225. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_swag_labs.py +0 -0
  226. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_tinymce.py +0 -0
  227. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_todomvc.py +0 -0
  228. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_url_asserts.py +0 -0
  229. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_usefixtures.py +0 -0
  230. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_verify_chromedriver.py +0 -0
  231. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_window_switching.py +0 -0
  232. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_xfail.py +0 -0
  233. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/test_xkcd.py +0 -0
  234. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/time_limit_test.py +0 -0
  235. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/ReadMe.md +0 -0
  236. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/bootstrap_google_tour.py +0 -0
  237. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
  238. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/driverjs_maps_tour.py +0 -0
  239. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/google_tour.py +0 -0
  240. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/hopscotch_google_tour.py +0 -0
  241. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/introjs_google_tour.py +0 -0
  242. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/maps_introjs_tour.py +0 -0
  243. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/octocat_tour.py +0 -0
  244. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/shepherd_google_tour.py +0 -0
  245. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/tour_examples/xkcd_tour.py +0 -0
  246. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/ReadMe.md +0 -0
  247. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/chinese_test_1.py +0 -0
  248. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/dutch_test_1.py +0 -0
  249. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/english_test_1.py +0 -0
  250. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/french_test_1.py +0 -0
  251. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/italian_test_1.py +0 -0
  252. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/japanese_test_1.py +0 -0
  253. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/korean_test_1.py +0 -0
  254. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/portuguese_test_1.py +0 -0
  255. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/pytest.ini +0 -0
  256. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/russian_test_1.py +0 -0
  257. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/translations/spanish_test_1.py +0 -0
  258. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/uc_cdp_events.py +0 -0
  259. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/unit_tests/ReadMe.md +0 -0
  260. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/unit_tests/verify_framework.py +0 -0
  261. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/upgrade_chromedriver.py +0 -0
  262. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/upload_file_test.py +0 -0
  263. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/user_agent_test.py +0 -0
  264. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/verify_undetected.py +0 -0
  265. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/ReadMe.md +0 -0
  266. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/__init__.py +0 -0
  267. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/case_plans/layout_test.VisualLayoutTests.test_applitools_layout_change.md +0 -0
  268. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/case_plans/python_home_test.VisualLayoutTests.test_python_home_layout_change.md +0 -0
  269. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_applitools_change.md +0 -0
  270. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_xkcd_logo_change.md +0 -0
  271. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/case_plans/test_layout_fail.VisualLayout_FixtureTests.test_python_home_change.md +0 -0
  272. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/case_plans/xkcd_visual_test.VisualLayoutTests.test_xkcd_layout_change.md +0 -0
  273. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/layout_test.py +0 -0
  274. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/python_home_test.py +0 -0
  275. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/test_layout_fail.py +0 -0
  276. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/visual_testing/xkcd_visual_test.py +0 -0
  277. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/wordle_test.py +0 -0
  278. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/xpath_test.py +0 -0
  279. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/examples/youtube_search_test.py +0 -0
  280. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/ReadMe.md +0 -0
  281. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/behave_gui.md +0 -0
  282. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/case_plans.md +0 -0
  283. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/chinese.md +0 -0
  284. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/commander.md +0 -0
  285. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/customizing_test_runs.md +0 -0
  286. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/demo_mode.md +0 -0
  287. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/desired_capabilities.md +0 -0
  288. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/features_list.md +0 -0
  289. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/handling_iframes.md +0 -0
  290. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/happy_customers.md +0 -0
  291. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/hidden_files_info.md +0 -0
  292. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/how_it_works.md +0 -0
  293. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/html_inspector.md +0 -0
  294. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/install.md +0 -0
  295. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/install_python_pip_git.md +0 -0
  296. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/js_package_manager.md +0 -0
  297. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/locale_codes.md +0 -0
  298. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/mobile_testing.md +0 -0
  299. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/mysql_installation.md +0 -0
  300. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/recorder_mode.md +0 -0
  301. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/shadow_dom.md +0 -0
  302. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/syntax_formats.md +0 -0
  303. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/thank_you.md +0 -0
  304. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/translations.md +0 -0
  305. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/useful_grep_commands.md +0 -0
  306. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/using_safari_driver.md +0 -0
  307. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/verify_webdriver.md +0 -0
  308. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/virtualenv_instructions.md +0 -0
  309. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/help_docs/webdriver_installation.md +0 -0
  310. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/install.sh +0 -0
  311. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/__init__.py +0 -0
  312. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/azure/azure_pipelines/ReadMe.md +0 -0
  313. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/azure/jenkins/ReadMe.md +0 -0
  314. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/ReadMe.md +0 -0
  315. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/behave.ini +0 -0
  316. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/__init__.py +0 -0
  317. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/behave.ini +0 -0
  318. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/calculator.feature +0 -0
  319. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/environment.py +0 -0
  320. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/fail_page.feature +0 -0
  321. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/realworld.feature +0 -0
  322. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/steps/__init__.py +0 -0
  323. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/steps/calculator.py +0 -0
  324. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/steps/fail_page.py +0 -0
  325. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/steps/real_world.py +0 -0
  326. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/steps/swag_labs.py +0 -0
  327. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/behave/features/swag_labs.feature +0 -0
  328. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/brython/ReadMe.md +0 -0
  329. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/brython/index.html +0 -0
  330. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/brython/index.py +0 -0
  331. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/brython/library.html +0 -0
  332. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/docker/ReadMe.md +0 -0
  333. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/docker/docker-entrypoint.sh +0 -0
  334. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/docker/run_docker_test_in_chrome.sh +0 -0
  335. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/github/ReadMe.md +0 -0
  336. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/github/workflows/ReadMe.md +0 -0
  337. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/github/workflows/extras.md +0 -0
  338. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/google_cloud/ReadMe.md +0 -0
  339. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/katalon/ReadMe.md +0 -0
  340. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/linux/Linuxfile.sh +0 -0
  341. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/linux/ReadMe.md +0 -0
  342. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/linux/Xvfb_launcher.sh +0 -0
  343. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/linux/jenkins_permissions.sh +0 -0
  344. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/linux/tomcat_permissions.sh +0 -0
  345. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/node_js/ReadMe.md +0 -0
  346. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/node_js/__init__.py +0 -0
  347. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/node_js/index.html +0 -0
  348. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/node_js/my_first_test.py +0 -0
  349. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/node_js/npm-shrinkwrap.json +0 -0
  350. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/node_js/package.json +0 -0
  351. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/node_js/server.js +0 -0
  352. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/node_js/test_demo_site.py +0 -0
  353. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/selenium_grid/ReadMe.md +0 -0
  354. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/integrations/selenium_ide/ReadMe.md +0 -0
  355. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs.yml +0 -0
  356. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/ReadMe.txt +0 -0
  357. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/docs_instructions.txt +0 -0
  358. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/dash_pie.png +0 -0
  359. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/dash_pie_2.png +0 -0
  360. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/dash_pie_3.png +0 -0
  361. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/favicon.ico +0 -0
  362. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/grad_logo.png +0 -0
  363. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/green_icon.png +0 -0
  364. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/green_logo.png +0 -0
  365. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/green_logo2.png +0 -0
  366. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/green_logo3.png +0 -0
  367. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/logo3.png +0 -0
  368. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/logo3a.png +0 -0
  369. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/logo3b.png +0 -0
  370. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/logo3c.png +0 -0
  371. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/logo4.png +0 -0
  372. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/logo5.png +0 -0
  373. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/logo6.png +0 -0
  374. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/logo7.png +0 -0
  375. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/sb_icon.png +0 -0
  376. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/sb_logo_10.png +0 -0
  377. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/sb_logo_7.png +0 -0
  378. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/side_by_side.png +0 -0
  379. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/social/share_facebook.svg +0 -0
  380. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/social/share_github.svg +0 -0
  381. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/social/share_gitter.svg +0 -0
  382. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/social/share_instagram.svg +0 -0
  383. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/img/social/share_twitter.svg +0 -0
  384. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/index.txt +0 -0
  385. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/mkdocs_build/prepare.py +0 -0
  386. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/pytest.ini +0 -0
  387. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/sbase/ReadMe.txt +0 -0
  388. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/sbase/__init__.py +0 -0
  389. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/sbase/__main__.py +0 -0
  390. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/sbase/steps.py +0 -0
  391. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/ReadMe.md +0 -0
  392. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/__main__.py +0 -0
  393. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/behave/__init__.py +0 -0
  394. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/behave/behave_helper.py +0 -0
  395. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/behave/steps.py +0 -0
  396. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/common/ReadMe.md +0 -0
  397. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/common/__init__.py +0 -0
  398. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/common/decorators.py +0 -0
  399. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/common/encryption.py +0 -0
  400. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/common/exceptions.py +0 -0
  401. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/common/obfuscate.py +0 -0
  402. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/common/unobfuscate.py +0 -0
  403. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/config/__init__.py +0 -0
  404. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/config/ad_block_list.py +0 -0
  405. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/config/proxy_list.py +0 -0
  406. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/config/settings.py +0 -0
  407. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/ReadMe.md +0 -0
  408. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/__init__.py +0 -0
  409. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/logo_helper.py +0 -0
  410. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/rich_helper.py +0 -0
  411. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/run.py +0 -0
  412. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  413. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  414. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_commander.py +0 -0
  415. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_install.py +0 -0
  416. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  417. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  418. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  419. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  420. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  421. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  422. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_print.py +0 -0
  423. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  424. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/__init__.py +0 -0
  425. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/application_manager.py +0 -0
  426. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/capabilities_parser.py +0 -0
  427. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/colored_traceback.py +0 -0
  428. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/create_db_tables.sql +0 -0
  429. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/detect_b_ver.py +0 -0
  430. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/download_helper.py +0 -0
  431. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/encoded_images.py +0 -0
  432. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/jqc_helper.py +0 -0
  433. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/log_helper.py +0 -0
  434. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/mysql.py +0 -0
  435. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/proxy_helper.py +0 -0
  436. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/recorder_helper.py +0 -0
  437. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/report_helper.py +0 -0
  438. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/s3_manager.py +0 -0
  439. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/session_helper.py +0 -0
  440. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/settings_parser.py +0 -0
  441. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/style_sheet.py +0 -0
  442. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/testcase_manager.py +0 -0
  443. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/tour_helper.py +0 -0
  444. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/core/visual_helper.py +0 -0
  445. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/drivers/ReadMe.md +0 -0
  446. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/drivers/__init__.py +0 -0
  447. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/extensions/ReadMe.md +0 -0
  448. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/extensions/__init__.py +0 -0
  449. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/extensions/ad_block.zip +0 -0
  450. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/extensions/disable_csp.zip +0 -0
  451. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/extensions/sbase_ext.zip +0 -0
  452. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/__init__.py +0 -0
  453. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  454. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/errors.py +0 -0
  455. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/js_utils.py +0 -0
  456. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/page_utils.py +0 -0
  457. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/shared_utils.py +0 -0
  458. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/unittest_helper.py +0 -0
  459. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/words.py +0 -0
  460. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  461. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/js_code/__init__.py +0 -0
  462. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/js_code/live_js.py +0 -0
  463. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/masterqa/ReadMe.md +0 -0
  464. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/masterqa/__init__.py +0 -0
  465. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/masterqa/master_qa.py +0 -0
  466. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/__init__.py +0 -0
  467. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/base_plugin.py +0 -0
  468. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/basic_test_info.py +0 -0
  469. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  470. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/page_source.py +0 -0
  471. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  472. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/plugins/screen_shots.py +0 -0
  473. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/resources/ReadMe.md +0 -0
  474. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/resources/__init__.py +0 -0
  475. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/resources/favicon.ico +0 -0
  476. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/__init__.py +0 -0
  477. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/chinese.py +0 -0
  478. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/dutch.py +0 -0
  479. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/french.py +0 -0
  480. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/italian.py +0 -0
  481. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/japanese.py +0 -0
  482. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/korean.py +0 -0
  483. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/master_dict.py +0 -0
  484. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/portuguese.py +0 -0
  485. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/russian.py +0 -0
  486. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/spanish.py +0 -0
  487. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/translate/translator.py +0 -0
  488. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/undetected/__init__.py +0 -0
  489. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/undetected/cdp.py +0 -0
  490. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/undetected/dprocess.py +0 -0
  491. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/undetected/options.py +0 -0
  492. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/undetected/patcher.py +0 -0
  493. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/undetected/reactor.py +0 -0
  494. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/undetected/webelement.py +0 -0
  495. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/__init__.py +0 -0
  496. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/ReadMe.md +0 -0
  497. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  498. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  499. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  500. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  501. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  502. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  503. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  504. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  505. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  506. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  507. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  508. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_ide/ReadMe.md +0 -0
  509. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  510. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  511. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase.egg-info/SOURCES.txt +0 -0
  512. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase.egg-info/dependency_links.txt +0 -0
  513. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase.egg-info/entry_points.txt +0 -0
  514. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/seleniumbase.egg-info/top_level.txt +0 -0
  515. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/setup.cfg +0 -0
  516. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/virtualenv_install.sh +0 -0
  517. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/win_install.bat +0 -0
  518. {seleniumbase-4.27.5 → seleniumbase-4.28.0a1}/win_virtualenv.bat +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.27.5
3
+ Version: 4.28.0a1
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
@@ -58,21 +58,23 @@ Classifier: Topic :: Utilities
58
58
  Requires-Python: >=3.7
59
59
  Description-Content-Type: text/markdown
60
60
  License-File: LICENSE
61
- Requires-Dist: pip>=24.0
62
- Requires-Dist: packaging>=24.0
61
+ Requires-Dist: pip>=24.0; python_version < "3.8"
62
+ Requires-Dist: pip>=24.1; python_version >= "3.8"
63
+ Requires-Dist: packaging>=24.0; python_version < "3.8"
64
+ Requires-Dist: packaging>=24.1; python_version >= "3.8"
63
65
  Requires-Dist: setuptools>=68.0.0; python_version < "3.8"
64
- Requires-Dist: setuptools>=70.0.0; python_version >= "3.8"
66
+ Requires-Dist: setuptools>=70.1.0; python_version >= "3.8"
65
67
  Requires-Dist: wheel>=0.42.0; python_version < "3.8"
66
68
  Requires-Dist: wheel>=0.43.0; python_version >= "3.8"
67
69
  Requires-Dist: attrs>=23.2.0
68
70
  Requires-Dist: certifi>=2024.6.2
69
71
  Requires-Dist: exceptiongroup>=1.2.1
70
72
  Requires-Dist: filelock>=3.12.2; python_version < "3.8"
71
- Requires-Dist: filelock>=3.14.0; python_version >= "3.8"
73
+ Requires-Dist: filelock>=3.15.3; python_version >= "3.8"
72
74
  Requires-Dist: platformdirs>=4.0.0; python_version < "3.8"
73
75
  Requires-Dist: platformdirs>=4.2.2; python_version >= "3.8"
74
76
  Requires-Dist: typing-extensions>=4.12.2; python_version >= "3.8"
75
- Requires-Dist: parse>=1.20.1
77
+ Requires-Dist: parse>=1.20.2
76
78
  Requires-Dist: parse-type>=0.6.2
77
79
  Requires-Dist: pyyaml>=6.0.1
78
80
  Requires-Dist: six==1.16.0
@@ -90,8 +92,9 @@ Requires-Dist: trio==0.22.2; python_version < "3.8"
90
92
  Requires-Dist: trio==0.25.1; python_version >= "3.8"
91
93
  Requires-Dist: trio-websocket==0.11.1
92
94
  Requires-Dist: wsproto==1.2.0
95
+ Requires-Dist: websocket-client==1.8.0; python_version >= "3.8"
93
96
  Requires-Dist: selenium==4.11.2; python_version < "3.8"
94
- Requires-Dist: selenium==4.21.0; python_version >= "3.8"
97
+ Requires-Dist: selenium==4.22.0; python_version >= "3.8"
95
98
  Requires-Dist: cssselect==1.2.0
96
99
  Requires-Dist: sortedcontainers==2.4.0
97
100
  Requires-Dist: fasteners==0.19
@@ -124,6 +127,7 @@ Requires-Dist: tabcompleter==1.3.0
124
127
  Requires-Dist: pdbp==1.5.0
125
128
  Requires-Dist: colorama==0.4.6
126
129
  Requires-Dist: pyotp==2.9.0
130
+ Requires-Dist: python-xlib==0.33; platform_system == "Linux"
127
131
  Requires-Dist: markdown-it-py==2.2.0; python_version < "3.8"
128
132
  Requires-Dist: markdown-it-py==3.0.0; python_version >= "3.8"
129
133
  Requires-Dist: mdurl==0.1.2
@@ -139,12 +143,12 @@ Requires-Dist: pytest-cov==4.1.0; python_version < "3.8" and extra == "coverage"
139
143
  Requires-Dist: pytest-cov>=5.0.0; python_version >= "3.8" and extra == "coverage"
140
144
  Provides-Extra: flake8
141
145
  Requires-Dist: flake8==5.0.4; python_version < "3.9" and extra == "flake8"
142
- Requires-Dist: flake8==7.0.0; python_version >= "3.9" and extra == "flake8"
146
+ Requires-Dist: flake8==7.1.0; python_version >= "3.9" and extra == "flake8"
143
147
  Requires-Dist: mccabe==0.7.0; extra == "flake8"
144
148
  Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
145
149
  Requires-Dist: pyflakes==3.2.0; python_version >= "3.9" and extra == "flake8"
146
150
  Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
147
- Requires-Dist: pycodestyle==2.11.1; python_version >= "3.9" and extra == "flake8"
151
+ Requires-Dist: pycodestyle==2.12.0; python_version >= "3.9" and extra == "flake8"
148
152
  Provides-Extra: ipdb
149
153
  Requires-Dist: ipdb==0.13.13; extra == "ipdb"
150
154
  Requires-Dist: ipython==7.34.0; extra == "ipdb"
@@ -165,6 +169,8 @@ Provides-Extra: proxy
165
169
  Requires-Dist: proxy.py==2.4.4; extra == "proxy"
166
170
  Provides-Extra: psutil
167
171
  Requires-Dist: psutil==5.9.8; extra == "psutil"
172
+ Provides-Extra: pyautogui
173
+ Requires-Dist: PyAutoGUI==0.9.54; extra == "pyautogui"
168
174
  Provides-Extra: selenium-stealth
169
175
  Requires-Dist: selenium-stealth==1.0.6; extra == "selenium-stealth"
170
176
  Provides-Extra: selenium-wire
@@ -111,7 +111,7 @@ self.click_partial_link(partial_link_text, timeout=None)
111
111
  # Duplicates:
112
112
  # self.click_partial_link_text(partial_link_text, timeout=None)
113
113
 
114
- self.get_text(selector, by="css selector", timeout=None)
114
+ self.get_text(selector="html", by="css selector", timeout=None)
115
115
 
116
116
  self.get_attribute(selector, attribute, by="css selector", timeout=None, hard_fail=True)
117
117
 
@@ -127,7 +127,7 @@ self.remove_attributes(selector, attribute, by="css selector")
127
127
 
128
128
  self.get_property(selector, property, by="css selector", timeout=None)
129
129
 
130
- self.get_text_content(selector, by="css selector", timeout=None)
130
+ self.get_text_content(selector="html", by="css selector", timeout=None)
131
131
 
132
132
  self.get_property_value(selector, property, by="css selector", timeout=None)
133
133
 
@@ -229,7 +229,7 @@ self.set_window_size(width, height)
229
229
 
230
230
  self.maximize_window()
231
231
 
232
- self.switch_to_frame(frame, timeout=None)
232
+ self.switch_to_frame(frame="iframe", timeout=None)
233
233
 
234
234
  self.switch_to_default_content()
235
235
 
@@ -1032,7 +1032,7 @@ driver.get_page_source()
1032
1032
 
1033
1033
  driver.get_title()
1034
1034
 
1035
- driver.switch_to_frame(frame)
1035
+ driver.switch_to_frame(frame="iframe")
1036
1036
 
1037
1037
  ############
1038
1038
 
@@ -1046,7 +1046,7 @@ 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()
1049
+ driver.uc_open_with_disconnect(url, timeout=None) # New tab + sleep()
1050
1050
 
1051
1051
  driver.reconnect(timeout) # disconnect() + sleep(timeout) + connect()
1052
1052
 
@@ -1056,7 +1056,15 @@ driver.connect() # Starts the webdriver service to allow actions again
1056
1056
 
1057
1057
  driver.uc_click(selector) # A stealthy click for evading bot-detection
1058
1058
 
1059
- driver.uc_switch_to_frame(frame) # switch_to_frame() in a stealthy way
1059
+ driver.uc_gui_press_key(key) # Use PyAutoGUI to press the keyboard key
1060
+
1061
+ driver.uc_gui_press_keys(keys) # Use PyAutoGUI to press a list of keys
1062
+
1063
+ driver.uc_gui_write(text) # Similar to uc_gui_press_keys(), but faster
1064
+
1065
+ driver.uc_gui_handle_cf(frame="iframe") # PyAutoGUI click CF Turnstile
1066
+
1067
+ driver.uc_switch_to_frame(frame="iframe") # Stealthy switch_to_frame()
1060
1068
  ```
1061
1069
 
1062
1070
  --------
@@ -3,7 +3,7 @@
3
3
 
4
4
  regex>=2024.5.15
5
5
  pymdown-extensions>=10.8.1
6
- pipdeptree>=2.22.0
6
+ pipdeptree>=2.23.0
7
7
  python-dateutil>=2.8.2
8
8
  Markdown==3.6
9
9
  markdown2==2.4.13
@@ -12,7 +12,7 @@ Jinja2==3.1.4
12
12
  click==8.1.7
13
13
  ghp-import==2.1.0
14
14
  watchdog==4.0.1
15
- cairocffi==1.7.0
15
+ cairocffi==1.7.1
16
16
  pathspec==0.12.1
17
17
  Babel==2.15.0
18
18
  paginate==0.5.6
@@ -20,7 +20,7 @@ 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.26
23
+ mkdocs-material==9.5.27
24
24
  mkdocs-exclude-search==0.6.6
25
25
  mkdocs-simple-hooks==0.1.5
26
26
  mkdocs-material-extensions==1.3.1
@@ -1,18 +1,20 @@
1
- pip>=24.0
2
- packaging>=24.0
1
+ pip>=24.0;python_version<"3.8"
2
+ pip>=24.1;python_version>="3.8"
3
+ packaging>=24.0;python_version<"3.8"
4
+ packaging>=24.1;python_version>="3.8"
3
5
  setuptools>=68.0.0;python_version<"3.8"
4
- setuptools>=70.0.0;python_version>="3.8"
6
+ setuptools>=70.1.0;python_version>="3.8"
5
7
  wheel>=0.42.0;python_version<"3.8"
6
8
  wheel>=0.43.0;python_version>="3.8"
7
9
  attrs>=23.2.0
8
10
  certifi>=2024.6.2
9
11
  exceptiongroup>=1.2.1
10
12
  filelock>=3.12.2;python_version<"3.8"
11
- filelock>=3.14.0;python_version>="3.8"
13
+ filelock>=3.15.3;python_version>="3.8"
12
14
  platformdirs>=4.0.0;python_version<"3.8"
13
15
  platformdirs>=4.2.2;python_version>="3.8"
14
16
  typing-extensions>=4.12.2;python_version>="3.8"
15
- parse>=1.20.1
17
+ parse>=1.20.2
16
18
  parse-type>=0.6.2
17
19
  pyyaml>=6.0.1
18
20
  six==1.16.0
@@ -30,8 +32,9 @@ trio==0.22.2;python_version<"3.8"
30
32
  trio==0.25.1;python_version>="3.8"
31
33
  trio-websocket==0.11.1
32
34
  wsproto==1.2.0
35
+ websocket-client==1.8.0;python_version>="3.8"
33
36
  selenium==4.11.2;python_version<"3.8"
34
- selenium==4.21.0;python_version>="3.8"
37
+ selenium==4.22.0;python_version>="3.8"
35
38
  cssselect==1.2.0
36
39
  sortedcontainers==2.4.0
37
40
  fasteners==0.19
@@ -64,6 +67,7 @@ tabcompleter==1.3.0
64
67
  pdbp==1.5.0
65
68
  colorama==0.4.6
66
69
  pyotp==2.9.0
70
+ python-xlib==0.33;platform_system=="Linux"
67
71
  markdown-it-py==2.2.0;python_version<"3.8"
68
72
  markdown-it-py==3.0.0;python_version>="3.8"
69
73
  mdurl==0.1.2
@@ -77,9 +81,9 @@ coverage>=7.5.3;python_version>="3.8"
77
81
  pytest-cov==4.1.0;python_version<"3.8"
78
82
  pytest-cov>=5.0.0;python_version>="3.8"
79
83
  flake8==5.0.4;python_version<"3.9"
80
- flake8==7.0.0;python_version>="3.9"
84
+ flake8==7.1.0;python_version>="3.9"
81
85
  mccabe==0.7.0
82
86
  pyflakes==2.5.0;python_version<"3.9"
83
87
  pyflakes==3.2.0;python_version>="3.9"
84
88
  pycodestyle==2.9.1;python_version<"3.9"
85
- pycodestyle==2.11.1;python_version>="3.9"
89
+ pycodestyle==2.12.0;python_version>="3.9"
@@ -1,4 +1,5 @@
1
1
  import collections
2
+ import os
2
3
  import pdb
3
4
  try:
4
5
  import pdbp # (Pdb+) --- Python Debugger Plus
@@ -34,11 +35,13 @@ if sys.version_info[0] < 3 and "pdbp" in locals():
34
35
  pdb.DefaultConfig.truncate_long_lines = False
35
36
  pdb.DefaultConfig.sticky_by_default = True
36
37
  colored_traceback.add_hook()
38
+ os.environ["SE_AVOID_STATS"] = "true" # Disable Selenium Manager stats
37
39
  if sys.version_info >= (3, 7):
38
40
  webdriver.TouchActions = None # Lifeline for past selenium-wire versions
39
41
  if sys.version_info >= (3, 10):
40
42
  collections.Callable = collections.abc.Callable # Lifeline for nosetests
41
43
  del collections # Undo "import collections" / Simplify "dir(seleniumbase)"
44
+ del os # Undo "import os" / Simplify "dir(seleniumbase)"
42
45
  del sys # Undo "import sys" / Simplify "dir(seleniumbase)"
43
46
  del webdriver # Undo "import webdriver" / Simplify "dir(seleniumbase)"
44
47
 
@@ -0,0 +1,2 @@
1
+ # seleniumbase package
2
+ __version__ = "4.28.0a1"
@@ -861,13 +861,14 @@ def get_configured_sb(context):
861
861
  and not sb.headless
862
862
  and not sb.headless2
863
863
  and not sb.xvfb
864
+ and not sb.undetectable
864
865
  ):
865
866
  print(
866
867
  '(Linux uses "-D headless" by default. '
867
868
  'To override, use "-D headed" / "-D gui". '
868
869
  'For Xvfb mode instead, use "-D xvfb". '
869
870
  "Or you can hide this info by using"
870
- '"-D headless" / "-D headless2".)'
871
+ '"-D headless" / "-D headless2" / "-D uc".)'
871
872
  )
872
873
  sb.headless = True
873
874
  # Recorder Mode can still optimize scripts in --headless2 mode.
@@ -11,6 +11,7 @@ import urllib3
11
11
  import warnings
12
12
  from selenium import webdriver
13
13
  from selenium.common.exceptions import ElementClickInterceptedException
14
+ from selenium.common.exceptions import InvalidSessionIdException
14
15
  from selenium.webdriver.chrome.service import Service as ChromeService
15
16
  from selenium.webdriver.common.options import ArgOptions
16
17
  from selenium.webdriver.common.service import utils as service_utils
@@ -28,6 +29,7 @@ from seleniumbase.core import proxy_helper
28
29
  from seleniumbase.core import sb_driver
29
30
  from seleniumbase.fixtures import constants
30
31
  from seleniumbase.fixtures import js_utils
32
+ from seleniumbase.fixtures import page_actions
31
33
  from seleniumbase.fixtures import shared_utils
32
34
 
33
35
  urllib3.disable_warnings()
@@ -130,9 +132,13 @@ def extend_driver(driver):
130
132
  page.assert_element_not_visible = DM.assert_element_not_visible
131
133
  page.assert_text = DM.assert_text
132
134
  page.assert_exact_text = DM.assert_exact_text
135
+ page.assert_non_empty_text = DM.assert_non_empty_text
136
+ page.assert_text_not_visible = DM.assert_text_not_visible
133
137
  page.wait_for_element = DM.wait_for_element
134
138
  page.wait_for_text = DM.wait_for_text
135
139
  page.wait_for_exact_text = DM.wait_for_exact_text
140
+ page.wait_for_non_empty_text = DM.wait_for_non_empty_text
141
+ page.wait_for_text_not_visible = DM.wait_for_text_not_visible
136
142
  page.wait_for_and_accept_alert = DM.wait_for_and_accept_alert
137
143
  page.wait_for_and_dismiss_alert = DM.wait_for_and_dismiss_alert
138
144
  page.is_element_present = DM.is_element_present
@@ -140,12 +146,20 @@ def extend_driver(driver):
140
146
  page.is_text_visible = DM.is_text_visible
141
147
  page.is_exact_text_visible = DM.is_exact_text_visible
142
148
  page.is_attribute_present = DM.is_attribute_present
149
+ page.is_non_empty_text_visible = DM.is_non_empty_text_visible
143
150
  page.get_text = DM.get_text
144
151
  page.find_element = DM.find_element
145
152
  page.find_elements = DM.find_elements
146
153
  page.locator = DM.locator
147
154
  page.get_page_source = DM.get_page_source
148
155
  page.get_title = DM.get_title
156
+ page.switch_to_default_window = DM.switch_to_default_window
157
+ page.switch_to_newest_window = DM.switch_to_newest_window
158
+ page.open_new_window = DM.open_new_window
159
+ page.open_new_tab = DM.open_new_tab
160
+ page.switch_to_window = DM.switch_to_window
161
+ page.switch_to_tab = DM.switch_to_tab
162
+ page.switch_to_frame = DM.switch_to_frame
149
163
  driver.page = page
150
164
  js = types.SimpleNamespace()
151
165
  js.js_click = DM.js_click
@@ -169,12 +183,16 @@ def extend_driver(driver):
169
183
  driver.assert_element_not_visible = DM.assert_element_not_visible
170
184
  driver.assert_text = DM.assert_text
171
185
  driver.assert_exact_text = DM.assert_exact_text
186
+ driver.assert_non_empty_text = DM.assert_non_empty_text
187
+ driver.assert_text_not_visible = DM.assert_text_not_visible
172
188
  driver.wait_for_element = DM.wait_for_element
173
189
  driver.wait_for_element_visible = DM.wait_for_element_visible
174
190
  driver.wait_for_element_present = DM.wait_for_element_present
175
191
  driver.wait_for_selector = DM.wait_for_selector
176
192
  driver.wait_for_text = DM.wait_for_text
177
193
  driver.wait_for_exact_text = DM.wait_for_exact_text
194
+ driver.wait_for_non_empty_text = DM.wait_for_non_empty_text
195
+ driver.wait_for_text_not_visible = DM.wait_for_text_not_visible
178
196
  driver.wait_for_and_accept_alert = DM.wait_for_and_accept_alert
179
197
  driver.wait_for_and_dismiss_alert = DM.wait_for_and_dismiss_alert
180
198
  driver.is_element_present = DM.is_element_present
@@ -182,8 +200,10 @@ def extend_driver(driver):
182
200
  driver.is_text_visible = DM.is_text_visible
183
201
  driver.is_exact_text_visible = DM.is_exact_text_visible
184
202
  driver.is_attribute_present = DM.is_attribute_present
185
- driver.get_text = DM.get_text
203
+ driver.is_non_empty_text_visible = DM.is_non_empty_text_visible
204
+ driver.is_online = DM.is_online
186
205
  driver.js_click = DM.js_click
206
+ driver.get_text = DM.get_text
187
207
  driver.get_active_element_css = DM.get_active_element_css
188
208
  driver.get_locale_code = DM.get_locale_code
189
209
  driver.get_origin = DM.get_origin
@@ -195,6 +215,12 @@ def extend_driver(driver):
195
215
  driver.get_attribute = DM.get_attribute
196
216
  driver.get_page_source = DM.get_page_source
197
217
  driver.get_title = DM.get_title
218
+ driver.switch_to_default_window = DM.switch_to_default_window
219
+ driver.switch_to_newest_window = DM.switch_to_newest_window
220
+ driver.open_new_window = DM.open_new_window
221
+ driver.open_new_tab = DM.open_new_tab
222
+ driver.switch_to_window = DM.switch_to_window
223
+ driver.switch_to_tab = DM.switch_to_tab
198
224
  driver.switch_to_frame = DM.switch_to_frame
199
225
  if hasattr(driver, "proxy"):
200
226
  driver.set_wire_proxy = DM.set_wire_proxy
@@ -409,7 +435,7 @@ def uc_open(driver, url):
409
435
  if (url.startswith("http:") or url.startswith("https:")):
410
436
  with driver:
411
437
  script = 'window.location.href = "%s";' % url
412
- js_utils.call_me_later(driver, script, 33)
438
+ js_utils.call_me_later(driver, script, 5)
413
439
  else:
414
440
  driver.default_get(url) # The original one
415
441
  return None
@@ -440,22 +466,28 @@ def uc_open_with_reconnect(driver, url, reconnect_time=None):
440
466
  url = "https://" + url
441
467
  if (url.startswith("http:") or url.startswith("https:")):
442
468
  script = 'window.open("%s","_blank");' % url
443
- js_utils.call_me_later(driver, script, 3)
469
+ js_utils.call_me_later(driver, script, 4)
444
470
  time.sleep(0.007)
445
471
  driver.close()
446
472
  if reconnect_time == "disconnect":
447
473
  driver.disconnect()
448
- time.sleep(0.007)
474
+ time.sleep(0.008)
449
475
  else:
450
476
  driver.reconnect(reconnect_time)
451
- driver.switch_to.window(driver.window_handles[-1])
477
+ time.sleep(0.004)
478
+ try:
479
+ driver.switch_to.window(driver.window_handles[-1])
480
+ except InvalidSessionIdException:
481
+ time.sleep(0.05)
482
+ driver.switch_to.window(driver.window_handles[-1])
452
483
  else:
453
484
  driver.default_get(url) # The original one
454
485
  return None
455
486
 
456
487
 
457
- def uc_open_with_disconnect(driver, url):
488
+ def uc_open_with_disconnect(driver, url, timeout=None):
458
489
  """Open a url and disconnect chromedriver.
490
+ Then waits for the duration of the timeout.
459
491
  Note: You can't perform Selenium actions again
460
492
  until after you've called driver.connect()."""
461
493
  if url.startswith("//"):
@@ -464,11 +496,16 @@ def uc_open_with_disconnect(driver, url):
464
496
  url = "https://" + url
465
497
  if (url.startswith("http:") or url.startswith("https:")):
466
498
  script = 'window.open("%s","_blank");' % url
467
- js_utils.call_me_later(driver, script, 3)
499
+ js_utils.call_me_later(driver, script, 4)
468
500
  time.sleep(0.007)
469
501
  driver.close()
470
502
  driver.disconnect()
471
- time.sleep(0.007)
503
+ min_timeout = 0.008
504
+ if timeout and not str(timeout).replace(".", "", 1).isdigit():
505
+ timeout = min_timeout
506
+ if not timeout or timeout < min_timeout:
507
+ timeout = min_timeout
508
+ time.sleep(timeout)
472
509
  else:
473
510
  driver.default_get(url) # The original one
474
511
  return None
@@ -490,7 +527,7 @@ def uc_click(
490
527
  pass
491
528
  element = driver.wait_for_selector(selector, by=by, timeout=timeout)
492
529
  tag_name = element.tag_name
493
- if not tag_name == "span": # Element must be "visible"
530
+ if not tag_name == "span" and not tag_name == "input": # Must be "visible"
494
531
  element = driver.wait_for_element(selector, by=by, timeout=timeout)
495
532
  try:
496
533
  element.uc_click(
@@ -509,7 +546,143 @@ def uc_click(
509
546
  driver.reconnect(reconnect_time)
510
547
 
511
548
 
512
- def uc_switch_to_frame(driver, frame, reconnect_time=None):
549
+ def install_pyautogui_if_missing():
550
+ pip_find_lock = fasteners.InterProcessLock(
551
+ constants.PipInstall.FINDLOCK
552
+ )
553
+ with pip_find_lock: # Prevent issues with multiple processes
554
+ try:
555
+ import pyautogui
556
+ try:
557
+ use_pyautogui_ver = constants.PyAutoGUI.VER
558
+ if pyautogui.__version__ != use_pyautogui_ver:
559
+ shared_utils.pip_install(
560
+ "pyautogui", version=use_pyautogui_ver
561
+ )
562
+ del pyautogui
563
+ except Exception:
564
+ pass
565
+ except Exception:
566
+ print("\nPyAutoGUI required! Installing now...")
567
+ shared_utils.pip_install(
568
+ "pyautogui", version=constants.PyAutoGUI.VER
569
+ )
570
+
571
+
572
+ def get_configured_pyautogui(pyautogui_copy):
573
+ if (
574
+ IS_LINUX
575
+ and hasattr(pyautogui_copy, "_pyautogui_x11")
576
+ and "DISPLAY" in os.environ.keys()
577
+ ):
578
+ if (
579
+ hasattr(sb_config, "_pyautogui_x11_display")
580
+ and sb_config._pyautogui_x11_display
581
+ and hasattr(pyautogui_copy._pyautogui_x11, "_display")
582
+ and (
583
+ sb_config._pyautogui_x11_display
584
+ == pyautogui_copy._pyautogui_x11._display
585
+ )
586
+ ):
587
+ pass
588
+ else:
589
+ import Xlib.display
590
+ pyautogui_copy._pyautogui_x11._display = (
591
+ Xlib.display.Display(os.environ['DISPLAY'])
592
+ )
593
+ sb_config._pyautogui_x11_display = (
594
+ pyautogui_copy._pyautogui_x11._display
595
+ )
596
+ return pyautogui_copy
597
+
598
+
599
+ def uc_gui_press_key(driver, key):
600
+ install_pyautogui_if_missing()
601
+ import pyautogui
602
+ pyautogui = get_configured_pyautogui(pyautogui)
603
+ gui_lock = fasteners.InterProcessLock(
604
+ constants.MultiBrowser.PYAUTOGUILOCK
605
+ )
606
+ with gui_lock:
607
+ pyautogui.press(key)
608
+
609
+
610
+ def uc_gui_press_keys(driver, keys):
611
+ install_pyautogui_if_missing()
612
+ import pyautogui
613
+ pyautogui = get_configured_pyautogui(pyautogui)
614
+ gui_lock = fasteners.InterProcessLock(
615
+ constants.MultiBrowser.PYAUTOGUILOCK
616
+ )
617
+ with gui_lock:
618
+ for key in keys:
619
+ pyautogui.press(key)
620
+
621
+
622
+ def uc_gui_write(driver, text):
623
+ install_pyautogui_if_missing()
624
+ import pyautogui
625
+ pyautogui = get_configured_pyautogui(pyautogui)
626
+ gui_lock = fasteners.InterProcessLock(
627
+ constants.MultiBrowser.PYAUTOGUILOCK
628
+ )
629
+ with gui_lock:
630
+ pyautogui.write(text)
631
+
632
+
633
+ def uc_gui_handle_cf(driver, frame="iframe"):
634
+ source = driver.get_page_source()
635
+ if (
636
+ "//challenges.cloudflare.com" not in source
637
+ and 'aria-label="Cloudflare"' not in source
638
+ ):
639
+ return
640
+ install_pyautogui_if_missing()
641
+ import pyautogui
642
+ pyautogui = get_configured_pyautogui(pyautogui)
643
+ gui_lock = fasteners.InterProcessLock(
644
+ constants.MultiBrowser.PYAUTOGUILOCK
645
+ )
646
+ with gui_lock: # Prevent issues with multiple processes
647
+ needs_switch = False
648
+ is_in_frame = js_utils.is_in_frame(driver)
649
+ if is_in_frame and driver.is_element_present("#challenge-stage"):
650
+ driver.switch_to.parent_frame()
651
+ needs_switch = True
652
+ is_in_frame = js_utils.is_in_frame(driver)
653
+ if not is_in_frame:
654
+ # Make sure the window is on top
655
+ page_actions.switch_to_window(
656
+ driver,
657
+ driver.current_window_handle,
658
+ timeout=settings.SMALL_TIMEOUT,
659
+ )
660
+ if not is_in_frame or needs_switch:
661
+ # Currently not in frame (or nested frame outside CF one)
662
+ try:
663
+ driver.switch_to_frame(frame)
664
+ except Exception:
665
+ if driver.is_element_present("iframe"):
666
+ driver.switch_to_frame("iframe")
667
+ else:
668
+ return
669
+ try:
670
+ driver.execute_script('document.querySelector("input").focus()')
671
+ except Exception:
672
+ try:
673
+ driver.switch_to.default_content()
674
+ except Exception:
675
+ return
676
+ driver.disconnect()
677
+ try:
678
+ pyautogui.press(" ")
679
+ except Exception:
680
+ pass
681
+ reconnect_time = (float(constants.UC.RECONNECT_TIME) / 2.0) + 0.5
682
+ driver.reconnect(reconnect_time)
683
+
684
+
685
+ def uc_switch_to_frame(driver, frame="iframe", reconnect_time=None):
513
686
  from selenium.webdriver.remote.webelement import WebElement
514
687
  if isinstance(frame, WebElement):
515
688
  if not reconnect_time:
@@ -847,7 +1020,7 @@ def _set_chrome_options(
847
1020
  prefs["download.prompt_for_download"] = False
848
1021
  prefs["credentials_enable_service"] = False
849
1022
  prefs["local_discovery.notifications_enabled"] = False
850
- prefs["safebrowsing.enabled"] = False
1023
+ prefs["safebrowsing.enabled"] = True
851
1024
  prefs["safebrowsing.disable_download_protection"] = True
852
1025
  prefs["omnibox-max-zero-suggest-matches"] = 0
853
1026
  prefs["omnibox-use-existing-autocomplete-client"] = 0
@@ -1145,6 +1318,7 @@ def _set_chrome_options(
1145
1318
  chrome_options.add_argument("--auto-open-devtools-for-tabs")
1146
1319
  if user_agent:
1147
1320
  chrome_options.add_argument("--user-agent=%s" % user_agent)
1321
+ chrome_options.add_argument("--safebrowsing-disable-download-protection")
1148
1322
  chrome_options.add_argument("--disable-browser-side-navigation")
1149
1323
  chrome_options.add_argument("--disable-save-password-bubble")
1150
1324
  chrome_options.add_argument("--disable-single-click-autofill")
@@ -1183,10 +1357,9 @@ def _set_chrome_options(
1183
1357
  included_disabled_features.append("DownloadBubbleV2")
1184
1358
  included_disabled_features.append("InsecureDownloadWarnings")
1185
1359
  included_disabled_features.append("InterestFeedContentSuggestions")
1186
- if user_data_dir:
1187
- included_disabled_features.append("PrivacySandboxSettings4")
1188
- if not is_using_uc(undetectable, browser_name) or user_data_dir:
1189
- included_disabled_features.append("SidePanelPinning")
1360
+ included_disabled_features.append("PrivacySandboxSettings4")
1361
+ included_disabled_features.append("SidePanelPinning")
1362
+ included_disabled_features.append("UserAgentClientHint")
1190
1363
  for item in extra_disabled_features:
1191
1364
  if item not in included_disabled_features:
1192
1365
  included_disabled_features.append(item)
@@ -1374,7 +1547,7 @@ def _set_firefox_options(
1374
1547
  f_pref_value = False
1375
1548
  elif f_pref_value.isdigit():
1376
1549
  f_pref_value = int(f_pref_value)
1377
- elif f_pref_value.isdecimal():
1550
+ elif f_pref_value.replace(".", "", 1).isdigit():
1378
1551
  f_pref_value = float(f_pref_value)
1379
1552
  else:
1380
1553
  pass # keep as string
@@ -2438,7 +2611,7 @@ def get_local_driver(
2438
2611
  "credentials_enable_service": False,
2439
2612
  "local_discovery.notifications_enabled": False,
2440
2613
  "safebrowsing.disable_download_protection": True,
2441
- "safebrowsing.enabled": False,
2614
+ "safebrowsing.enabled": True,
2442
2615
  "omnibox-max-zero-suggest-matches": 0,
2443
2616
  "omnibox-use-existing-autocomplete-client": 0,
2444
2617
  "omnibox-trending-zero-prefix-suggestions-on-ntp": 0,
@@ -2707,6 +2880,7 @@ def get_local_driver(
2707
2880
  edge_options.add_argument(
2708
2881
  "--disable-autofill-keyboard-accessory-view[8]"
2709
2882
  )
2883
+ edge_options.add_argument("--safebrowsing-disable-download-protection")
2710
2884
  edge_options.add_argument("--disable-browser-side-navigation")
2711
2885
  edge_options.add_argument("--disable-translate")
2712
2886
  if not enable_ws:
@@ -2848,10 +3022,9 @@ def get_local_driver(
2848
3022
  included_disabled_features.append("OptimizationGuideModelDownloading")
2849
3023
  included_disabled_features.append("InsecureDownloadWarnings")
2850
3024
  included_disabled_features.append("InterestFeedContentSuggestions")
2851
- if user_data_dir:
2852
- included_disabled_features.append("PrivacySandboxSettings4")
2853
- if not is_using_uc(undetectable, browser_name) or user_data_dir:
2854
- included_disabled_features.append("SidePanelPinning")
3025
+ included_disabled_features.append("PrivacySandboxSettings4")
3026
+ included_disabled_features.append("SidePanelPinning")
3027
+ included_disabled_features.append("UserAgentClientHint")
2855
3028
  for item in extra_disabled_features:
2856
3029
  if item not in included_disabled_features:
2857
3030
  included_disabled_features.append(item)
@@ -3822,6 +3995,26 @@ def get_local_driver(
3822
3995
  driver.uc_click = lambda *args, **kwargs: uc_click(
3823
3996
  driver, *args, **kwargs
3824
3997
  )
3998
+ driver.uc_gui_press_key = (
3999
+ lambda *args, **kwargs: uc_gui_press_key(
4000
+ driver, *args, **kwargs
4001
+ )
4002
+ )
4003
+ driver.uc_gui_press_keys = (
4004
+ lambda *args, **kwargs: uc_gui_press_keys(
4005
+ driver, *args, **kwargs
4006
+ )
4007
+ )
4008
+ driver.uc_gui_write = (
4009
+ lambda *args, **kwargs: uc_gui_write(
4010
+ driver, *args, **kwargs
4011
+ )
4012
+ )
4013
+ driver.uc_gui_handle_cf = (
4014
+ lambda *args, **kwargs: uc_gui_handle_cf(
4015
+ driver, *args, **kwargs
4016
+ )
4017
+ )
3825
4018
  driver.uc_switch_to_frame = (
3826
4019
  lambda *args, **kwargs: uc_switch_to_frame(
3827
4020
  driver, *args, **kwargs