seleniumbase 4.28.0a3__tar.gz → 4.28.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (517) hide show
  1. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/Dockerfile +47 -26
  2. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/PKG-INFO +6 -6
  3. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/uc_cdp_events.py +2 -3
  4. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/requirements.txt +5 -5
  5. seleniumbase-4.28.2/seleniumbase/__version__.py +2 -0
  6. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/browser_launcher.py +28 -19
  7. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/page_actions.py +16 -2
  8. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/shared_utils.py +11 -11
  9. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/driver_manager.py +14 -0
  10. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/sb_manager.py +14 -0
  11. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/undetected/__init__.py +12 -8
  12. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase.egg-info/PKG-INFO +6 -6
  13. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase.egg-info/requires.txt +5 -5
  14. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/setup.py +5 -5
  15. seleniumbase-4.28.0a3/seleniumbase/__version__.py +0 -2
  16. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/.github/Workflows.md +0 -0
  17. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/.github/workflows/pages.yml +0 -0
  18. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/.github/workflows/python-nightly-mac.yml +0 -0
  19. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/.github/workflows/python-nightly-ubuntu.yml +0 -0
  20. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/.github/workflows/python-nightly-windows.yml +0 -0
  21. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/.github/workflows/python-package.yml +0 -0
  22. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/.gitignore +0 -0
  23. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/CHANGELOG.md +0 -0
  24. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/CNAME +0 -0
  25. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/CODE_OF_CONDUCT.md +0 -0
  26. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/CONTRIBUTING.md +0 -0
  27. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/LICENSE +0 -0
  28. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/MANIFEST.in +0 -0
  29. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/README.md +0 -0
  30. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/SECURITY.md +0 -0
  31. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/_config.yml +0 -0
  32. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/azure-pipelines.yml +0 -0
  33. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/ReadMe.md +0 -0
  34. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/__init__.py +0 -0
  35. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/basic_test.py +0 -0
  36. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/ReadMe.md +0 -0
  37. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/__init__.py +0 -0
  38. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/behave.ini +0 -0
  39. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/__init__.py +0 -0
  40. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/behave.ini +0 -0
  41. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/calculator.feature +0 -0
  42. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/environment.py +0 -0
  43. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/fail_page.feature +0 -0
  44. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/realworld.feature +0 -0
  45. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/steps/__init__.py +0 -0
  46. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/steps/calculator.py +0 -0
  47. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/steps/fail_page.py +0 -0
  48. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/steps/imported.py +0 -0
  49. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
  50. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/behave_bdd/features/swag_labs.feature +0 -0
  51. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/ReadMe.md +0 -0
  52. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/__init__.py +0 -0
  53. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/base_test_case.py +0 -0
  54. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/boilerplate_test.py +0 -0
  55. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/classic_obj_test.py +0 -0
  56. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/page_objects.py +0 -0
  57. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/__init__.py +0 -0
  58. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
  59. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
  60. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/file_parsing/qa_login_example.txt +0 -0
  61. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/file_parsing/staging_login_example.txt +0 -0
  62. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/google_objects.py +0 -0
  63. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/google_test.py +0 -0
  64. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/sb_swag_test.py +0 -0
  65. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/swag_labs_test.py +0 -0
  66. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/samples/test_page_objects.py +0 -0
  67. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/boilerplates/sb_fixture_test.py +0 -0
  68. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/capabilities/ReadMe.md +0 -0
  69. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/capabilities/mac_cap_file.py +0 -0
  70. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/capabilities/sample_cap_file_BS.py +0 -0
  71. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/capabilities/sample_cap_file_SL.py +0 -0
  72. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/capabilities/selenoid_cap_file.py +0 -0
  73. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/capabilities/win10_cap_file.py +0 -0
  74. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_plans/basic_test.MyTestClass.test_basics.md +0 -0
  75. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_plans/my_first_test.MyTestClass.test_swag_labs.md +0 -0
  76. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_plans/shadow_root_test.ShadowRootTest.test_shadow_root.md +0 -0
  77. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_plans/test_assert_elements.ListAssertTests.test_assert_list_of_elements.md +0 -0
  78. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_plans/test_calculator.CalculatorTests.test_6_times_7_plus_12_equals_54.md +0 -0
  79. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_plans/test_demo_site.DemoSiteTests.test_demo_site.md +0 -0
  80. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_plans/test_login.SwagLabsLoginTests.test_swag_labs_login.md +0 -0
  81. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_plans/test_mfa_login.TestMFALogin.test_mfa_login.md +0 -0
  82. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/case_summary.md +0 -0
  83. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/ReadMe.md +0 -0
  84. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/chart_presentation.py +0 -0
  85. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/my_chart.py +0 -0
  86. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/pie_charts.py +0 -0
  87. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/test_area_chart.py +0 -0
  88. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/test_display_chart.py +0 -0
  89. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/test_line_chart.py +0 -0
  90. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/test_multi_series.py +0 -0
  91. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/chart_maker/test_save_chart.py +0 -0
  92. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/coffee_cart_tests.py +0 -0
  93. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/custom_settings.py +0 -0
  94. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/desktop_apps/ReadMe.md +0 -0
  95. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/desktop_apps/recorder.py +0 -0
  96. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/dialog_boxes/ReadMe.md +0 -0
  97. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/dialog_boxes/dialog_box_tour.py +0 -0
  98. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/edge_test.py +0 -0
  99. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/example_config.cfg +0 -0
  100. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/example_logs/ReadMe.md +0 -0
  101. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/example_logs/basic_test_info.txt +0 -0
  102. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/example_logs/page_source.html +0 -0
  103. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/example_logs/screenshot.png +0 -0
  104. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/github_test.py +0 -0
  105. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/gui_test_runner.py +0 -0
  106. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/hack_the_planet.py +0 -0
  107. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/handle_alert_test.py +0 -0
  108. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/iframe_tests.py +0 -0
  109. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/locale_code_test.py +0 -0
  110. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/master_qa/ReadMe.md +0 -0
  111. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/master_qa/__init__.py +0 -0
  112. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/master_qa/basic_masterqa_test_0.py +0 -0
  113. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/master_qa/masterqa_test_1.py +0 -0
  114. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/master_qa/pytest.ini +0 -0
  115. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/__init__.py +0 -0
  116. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/protractor/ReadMe.md +0 -0
  117. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/protractor/__init__.py +0 -0
  118. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/protractor/example_spec.js +0 -0
  119. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/protractor/example_test.py +0 -0
  120. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/protractor/input_spec.js +0 -0
  121. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/protractor/input_test.py +0 -0
  122. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/protractor/mat_paginator_spec.js +0 -0
  123. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/protractor/mat_paginator_test.py +0 -0
  124. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/raw_selenium/ReadMe.md +0 -0
  125. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/raw_selenium/__init__.py +0 -0
  126. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
  127. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
  128. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/raw_selenium/messy_raw.py +0 -0
  129. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/raw_selenium/pytest.ini +0 -0
  130. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/raw_selenium/refined_raw.py +0 -0
  131. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/migration/raw_selenium/simple_sbase.py +0 -0
  132. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/my_first_test.py +0 -0
  133. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/nth_child_test.py +0 -0
  134. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/offline_examples/__init__.py +0 -0
  135. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/offline_examples/demo_page.html +0 -0
  136. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/offline_examples/load_html_test.py +0 -0
  137. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/offline_examples/test_demo_page.py +0 -0
  138. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/offline_examples/test_handle_alerts.py +0 -0
  139. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/offline_examples/test_request_fixture.py +0 -0
  140. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/offline_examples/test_user_agent.py +0 -0
  141. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/old_wordle_script.py +0 -0
  142. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/parameterized_test.py +0 -0
  143. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/performance_test.py +0 -0
  144. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/presenter/ReadMe.md +0 -0
  145. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/presenter/core_presentation.py +0 -0
  146. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/presenter/edge_presentation.py +0 -0
  147. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/presenter/fundamentals.py +0 -0
  148. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/presenter/my_presentation.py +0 -0
  149. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/presenter/py_virtual_envs.py +0 -0
  150. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/proxy_test.py +0 -0
  151. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/pytest.ini +0 -0
  152. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/rate_limiting_test.py +0 -0
  153. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/raw_call.py +0 -0
  154. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/raw_driver_context.py +0 -0
  155. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/raw_file_call.py +0 -0
  156. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/raw_main_call.py +0 -0
  157. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/raw_parameter_script.py +0 -0
  158. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/raw_sb.py +0 -0
  159. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/raw_test_scripts.py +0 -0
  160. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/raw_uc_mode.py +0 -0
  161. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/setup.cfg +0 -0
  162. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/shadow_root_test.py +0 -0
  163. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/swag_labs_user_tests.py +0 -0
  164. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_apple_site.py +0 -0
  165. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_assert_elements.py +0 -0
  166. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_calculator.py +0 -0
  167. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_canvas.py +0 -0
  168. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_checkboxes.py +0 -0
  169. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_chinese_pdf.py +0 -0
  170. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_chromedriver.py +0 -0
  171. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_coffee_cart.py +0 -0
  172. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_console_logging.py +0 -0
  173. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_contains_selector.py +0 -0
  174. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_cycle_elements.py +0 -0
  175. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_decryption.py +0 -0
  176. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_deferred_asserts.py +0 -0
  177. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_demo_site.py +0 -0
  178. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_detect_404s.py +0 -0
  179. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_docs_site.py +0 -0
  180. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_double_click.py +0 -0
  181. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_download_files.py +0 -0
  182. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_download_images.py +0 -0
  183. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_drag_and_drop.py +0 -0
  184. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_error_page.py +0 -0
  185. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_event_firing.py +0 -0
  186. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_fail.py +0 -0
  187. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_geolocation.py +0 -0
  188. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_get_coffee.py +0 -0
  189. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_get_locale_code.py +0 -0
  190. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_get_pdf_text.py +0 -0
  191. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_get_user_agent.py +0 -0
  192. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_hack_search.py +0 -0
  193. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_image_saving.py +0 -0
  194. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_inspect_html.py +0 -0
  195. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_login.py +0 -0
  196. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_markers.py +0 -0
  197. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_mfa_login.py +0 -0
  198. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_multiple_drivers.py +0 -0
  199. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_null.py +0 -0
  200. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_override_driver.py +0 -0
  201. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_override_sb_fixture.py +0 -0
  202. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_parse_soup.py +0 -0
  203. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_pdf_asserts.py +0 -0
  204. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_pytest_parametrize.py +0 -0
  205. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_repeat_tests.py +0 -0
  206. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_request_sb_fixture.py +0 -0
  207. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_save_screenshots.py +0 -0
  208. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_sb_fixture.py +0 -0
  209. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_scrape_bing.py +0 -0
  210. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_select_options.py +0 -0
  211. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_shadow_dom.py +0 -0
  212. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_show_file_choosers.py +0 -0
  213. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_skype_site.py +0 -0
  214. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_suite.py +0 -0
  215. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_swag_labs.py +0 -0
  216. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_tinymce.py +0 -0
  217. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_todomvc.py +0 -0
  218. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_url_asserts.py +0 -0
  219. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_usefixtures.py +0 -0
  220. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_verify_chromedriver.py +0 -0
  221. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_window_switching.py +0 -0
  222. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_xfail.py +0 -0
  223. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/test_xkcd.py +0 -0
  224. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/time_limit_test.py +0 -0
  225. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/ReadMe.md +0 -0
  226. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/bootstrap_google_tour.py +0 -0
  227. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
  228. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/driverjs_maps_tour.py +0 -0
  229. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/google_tour.py +0 -0
  230. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/hopscotch_google_tour.py +0 -0
  231. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/introjs_google_tour.py +0 -0
  232. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/maps_introjs_tour.py +0 -0
  233. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/octocat_tour.py +0 -0
  234. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/shepherd_google_tour.py +0 -0
  235. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/tour_examples/xkcd_tour.py +0 -0
  236. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/ReadMe.md +0 -0
  237. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/chinese_test_1.py +0 -0
  238. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/dutch_test_1.py +0 -0
  239. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/english_test_1.py +0 -0
  240. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/french_test_1.py +0 -0
  241. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/italian_test_1.py +0 -0
  242. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/japanese_test_1.py +0 -0
  243. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/korean_test_1.py +0 -0
  244. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/portuguese_test_1.py +0 -0
  245. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/pytest.ini +0 -0
  246. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/russian_test_1.py +0 -0
  247. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/translations/spanish_test_1.py +0 -0
  248. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/unit_tests/ReadMe.md +0 -0
  249. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/unit_tests/verify_framework.py +0 -0
  250. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/upgrade_chromedriver.py +0 -0
  251. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/upload_file_test.py +0 -0
  252. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/user_agent_test.py +0 -0
  253. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/verify_undetected.py +0 -0
  254. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/ReadMe.md +0 -0
  255. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/__init__.py +0 -0
  256. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/case_plans/layout_test.VisualLayoutTests.test_applitools_layout_change.md +0 -0
  257. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/case_plans/python_home_test.VisualLayoutTests.test_python_home_layout_change.md +0 -0
  258. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_applitools_change.md +0 -0
  259. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_xkcd_logo_change.md +0 -0
  260. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/case_plans/test_layout_fail.VisualLayout_FixtureTests.test_python_home_change.md +0 -0
  261. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/case_plans/xkcd_visual_test.VisualLayoutTests.test_xkcd_layout_change.md +0 -0
  262. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/layout_test.py +0 -0
  263. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/python_home_test.py +0 -0
  264. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/test_layout_fail.py +0 -0
  265. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/visual_testing/xkcd_visual_test.py +0 -0
  266. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/wordle_test.py +0 -0
  267. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/xpath_test.py +0 -0
  268. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/examples/youtube_search_test.py +0 -0
  269. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/ReadMe.md +0 -0
  270. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/behave_gui.md +0 -0
  271. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/case_plans.md +0 -0
  272. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/chinese.md +0 -0
  273. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/commander.md +0 -0
  274. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/customizing_test_runs.md +0 -0
  275. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/demo_mode.md +0 -0
  276. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/desired_capabilities.md +0 -0
  277. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/features_list.md +0 -0
  278. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/handling_iframes.md +0 -0
  279. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/happy_customers.md +0 -0
  280. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/hidden_files_info.md +0 -0
  281. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/how_it_works.md +0 -0
  282. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/html_inspector.md +0 -0
  283. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/install.md +0 -0
  284. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/install_python_pip_git.md +0 -0
  285. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/js_package_manager.md +0 -0
  286. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/locale_codes.md +0 -0
  287. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/method_summary.md +0 -0
  288. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/mobile_testing.md +0 -0
  289. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/mysql_installation.md +0 -0
  290. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/recorder_mode.md +0 -0
  291. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/shadow_dom.md +0 -0
  292. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/syntax_formats.md +0 -0
  293. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/thank_you.md +0 -0
  294. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/translations.md +0 -0
  295. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/useful_grep_commands.md +0 -0
  296. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/using_safari_driver.md +0 -0
  297. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/verify_webdriver.md +0 -0
  298. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/virtualenv_instructions.md +0 -0
  299. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/help_docs/webdriver_installation.md +0 -0
  300. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/install.sh +0 -0
  301. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/__init__.py +0 -0
  302. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/azure/azure_pipelines/ReadMe.md +0 -0
  303. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/azure/jenkins/ReadMe.md +0 -0
  304. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/ReadMe.md +0 -0
  305. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/behave.ini +0 -0
  306. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/__init__.py +0 -0
  307. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/behave.ini +0 -0
  308. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/calculator.feature +0 -0
  309. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/environment.py +0 -0
  310. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/fail_page.feature +0 -0
  311. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/realworld.feature +0 -0
  312. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/steps/__init__.py +0 -0
  313. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/steps/calculator.py +0 -0
  314. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/steps/fail_page.py +0 -0
  315. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/steps/real_world.py +0 -0
  316. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/steps/swag_labs.py +0 -0
  317. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/behave/features/swag_labs.feature +0 -0
  318. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/brython/ReadMe.md +0 -0
  319. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/brython/index.html +0 -0
  320. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/brython/index.py +0 -0
  321. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/brython/library.html +0 -0
  322. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/docker/ReadMe.md +0 -0
  323. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/docker/docker-entrypoint.sh +0 -0
  324. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/docker/run_docker_test_in_chrome.sh +0 -0
  325. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/github/ReadMe.md +0 -0
  326. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/github/workflows/ReadMe.md +0 -0
  327. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/github/workflows/extras.md +0 -0
  328. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/google_cloud/ReadMe.md +0 -0
  329. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/katalon/ReadMe.md +0 -0
  330. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/linux/Linuxfile.sh +0 -0
  331. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/linux/ReadMe.md +0 -0
  332. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/linux/Xvfb_launcher.sh +0 -0
  333. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/linux/jenkins_permissions.sh +0 -0
  334. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/linux/tomcat_permissions.sh +0 -0
  335. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/node_js/ReadMe.md +0 -0
  336. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/node_js/__init__.py +0 -0
  337. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/node_js/index.html +0 -0
  338. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/node_js/my_first_test.py +0 -0
  339. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/node_js/npm-shrinkwrap.json +0 -0
  340. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/node_js/package.json +0 -0
  341. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/node_js/server.js +0 -0
  342. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/node_js/test_demo_site.py +0 -0
  343. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/selenium_grid/ReadMe.md +0 -0
  344. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/integrations/selenium_ide/ReadMe.md +0 -0
  345. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs.yml +0 -0
  346. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/ReadMe.txt +0 -0
  347. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/docs_instructions.txt +0 -0
  348. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/dash_pie.png +0 -0
  349. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/dash_pie_2.png +0 -0
  350. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/dash_pie_3.png +0 -0
  351. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/favicon.ico +0 -0
  352. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/grad_logo.png +0 -0
  353. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/green_icon.png +0 -0
  354. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/green_logo.png +0 -0
  355. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/green_logo2.png +0 -0
  356. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/green_logo3.png +0 -0
  357. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/logo3.png +0 -0
  358. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/logo3a.png +0 -0
  359. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/logo3b.png +0 -0
  360. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/logo3c.png +0 -0
  361. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/logo4.png +0 -0
  362. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/logo5.png +0 -0
  363. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/logo6.png +0 -0
  364. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/logo7.png +0 -0
  365. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/sb_icon.png +0 -0
  366. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/sb_logo_10.png +0 -0
  367. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/sb_logo_7.png +0 -0
  368. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/side_by_side.png +0 -0
  369. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/social/share_facebook.svg +0 -0
  370. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/social/share_github.svg +0 -0
  371. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/social/share_gitter.svg +0 -0
  372. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/social/share_instagram.svg +0 -0
  373. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/img/social/share_twitter.svg +0 -0
  374. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/index.txt +0 -0
  375. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/prepare.py +0 -0
  376. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/mkdocs_build/requirements.txt +0 -0
  377. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/pytest.ini +0 -0
  378. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/sbase/ReadMe.txt +0 -0
  379. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/sbase/__init__.py +0 -0
  380. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/sbase/__main__.py +0 -0
  381. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/sbase/steps.py +0 -0
  382. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/ReadMe.md +0 -0
  383. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/__init__.py +0 -0
  384. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/__main__.py +0 -0
  385. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/behave/__init__.py +0 -0
  386. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/behave/behave_helper.py +0 -0
  387. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/behave/behave_sb.py +0 -0
  388. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/behave/steps.py +0 -0
  389. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/common/ReadMe.md +0 -0
  390. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/common/__init__.py +0 -0
  391. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/common/decorators.py +0 -0
  392. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/common/encryption.py +0 -0
  393. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/common/exceptions.py +0 -0
  394. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/common/obfuscate.py +0 -0
  395. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/common/unobfuscate.py +0 -0
  396. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/config/__init__.py +0 -0
  397. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/config/ad_block_list.py +0 -0
  398. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/config/proxy_list.py +0 -0
  399. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/config/settings.py +0 -0
  400. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/ReadMe.md +0 -0
  401. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/__init__.py +0 -0
  402. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/logo_helper.py +0 -0
  403. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/rich_helper.py +0 -0
  404. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/run.py +0 -0
  405. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  406. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  407. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_commander.py +0 -0
  408. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_install.py +0 -0
  409. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  410. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  411. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  412. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  413. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  414. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  415. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_print.py +0 -0
  416. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  417. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/__init__.py +0 -0
  418. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/application_manager.py +0 -0
  419. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/capabilities_parser.py +0 -0
  420. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/colored_traceback.py +0 -0
  421. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/create_db_tables.sql +0 -0
  422. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/detect_b_ver.py +0 -0
  423. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/download_helper.py +0 -0
  424. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/encoded_images.py +0 -0
  425. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/jqc_helper.py +0 -0
  426. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/log_helper.py +0 -0
  427. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/mysql.py +0 -0
  428. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/proxy_helper.py +0 -0
  429. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/recorder_helper.py +0 -0
  430. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/report_helper.py +0 -0
  431. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/s3_manager.py +0 -0
  432. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/sb_driver.py +0 -0
  433. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/session_helper.py +0 -0
  434. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/settings_parser.py +0 -0
  435. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/style_sheet.py +0 -0
  436. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/testcase_manager.py +0 -0
  437. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/tour_helper.py +0 -0
  438. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/core/visual_helper.py +0 -0
  439. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/drivers/ReadMe.md +0 -0
  440. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/drivers/__init__.py +0 -0
  441. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/extensions/ReadMe.md +0 -0
  442. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/extensions/__init__.py +0 -0
  443. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/extensions/ad_block.zip +0 -0
  444. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/extensions/disable_csp.zip +0 -0
  445. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/extensions/recorder.zip +0 -0
  446. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/extensions/sbase_ext.zip +0 -0
  447. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/__init__.py +0 -0
  448. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/base_case.py +2 -2
  449. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/constants.py +0 -0
  450. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  451. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/errors.py +0 -0
  452. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/js_utils.py +0 -0
  453. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/page_utils.py +0 -0
  454. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/unittest_helper.py +0 -0
  455. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/words.py +0 -0
  456. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  457. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/js_code/__init__.py +0 -0
  458. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/js_code/active_css_js.py +0 -0
  459. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/js_code/live_js.py +0 -0
  460. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/js_code/recorder_js.py +0 -0
  461. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/masterqa/ReadMe.md +0 -0
  462. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/masterqa/__init__.py +0 -0
  463. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/masterqa/master_qa.py +0 -0
  464. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/__init__.py +0 -0
  465. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/base_plugin.py +0 -0
  466. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/basic_test_info.py +0 -0
  467. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  468. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/page_source.py +0 -0
  469. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/pytest_plugin.py +0 -0
  470. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  471. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/screen_shots.py +0 -0
  472. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/plugins/selenium_plugin.py +0 -0
  473. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/resources/ReadMe.md +0 -0
  474. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/resources/__init__.py +0 -0
  475. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/resources/favicon.ico +0 -0
  476. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/__init__.py +0 -0
  477. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/chinese.py +0 -0
  478. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/dutch.py +0 -0
  479. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/french.py +0 -0
  480. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/italian.py +0 -0
  481. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/japanese.py +0 -0
  482. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/korean.py +0 -0
  483. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/master_dict.py +0 -0
  484. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/portuguese.py +0 -0
  485. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/russian.py +0 -0
  486. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/spanish.py +0 -0
  487. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/translate/translator.py +0 -0
  488. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/undetected/cdp.py +0 -0
  489. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/undetected/dprocess.py +0 -0
  490. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/undetected/options.py +0 -0
  491. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/undetected/patcher.py +0 -0
  492. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/undetected/reactor.py +0 -0
  493. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/undetected/webelement.py +0 -0
  494. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/__init__.py +0 -0
  495. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/ReadMe.md +0 -0
  496. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  497. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  498. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  499. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  500. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  501. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  502. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  503. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  504. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  505. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  506. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  507. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_ide/ReadMe.md +0 -0
  508. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  509. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  510. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase.egg-info/SOURCES.txt +0 -0
  511. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase.egg-info/dependency_links.txt +0 -0
  512. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase.egg-info/entry_points.txt +0 -0
  513. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/seleniumbase.egg-info/top_level.txt +0 -0
  514. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/setup.cfg +0 -0
  515. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/virtualenv_install.sh +0 -0
  516. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/win_install.bat +0 -0
  517. {seleniumbase-4.28.0a3 → seleniumbase-4.28.2}/win_virtualenv.bat +0 -0
@@ -1,11 +1,34 @@
1
1
  # SeleniumBase Docker Image
2
2
  FROM ubuntu:22.04
3
+ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
4
+
5
+ #======================
6
+ # Locale Configuration
7
+ #======================
8
+ RUN apt-get update
9
+ RUN apt-get install -y --no-install-recommends tzdata locales
10
+ RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen
11
+ ENV LANG en_US.UTF-8
12
+ ENV LANGUAGE en_US:en
13
+ ENV LC_ALL en_US.UTF-8
14
+ ENV TZ="America/New_York"
15
+
16
+ #======================
17
+ # Install Common Fonts
18
+ #======================
19
+ RUN apt-get update
20
+ RUN apt-get install -y \
21
+ fonts-liberation \
22
+ fonts-open-sans \
23
+ fonts-mononoki \
24
+ fonts-roboto \
25
+ fonts-lato
3
26
 
4
27
  #============================
5
28
  # Install Linux Dependencies
6
29
  #============================
7
- RUN apt-get update && apt-get install -y \
8
- fonts-liberation \
30
+ RUN apt-get update
31
+ RUN apt-get install -y \
9
32
  libasound2 \
10
33
  libatk-bridge2.0-0 \
11
34
  libatk1.0-0 \
@@ -17,60 +40,57 @@ RUN apt-get update && apt-get install -y \
17
40
  libgtk-3-0 \
18
41
  libnspr4 \
19
42
  libnss3 \
43
+ libu2f-udev \
44
+ libvulkan1 \
20
45
  libwayland-client0 \
21
46
  libxcomposite1 \
22
47
  libxdamage1 \
23
48
  libxfixes3 \
24
49
  libxkbcommon0 \
25
- libxrandr2 \
26
- libu2f-udev \
27
- libvulkan1 \
28
- xdg-utils
50
+ libxrandr2
51
+
52
+ #==========================
53
+ # Install useful utilities
54
+ #==========================
55
+ RUN apt-get update
56
+ RUN apt-get install -y xdg-utils
29
57
 
30
58
  #=================================
31
59
  # Install Bash Command Line Tools
32
60
  #=================================
61
+ RUN apt-get update
33
62
  RUN apt-get -qy --no-install-recommends install \
34
63
  curl \
35
64
  sudo \
36
65
  unzip \
37
66
  vim \
38
67
  wget \
39
- xvfb \
40
- && rm -rf /var/lib/apt/lists/*
68
+ xvfb
41
69
 
42
70
  #================
43
71
  # Install Chrome
44
72
  #================
45
- RUN curl -LO https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
46
- RUN apt-get install -y ./google-chrome-stable_current_amd64.deb
73
+ RUN apt-get update
74
+ RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
75
+ RUN dpkg -i google-chrome-stable_current_amd64.deb
76
+ RUN apt-get -fy --no-install-recommends install
47
77
  RUN rm google-chrome-stable_current_amd64.deb
48
78
 
49
79
  #================
50
80
  # Install Python
51
81
  #================
52
- RUN apt-get update -y
53
- RUN apt-get install -y python3 python3-pip python3-setuptools python3-dev
82
+ RUN apt-get update
83
+ RUN apt-get install -y python3 python3-pip python3-setuptools python3-dev python3-tk
54
84
  RUN alias python=python3
55
85
  RUN echo "alias python=python3" >> ~/.bashrc
56
86
  RUN apt-get -qy --no-install-recommends install python3.10
57
87
  RUN rm /usr/bin/python3
58
88
  RUN ln -s python3.10 /usr/bin/python3
59
89
 
60
- #=============================================
61
- # Allow Special Characters in Python Programs
62
- #=============================================
63
- RUN export PYTHONIOENCODING=utf8
64
- RUN echo "export PYTHONIOENCODING=utf8" >> ~/.bashrc
65
-
66
- #===========================
67
- # Configure Virtual Display
68
- #===========================
69
- RUN set -e
70
- RUN echo "Starting X virtual framebuffer (Xvfb) in background..."
71
- RUN Xvfb -ac :99 -screen 0 1280x1024x16 > /dev/null 2>&1 &
72
- RUN export DISPLAY=:99
73
- RUN exec "$@"
90
+ #===============
91
+ # Cleanup Lists
92
+ #===============
93
+ RUN rm -rf /var/lib/apt/lists/*
74
94
 
75
95
  #=====================
76
96
  # Set up SeleniumBase
@@ -89,6 +109,7 @@ RUN find . -name '*.pyc' -delete
89
109
  RUN pip install --upgrade pip setuptools wheel
90
110
  RUN cd /SeleniumBase && ls && pip install -r requirements.txt --upgrade
91
111
  RUN cd /SeleniumBase && pip install .
112
+ RUN pip install pyautogui
92
113
 
93
114
  #=======================
94
115
  # Download chromedriver
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.28.0a3
3
+ Version: 4.28.2
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
@@ -59,18 +59,18 @@ Requires-Python: >=3.7
59
59
  Description-Content-Type: text/markdown
60
60
  License-File: LICENSE
61
61
  Requires-Dist: pip>=24.0; python_version < "3.8"
62
- Requires-Dist: pip>=24.1; python_version >= "3.8"
62
+ Requires-Dist: pip>=24.1.1; python_version >= "3.8"
63
63
  Requires-Dist: packaging>=24.0; python_version < "3.8"
64
64
  Requires-Dist: packaging>=24.1; python_version >= "3.8"
65
65
  Requires-Dist: setuptools>=68.0.0; python_version < "3.8"
66
- Requires-Dist: setuptools>=70.1.0; python_version >= "3.8"
66
+ Requires-Dist: setuptools>=70.1.1; python_version >= "3.8"
67
67
  Requires-Dist: wheel>=0.42.0; python_version < "3.8"
68
68
  Requires-Dist: wheel>=0.43.0; python_version >= "3.8"
69
69
  Requires-Dist: attrs>=23.2.0
70
70
  Requires-Dist: certifi>=2024.6.2
71
71
  Requires-Dist: exceptiongroup>=1.2.1
72
72
  Requires-Dist: filelock>=3.12.2; python_version < "3.8"
73
- Requires-Dist: filelock>=3.15.3; python_version >= "3.8"
73
+ Requires-Dist: filelock>=3.15.4; python_version >= "3.8"
74
74
  Requires-Dist: platformdirs>=4.0.0; python_version < "3.8"
75
75
  Requires-Dist: platformdirs>=4.2.2; python_version >= "3.8"
76
76
  Requires-Dist: typing-extensions>=4.12.2; python_version >= "3.8"
@@ -124,7 +124,7 @@ Requires-Dist: pygments==2.17.2; python_version < "3.8"
124
124
  Requires-Dist: pygments==2.18.0; python_version >= "3.8"
125
125
  Requires-Dist: pyreadline3==3.4.1; platform_system == "Windows"
126
126
  Requires-Dist: tabcompleter==1.3.0
127
- Requires-Dist: pdbp==1.5.0
127
+ Requires-Dist: pdbp==1.5.1
128
128
  Requires-Dist: colorama==0.4.6
129
129
  Requires-Dist: pyotp==2.9.0
130
130
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
@@ -138,7 +138,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
138
138
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
139
139
  Provides-Extra: coverage
140
140
  Requires-Dist: coverage==7.2.7; python_version < "3.8" and extra == "coverage"
141
- Requires-Dist: coverage>=7.5.3; python_version >= "3.8" and extra == "coverage"
141
+ Requires-Dist: coverage>=7.5.4; python_version >= "3.8" and extra == "coverage"
142
142
  Requires-Dist: pytest-cov==4.1.0; python_version < "3.8" and extra == "coverage"
143
143
  Requires-Dist: pytest-cov>=5.0.0; python_version >= "3.8" and extra == "coverage"
144
144
  Provides-Extra: flake8
@@ -13,8 +13,7 @@ class CDPTests(BaseCase):
13
13
  )
14
14
 
15
15
  def click_turnstile_and_verify(sb):
16
- sb.switch_to_frame("iframe")
17
- sb.driver.uc_click("span")
16
+ sb.uc_gui_handle_cf()
18
17
  sb.assert_element("img#captcha-success", timeout=3)
19
18
  sb.highlight("img#captcha-success", loops=8)
20
19
 
@@ -22,7 +21,7 @@ class CDPTests(BaseCase):
22
21
  if not (self.undetectable and self.uc_cdp_events):
23
22
  self.get_new_driver(undetectable=True, uc_cdp_events=True)
24
23
  url = "seleniumbase.io/apps/turnstile"
25
- self.driver.uc_open_with_reconnect(url, 2)
24
+ self.uc_open_with_reconnect(url, 2)
26
25
  self.add_cdp_listener()
27
26
  self.click_turnstile_and_verify()
28
27
  self.sleep(1)
@@ -1,16 +1,16 @@
1
1
  pip>=24.0;python_version<"3.8"
2
- pip>=24.1;python_version>="3.8"
2
+ pip>=24.1.1;python_version>="3.8"
3
3
  packaging>=24.0;python_version<"3.8"
4
4
  packaging>=24.1;python_version>="3.8"
5
5
  setuptools>=68.0.0;python_version<"3.8"
6
- setuptools>=70.1.0;python_version>="3.8"
6
+ setuptools>=70.1.1;python_version>="3.8"
7
7
  wheel>=0.42.0;python_version<"3.8"
8
8
  wheel>=0.43.0;python_version>="3.8"
9
9
  attrs>=23.2.0
10
10
  certifi>=2024.6.2
11
11
  exceptiongroup>=1.2.1
12
12
  filelock>=3.12.2;python_version<"3.8"
13
- filelock>=3.15.3;python_version>="3.8"
13
+ filelock>=3.15.4;python_version>="3.8"
14
14
  platformdirs>=4.0.0;python_version<"3.8"
15
15
  platformdirs>=4.2.2;python_version>="3.8"
16
16
  typing-extensions>=4.12.2;python_version>="3.8"
@@ -64,7 +64,7 @@ pygments==2.17.2;python_version<"3.8"
64
64
  pygments==2.18.0;python_version>="3.8"
65
65
  pyreadline3==3.4.1;platform_system=="Windows"
66
66
  tabcompleter==1.3.0
67
- pdbp==1.5.0
67
+ pdbp==1.5.1
68
68
  colorama==0.4.6
69
69
  pyotp==2.9.0
70
70
  python-xlib==0.33;platform_system=="Linux"
@@ -77,7 +77,7 @@ rich==13.7.1
77
77
  # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
78
78
 
79
79
  coverage==7.2.7;python_version<"3.8"
80
- coverage>=7.5.3;python_version>="3.8"
80
+ coverage>=7.5.4;python_version>="3.8"
81
81
  pytest-cov==4.1.0;python_version<"3.8"
82
82
  pytest-cov>=5.0.0;python_version>="3.8"
83
83
  flake8==5.0.4;python_version<"3.9"
@@ -0,0 +1,2 @@
1
+ # seleniumbase package
2
+ __version__ = "4.28.2"
@@ -389,7 +389,9 @@ def uc_special_open_if_cf(
389
389
  driver.execute_script('window.open("%s","_blank");' % url)
390
390
  driver.close()
391
391
  if mobile_emulator:
392
- driver.switch_to.window(driver.window_handles[-1])
392
+ page_actions.switch_to_window(
393
+ driver, driver.window_handles[-1], 2
394
+ )
393
395
  uc_metrics = {}
394
396
  if (
395
397
  isinstance(device_width, int)
@@ -419,7 +421,9 @@ def uc_special_open_if_cf(
419
421
  except Exception:
420
422
  pass
421
423
  if not mobile_emulator:
422
- driver.switch_to.window(driver.window_handles[-1])
424
+ page_actions.switch_to_window(
425
+ driver, driver.window_handles[-1], 2
426
+ )
423
427
  else:
424
428
  driver.default_get(url) # The original one
425
429
  else:
@@ -450,7 +454,7 @@ def uc_open_with_tab(driver, url):
450
454
  with driver:
451
455
  driver.execute_script('window.open("%s","_blank");' % url)
452
456
  driver.close()
453
- driver.switch_to.window(driver.window_handles[-1])
457
+ page_actions.switch_to_window(driver, driver.window_handles[-1], 2)
454
458
  else:
455
459
  driver.default_get(url) # The original one
456
460
  return None
@@ -476,10 +480,14 @@ def uc_open_with_reconnect(driver, url, reconnect_time=None):
476
480
  driver.reconnect(reconnect_time)
477
481
  time.sleep(0.004)
478
482
  try:
479
- driver.switch_to.window(driver.window_handles[-1])
483
+ page_actions.switch_to_window(
484
+ driver, driver.window_handles[-1], 2
485
+ )
480
486
  except InvalidSessionIdException:
481
487
  time.sleep(0.05)
482
- driver.switch_to.window(driver.window_handles[-1])
488
+ page_actions.switch_to_window(
489
+ driver, driver.window_handles[-1], 2
490
+ )
483
491
  else:
484
492
  driver.default_get(url) # The original one
485
493
  return None
@@ -546,17 +554,17 @@ def uc_click(
546
554
  driver.reconnect(reconnect_time)
547
555
 
548
556
 
549
- def verify_pyautogui_has_a_headed_browser():
557
+ def verify_pyautogui_has_a_headed_browser(driver):
550
558
  """PyAutoGUI requires a headed browser so that it can
551
559
  focus on the correct element when performing actions."""
552
- if sb_config.headless or sb_config.headless2:
560
+ if hasattr(driver, "_is_hidden") and driver._is_hidden:
553
561
  raise Exception(
554
562
  "PyAutoGUI can't be used in headless mode!"
555
563
  )
556
564
 
557
565
 
558
- def install_pyautogui_if_missing():
559
- verify_pyautogui_has_a_headed_browser()
566
+ def install_pyautogui_if_missing(driver):
567
+ verify_pyautogui_has_a_headed_browser(driver)
560
568
  pip_find_lock = fasteners.InterProcessLock(
561
569
  constants.PipInstall.FINDLOCK
562
570
  )
@@ -566,10 +574,11 @@ def install_pyautogui_if_missing():
566
574
  try:
567
575
  use_pyautogui_ver = constants.PyAutoGUI.VER
568
576
  if pyautogui.__version__ != use_pyautogui_ver:
577
+ del pyautogui
569
578
  shared_utils.pip_install(
570
579
  "pyautogui", version=use_pyautogui_ver
571
580
  )
572
- del pyautogui
581
+ import pyautogui
573
582
  except Exception:
574
583
  pass
575
584
  except Exception:
@@ -607,7 +616,7 @@ def get_configured_pyautogui(pyautogui_copy):
607
616
 
608
617
 
609
618
  def uc_gui_press_key(driver, key):
610
- install_pyautogui_if_missing()
619
+ install_pyautogui_if_missing(driver)
611
620
  import pyautogui
612
621
  pyautogui = get_configured_pyautogui(pyautogui)
613
622
  gui_lock = fasteners.InterProcessLock(
@@ -618,7 +627,7 @@ def uc_gui_press_key(driver, key):
618
627
 
619
628
 
620
629
  def uc_gui_press_keys(driver, keys):
621
- install_pyautogui_if_missing()
630
+ install_pyautogui_if_missing(driver)
622
631
  import pyautogui
623
632
  pyautogui = get_configured_pyautogui(pyautogui)
624
633
  gui_lock = fasteners.InterProcessLock(
@@ -630,7 +639,7 @@ def uc_gui_press_keys(driver, keys):
630
639
 
631
640
 
632
641
  def uc_gui_write(driver, text):
633
- install_pyautogui_if_missing()
642
+ install_pyautogui_if_missing(driver)
634
643
  import pyautogui
635
644
  pyautogui = get_configured_pyautogui(pyautogui)
636
645
  gui_lock = fasteners.InterProcessLock(
@@ -647,7 +656,7 @@ def uc_gui_handle_cf(driver, frame="iframe"):
647
656
  and 'aria-label="Cloudflare"' not in source
648
657
  ):
649
658
  return
650
- install_pyautogui_if_missing()
659
+ install_pyautogui_if_missing(driver)
651
660
  import pyautogui
652
661
  pyautogui = get_configured_pyautogui(pyautogui)
653
662
  gui_lock = fasteners.InterProcessLock(
@@ -663,9 +672,7 @@ def uc_gui_handle_cf(driver, frame="iframe"):
663
672
  if not is_in_frame:
664
673
  # Make sure the window is on top
665
674
  page_actions.switch_to_window(
666
- driver,
667
- driver.current_window_handle,
668
- timeout=settings.SMALL_TIMEOUT,
675
+ driver, driver.current_window_handle, 2
669
676
  )
670
677
  if not is_in_frame or needs_switch:
671
678
  # Currently not in frame (or nested frame outside CF one)
@@ -1030,7 +1037,7 @@ def _set_chrome_options(
1030
1037
  prefs["download.prompt_for_download"] = False
1031
1038
  prefs["credentials_enable_service"] = False
1032
1039
  prefs["local_discovery.notifications_enabled"] = False
1033
- prefs["safebrowsing.enabled"] = True
1040
+ prefs["safebrowsing.enabled"] = False # Prevent PW "data breach" pop-ups
1034
1041
  prefs["safebrowsing.disable_download_protection"] = True
1035
1042
  prefs["omnibox-max-zero-suggest-matches"] = 0
1036
1043
  prefs["omnibox-use-existing-autocomplete-client"] = 0
@@ -2621,7 +2628,7 @@ def get_local_driver(
2621
2628
  "credentials_enable_service": False,
2622
2629
  "local_discovery.notifications_enabled": False,
2623
2630
  "safebrowsing.disable_download_protection": True,
2624
- "safebrowsing.enabled": True,
2631
+ "safebrowsing.enabled": False, # Prevent PW "data breach" pop-ups
2625
2632
  "omnibox-max-zero-suggest-matches": 0,
2626
2633
  "omnibox-use-existing-autocomplete-client": 0,
2627
2634
  "omnibox-trending-zero-prefix-suggestions-on-ntp": 0,
@@ -4030,6 +4037,8 @@ def get_local_driver(
4030
4037
  driver, *args, **kwargs
4031
4038
  )
4032
4039
  )
4040
+ driver._is_hidden = (headless or headless2)
4041
+ driver._is_using_uc = True
4033
4042
  if mobile_emulator:
4034
4043
  uc_metrics = {}
4035
4044
  if (
@@ -18,6 +18,7 @@ By.TAG_NAME # "tag name"
18
18
  By.PARTIAL_LINK_TEXT # "partial link text"
19
19
  """
20
20
  import codecs
21
+ import fasteners
21
22
  import os
22
23
  import time
23
24
  from selenium.common.exceptions import ElementNotInteractableException
@@ -32,6 +33,7 @@ from selenium.webdriver.common.keys import Keys
32
33
  from seleniumbase.common.exceptions import LinkTextNotFoundException
33
34
  from seleniumbase.common.exceptions import TextNotVisibleException
34
35
  from seleniumbase.config import settings
36
+ from seleniumbase.fixtures import constants
35
37
  from seleniumbase.fixtures import page_utils
36
38
  from seleniumbase.fixtures import shared_utils
37
39
 
@@ -1428,6 +1430,18 @@ def switch_to_frame(driver, frame, timeout=settings.SMALL_TIMEOUT):
1428
1430
  timeout_exception(Exception, message)
1429
1431
 
1430
1432
 
1433
+ def __switch_to_window(driver, window_handle):
1434
+ if hasattr(driver, "_is_using_uc") and driver._is_using_uc:
1435
+ gui_lock = fasteners.InterProcessLock(
1436
+ constants.MultiBrowser.PYAUTOGUILOCK
1437
+ )
1438
+ with gui_lock:
1439
+ driver.switch_to.window(window_handle)
1440
+ else:
1441
+ driver.switch_to.window(window_handle)
1442
+ return True
1443
+
1444
+
1431
1445
  def switch_to_window(driver, window, timeout=settings.SMALL_TIMEOUT):
1432
1446
  """
1433
1447
  Wait for a window to appear, and switch to it. This should be usable
@@ -1451,7 +1465,7 @@ def switch_to_window(driver, window, timeout=settings.SMALL_TIMEOUT):
1451
1465
  shared_utils.check_if_time_limit_exceeded()
1452
1466
  try:
1453
1467
  window_handle = driver.window_handles[window]
1454
- driver.switch_to.window(window_handle)
1468
+ __switch_to_window(driver, window_handle)
1455
1469
  return True
1456
1470
  except IndexError:
1457
1471
  now_ms = time.time() * 1000.0
@@ -1472,7 +1486,7 @@ def switch_to_window(driver, window, timeout=settings.SMALL_TIMEOUT):
1472
1486
  for x in range(int(timeout * 10)):
1473
1487
  shared_utils.check_if_time_limit_exceeded()
1474
1488
  try:
1475
- driver.switch_to.window(window_handle)
1489
+ __switch_to_window(driver, window_handle)
1476
1490
  return True
1477
1491
  except NoSuchWindowException:
1478
1492
  now_ms = time.time() * 1000.0
@@ -81,46 +81,46 @@ def format_exc(exception, message):
81
81
  from seleniumbase.common.exceptions import TextNotVisibleException
82
82
  from seleniumbase.common import exceptions
83
83
 
84
- if exception == Exception:
84
+ if exception is Exception:
85
85
  exc = Exception
86
86
  return exc, message
87
- elif exception == ElementNotVisibleException:
87
+ elif exception is ElementNotVisibleException:
88
88
  exc = exceptions.ElementNotVisibleException
89
89
  elif exception == "ElementNotVisibleException":
90
90
  exc = exceptions.ElementNotVisibleException
91
- elif exception == LinkTextNotFoundException:
91
+ elif exception is LinkTextNotFoundException:
92
92
  exc = exceptions.LinkTextNotFoundException
93
93
  elif exception == "LinkTextNotFoundException":
94
94
  exc = exceptions.LinkTextNotFoundException
95
- elif exception == NoSuchElementException:
95
+ elif exception is NoSuchElementException:
96
96
  exc = exceptions.NoSuchElementException
97
97
  elif exception == "NoSuchElementException":
98
98
  exc = exceptions.NoSuchElementException
99
- elif exception == TextNotVisibleException:
99
+ elif exception is TextNotVisibleException:
100
100
  exc = exceptions.TextNotVisibleException
101
101
  elif exception == "TextNotVisibleException":
102
102
  exc = exceptions.TextNotVisibleException
103
- elif exception == NoAlertPresentException:
103
+ elif exception is NoAlertPresentException:
104
104
  exc = exceptions.NoAlertPresentException
105
105
  elif exception == "NoAlertPresentException":
106
106
  exc = exceptions.NoAlertPresentException
107
- elif exception == NoSuchAttributeException:
107
+ elif exception is NoSuchAttributeException:
108
108
  exc = exceptions.NoSuchAttributeException
109
109
  elif exception == "NoSuchAttributeException":
110
110
  exc = exceptions.NoSuchAttributeException
111
- elif exception == NoSuchFrameException:
111
+ elif exception is NoSuchFrameException:
112
112
  exc = exceptions.NoSuchFrameException
113
113
  elif exception == "NoSuchFrameException":
114
114
  exc = exceptions.NoSuchFrameException
115
- elif exception == NoSuchWindowException:
115
+ elif exception is NoSuchWindowException:
116
116
  exc = exceptions.NoSuchWindowException
117
117
  elif exception == "NoSuchWindowException":
118
118
  exc = exceptions.NoSuchWindowException
119
- elif exception == NoSuchFileException:
119
+ elif exception is NoSuchFileException:
120
120
  exc = exceptions.NoSuchFileException
121
121
  elif exception == "NoSuchFileException":
122
122
  exc = exceptions.NoSuchFileException
123
- elif exception == NoSuchOptionException:
123
+ elif exception is NoSuchOptionException:
124
124
  exc = exceptions.NoSuchOptionException
125
125
  elif exception == "NoSuchOptionException":
126
126
  exc = exceptions.NoSuchOptionException
@@ -125,7 +125,9 @@ def Driver(
125
125
  uc_cdp=None, # Shortcut / Duplicate of "uc_cdp_events".
126
126
  uc_sub=None, # Shortcut / Duplicate of "uc_subprocess".
127
127
  log_cdp=None, # Shortcut / Duplicate of "log_cdp_events".
128
+ ad_block=None, # Shortcut / Duplicate of "ad_block_on".
128
129
  server=None, # Shortcut / Duplicate of "servername".
130
+ guest=None, # Shortcut / Duplicate of "guest_mode".
129
131
  wire=None, # Shortcut / Duplicate of "use_wire".
130
132
  pls=None, # Shortcut / Duplicate of "page_load_strategy".
131
133
  ):
@@ -263,6 +265,8 @@ def Driver(
263
265
  incognito = True
264
266
  else:
265
267
  incognito = False
268
+ if guest is not None and guest_mode is None:
269
+ guest_mode = guest
266
270
  if guest_mode is None:
267
271
  if "--guest" in sys_argv:
268
272
  guest_mode = True
@@ -387,6 +391,14 @@ def Driver(
387
391
  uc_cdp_events = True
388
392
  else:
389
393
  uc_cdp_events = False
394
+ if undetectable and browser != "chrome":
395
+ message = (
396
+ '\n Undetected-Chromedriver Mode ONLY supports Chrome!'
397
+ '\n ("uc=True" / "undetectable=True" / "--uc")'
398
+ '\n (Your browser choice was: "%s".)'
399
+ '\n (Will use "%s" without UC Mode.)\n' % (browser, browser)
400
+ )
401
+ print(message)
390
402
  if headed is None:
391
403
  # Override the default headless mode on Linux if set.
392
404
  if "--gui" in sys_argv or "--headed" in sys_argv:
@@ -507,6 +519,8 @@ def Driver(
507
519
  swiftshader = True
508
520
  else:
509
521
  swiftshader = False
522
+ if ad_block is not None and ad_block_on is None:
523
+ ad_block_on = ad_block
510
524
  if ad_block_on is None:
511
525
  if "--ad-block" in sys_argv or "--ad_block" in sys_argv:
512
526
  ad_block_on = True
@@ -103,7 +103,9 @@ def SB(
103
103
  uc_cdp=None, # Shortcut / Duplicate of "uc_cdp_events".
104
104
  uc_sub=None, # Shortcut / Duplicate of "uc_subprocess".
105
105
  log_cdp=None, # Shortcut / Duplicate of "log_cdp_events".
106
+ ad_block=None, # Shortcut / Duplicate of "ad_block_on".
106
107
  server=None, # Shortcut / Duplicate of "servername".
108
+ guest=None, # Shortcut / Duplicate of "guest_mode".
107
109
  wire=None, # Shortcut / Duplicate of "use_wire".
108
110
  pls=None, # Shortcut / Duplicate of "page_load_strategy".
109
111
  sjw=None, # Shortcut / Duplicate of "skip_js_waits".
@@ -296,6 +298,8 @@ def SB(
296
298
  incognito = True
297
299
  else:
298
300
  incognito = False
301
+ if guest is not None and guest_mode is None:
302
+ guest_mode = guest
299
303
  if guest_mode is None:
300
304
  if "--guest" in sys_argv:
301
305
  guest_mode = True
@@ -444,6 +448,14 @@ def SB(
444
448
  uc_cdp_events = True
445
449
  else:
446
450
  uc_cdp_events = False
451
+ if undetectable and browser != "chrome":
452
+ message = (
453
+ '\n Undetected-Chromedriver Mode ONLY supports Chrome!'
454
+ '\n ("uc=True" / "undetectable=True" / "--uc")'
455
+ '\n (Your browser choice was: "%s".)'
456
+ '\n (Will use "%s" without UC Mode.)\n' % (browser, browser)
457
+ )
458
+ print(message)
447
459
  if headed is None:
448
460
  # Override the default headless mode on Linux if set.
449
461
  if "--gui" in sys_argv or "--headed" in sys_argv:
@@ -651,6 +663,8 @@ def SB(
651
663
  swiftshader = True
652
664
  else:
653
665
  swiftshader = False
666
+ if ad_block is not None and ad_block_on is None:
667
+ ad_block_on = ad_block
654
668
  if ad_block_on is None:
655
669
  if "--ad-block" in sys_argv or "--ad_block" in sys_argv:
656
670
  ad_block_on = True
@@ -278,15 +278,19 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
278
278
  options.binary_location, *options.arguments
279
279
  )
280
280
  else:
281
- browser = subprocess.Popen(
282
- [options.binary_location, *options.arguments],
283
- stdin=subprocess.PIPE,
284
- stdout=subprocess.PIPE,
285
- stderr=subprocess.PIPE,
286
- close_fds=IS_POSIX,
287
- creationflags=creationflags,
281
+ gui_lock = fasteners.InterProcessLock(
282
+ constants.MultiBrowser.PYAUTOGUILOCK
288
283
  )
289
- self.browser_pid = browser.pid
284
+ with gui_lock:
285
+ browser = subprocess.Popen(
286
+ [options.binary_location, *options.arguments],
287
+ stdin=subprocess.PIPE,
288
+ stdout=subprocess.PIPE,
289
+ stderr=subprocess.PIPE,
290
+ close_fds=IS_POSIX,
291
+ creationflags=creationflags,
292
+ )
293
+ self.browser_pid = browser.pid
290
294
  service_ = None
291
295
  log_output = subprocess.PIPE
292
296
  if sys.version_info < (3, 8):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.28.0a3
3
+ Version: 4.28.2
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
@@ -59,18 +59,18 @@ Requires-Python: >=3.7
59
59
  Description-Content-Type: text/markdown
60
60
  License-File: LICENSE
61
61
  Requires-Dist: pip>=24.0; python_version < "3.8"
62
- Requires-Dist: pip>=24.1; python_version >= "3.8"
62
+ Requires-Dist: pip>=24.1.1; python_version >= "3.8"
63
63
  Requires-Dist: packaging>=24.0; python_version < "3.8"
64
64
  Requires-Dist: packaging>=24.1; python_version >= "3.8"
65
65
  Requires-Dist: setuptools>=68.0.0; python_version < "3.8"
66
- Requires-Dist: setuptools>=70.1.0; python_version >= "3.8"
66
+ Requires-Dist: setuptools>=70.1.1; python_version >= "3.8"
67
67
  Requires-Dist: wheel>=0.42.0; python_version < "3.8"
68
68
  Requires-Dist: wheel>=0.43.0; python_version >= "3.8"
69
69
  Requires-Dist: attrs>=23.2.0
70
70
  Requires-Dist: certifi>=2024.6.2
71
71
  Requires-Dist: exceptiongroup>=1.2.1
72
72
  Requires-Dist: filelock>=3.12.2; python_version < "3.8"
73
- Requires-Dist: filelock>=3.15.3; python_version >= "3.8"
73
+ Requires-Dist: filelock>=3.15.4; python_version >= "3.8"
74
74
  Requires-Dist: platformdirs>=4.0.0; python_version < "3.8"
75
75
  Requires-Dist: platformdirs>=4.2.2; python_version >= "3.8"
76
76
  Requires-Dist: typing-extensions>=4.12.2; python_version >= "3.8"
@@ -124,7 +124,7 @@ Requires-Dist: pygments==2.17.2; python_version < "3.8"
124
124
  Requires-Dist: pygments==2.18.0; python_version >= "3.8"
125
125
  Requires-Dist: pyreadline3==3.4.1; platform_system == "Windows"
126
126
  Requires-Dist: tabcompleter==1.3.0
127
- Requires-Dist: pdbp==1.5.0
127
+ Requires-Dist: pdbp==1.5.1
128
128
  Requires-Dist: colorama==0.4.6
129
129
  Requires-Dist: pyotp==2.9.0
130
130
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
@@ -138,7 +138,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
138
138
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
139
139
  Provides-Extra: coverage
140
140
  Requires-Dist: coverage==7.2.7; python_version < "3.8" and extra == "coverage"
141
- Requires-Dist: coverage>=7.5.3; python_version >= "3.8" and extra == "coverage"
141
+ Requires-Dist: coverage>=7.5.4; python_version >= "3.8" and extra == "coverage"
142
142
  Requires-Dist: pytest-cov==4.1.0; python_version < "3.8" and extra == "coverage"
143
143
  Requires-Dist: pytest-cov>=5.0.0; python_version >= "3.8" and extra == "coverage"
144
144
  Provides-Extra: flake8