seleniumbase 4.28.0a2__tar.gz → 4.28.1__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.0a2 → seleniumbase-4.28.1}/Dockerfile +47 -26
  2. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/PKG-INFO +5 -5
  3. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/uc_cdp_events.py +2 -3
  4. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/requirements.txt +4 -4
  5. seleniumbase-4.28.1/seleniumbase/__version__.py +2 -0
  6. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/browser_launcher.py +20 -5
  7. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/base_case.py +3 -3
  8. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/shared_utils.py +11 -11
  9. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/driver_manager.py +14 -0
  10. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/sb_manager.py +14 -0
  11. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase.egg-info/PKG-INFO +5 -5
  12. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase.egg-info/requires.txt +4 -4
  13. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/setup.py +4 -4
  14. seleniumbase-4.28.0a2/seleniumbase/__version__.py +0 -2
  15. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/.github/Workflows.md +0 -0
  16. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/.github/workflows/pages.yml +0 -0
  17. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/.github/workflows/python-nightly-mac.yml +0 -0
  18. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/.github/workflows/python-nightly-ubuntu.yml +0 -0
  19. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/.github/workflows/python-nightly-windows.yml +0 -0
  20. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/.github/workflows/python-package.yml +0 -0
  21. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/.gitignore +0 -0
  22. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/CHANGELOG.md +0 -0
  23. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/CNAME +0 -0
  24. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/CODE_OF_CONDUCT.md +0 -0
  25. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/CONTRIBUTING.md +0 -0
  26. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/LICENSE +0 -0
  27. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/MANIFEST.in +0 -0
  28. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/README.md +0 -0
  29. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/SECURITY.md +0 -0
  30. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/_config.yml +0 -0
  31. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/azure-pipelines.yml +0 -0
  32. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/ReadMe.md +0 -0
  33. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/__init__.py +0 -0
  34. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/basic_test.py +0 -0
  35. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/ReadMe.md +0 -0
  36. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/__init__.py +0 -0
  37. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/behave.ini +0 -0
  38. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/__init__.py +0 -0
  39. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/behave.ini +0 -0
  40. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/calculator.feature +0 -0
  41. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/environment.py +0 -0
  42. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/fail_page.feature +0 -0
  43. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/realworld.feature +0 -0
  44. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/steps/__init__.py +0 -0
  45. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/steps/calculator.py +0 -0
  46. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/steps/fail_page.py +0 -0
  47. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/steps/imported.py +0 -0
  48. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
  49. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/behave_bdd/features/swag_labs.feature +0 -0
  50. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/ReadMe.md +0 -0
  51. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/__init__.py +0 -0
  52. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/base_test_case.py +0 -0
  53. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/boilerplate_test.py +0 -0
  54. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/classic_obj_test.py +0 -0
  55. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/page_objects.py +0 -0
  56. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/__init__.py +0 -0
  57. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
  58. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
  59. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/file_parsing/qa_login_example.txt +0 -0
  60. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/file_parsing/staging_login_example.txt +0 -0
  61. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/google_objects.py +0 -0
  62. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/google_test.py +0 -0
  63. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/sb_swag_test.py +0 -0
  64. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/swag_labs_test.py +0 -0
  65. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/samples/test_page_objects.py +0 -0
  66. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/boilerplates/sb_fixture_test.py +0 -0
  67. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/capabilities/ReadMe.md +0 -0
  68. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/capabilities/mac_cap_file.py +0 -0
  69. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/capabilities/sample_cap_file_BS.py +0 -0
  70. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/capabilities/sample_cap_file_SL.py +0 -0
  71. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/capabilities/selenoid_cap_file.py +0 -0
  72. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/capabilities/win10_cap_file.py +0 -0
  73. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_plans/basic_test.MyTestClass.test_basics.md +0 -0
  74. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_plans/my_first_test.MyTestClass.test_swag_labs.md +0 -0
  75. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_plans/shadow_root_test.ShadowRootTest.test_shadow_root.md +0 -0
  76. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_plans/test_assert_elements.ListAssertTests.test_assert_list_of_elements.md +0 -0
  77. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_plans/test_calculator.CalculatorTests.test_6_times_7_plus_12_equals_54.md +0 -0
  78. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_plans/test_demo_site.DemoSiteTests.test_demo_site.md +0 -0
  79. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_plans/test_login.SwagLabsLoginTests.test_swag_labs_login.md +0 -0
  80. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_plans/test_mfa_login.TestMFALogin.test_mfa_login.md +0 -0
  81. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/case_summary.md +0 -0
  82. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/ReadMe.md +0 -0
  83. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/chart_presentation.py +0 -0
  84. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/my_chart.py +0 -0
  85. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/pie_charts.py +0 -0
  86. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/test_area_chart.py +0 -0
  87. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/test_display_chart.py +0 -0
  88. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/test_line_chart.py +0 -0
  89. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/test_multi_series.py +0 -0
  90. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/chart_maker/test_save_chart.py +0 -0
  91. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/coffee_cart_tests.py +0 -0
  92. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/custom_settings.py +0 -0
  93. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/desktop_apps/ReadMe.md +0 -0
  94. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/desktop_apps/recorder.py +0 -0
  95. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/dialog_boxes/ReadMe.md +0 -0
  96. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/dialog_boxes/dialog_box_tour.py +0 -0
  97. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/edge_test.py +0 -0
  98. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/example_config.cfg +0 -0
  99. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/example_logs/ReadMe.md +0 -0
  100. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/example_logs/basic_test_info.txt +0 -0
  101. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/example_logs/page_source.html +0 -0
  102. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/example_logs/screenshot.png +0 -0
  103. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/github_test.py +0 -0
  104. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/gui_test_runner.py +0 -0
  105. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/hack_the_planet.py +0 -0
  106. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/handle_alert_test.py +0 -0
  107. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/iframe_tests.py +0 -0
  108. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/locale_code_test.py +0 -0
  109. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/master_qa/ReadMe.md +0 -0
  110. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/master_qa/__init__.py +0 -0
  111. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/master_qa/basic_masterqa_test_0.py +0 -0
  112. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/master_qa/masterqa_test_1.py +0 -0
  113. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/master_qa/pytest.ini +0 -0
  114. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/__init__.py +0 -0
  115. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/protractor/ReadMe.md +0 -0
  116. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/protractor/__init__.py +0 -0
  117. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/protractor/example_spec.js +0 -0
  118. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/protractor/example_test.py +0 -0
  119. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/protractor/input_spec.js +0 -0
  120. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/protractor/input_test.py +0 -0
  121. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/protractor/mat_paginator_spec.js +0 -0
  122. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/protractor/mat_paginator_test.py +0 -0
  123. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/raw_selenium/ReadMe.md +0 -0
  124. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/raw_selenium/__init__.py +0 -0
  125. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
  126. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
  127. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/raw_selenium/messy_raw.py +0 -0
  128. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/raw_selenium/pytest.ini +0 -0
  129. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/raw_selenium/refined_raw.py +0 -0
  130. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/migration/raw_selenium/simple_sbase.py +0 -0
  131. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/my_first_test.py +0 -0
  132. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/nth_child_test.py +0 -0
  133. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/offline_examples/__init__.py +0 -0
  134. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/offline_examples/demo_page.html +0 -0
  135. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/offline_examples/load_html_test.py +0 -0
  136. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/offline_examples/test_demo_page.py +0 -0
  137. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/offline_examples/test_handle_alerts.py +0 -0
  138. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/offline_examples/test_request_fixture.py +0 -0
  139. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/offline_examples/test_user_agent.py +0 -0
  140. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/old_wordle_script.py +0 -0
  141. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/parameterized_test.py +0 -0
  142. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/performance_test.py +0 -0
  143. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/presenter/ReadMe.md +0 -0
  144. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/presenter/core_presentation.py +0 -0
  145. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/presenter/edge_presentation.py +0 -0
  146. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/presenter/fundamentals.py +0 -0
  147. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/presenter/my_presentation.py +0 -0
  148. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/presenter/py_virtual_envs.py +0 -0
  149. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/proxy_test.py +0 -0
  150. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/pytest.ini +0 -0
  151. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/rate_limiting_test.py +0 -0
  152. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/raw_call.py +0 -0
  153. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/raw_driver_context.py +0 -0
  154. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/raw_file_call.py +0 -0
  155. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/raw_main_call.py +0 -0
  156. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/raw_parameter_script.py +0 -0
  157. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/raw_sb.py +0 -0
  158. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/raw_test_scripts.py +0 -0
  159. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/raw_uc_mode.py +0 -0
  160. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/setup.cfg +0 -0
  161. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/shadow_root_test.py +0 -0
  162. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/swag_labs_user_tests.py +0 -0
  163. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_apple_site.py +0 -0
  164. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_assert_elements.py +0 -0
  165. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_calculator.py +0 -0
  166. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_canvas.py +0 -0
  167. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_checkboxes.py +0 -0
  168. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_chinese_pdf.py +0 -0
  169. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_chromedriver.py +0 -0
  170. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_coffee_cart.py +0 -0
  171. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_console_logging.py +0 -0
  172. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_contains_selector.py +0 -0
  173. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_cycle_elements.py +0 -0
  174. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_decryption.py +0 -0
  175. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_deferred_asserts.py +0 -0
  176. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_demo_site.py +0 -0
  177. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_detect_404s.py +0 -0
  178. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_docs_site.py +0 -0
  179. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_double_click.py +0 -0
  180. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_download_files.py +0 -0
  181. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_download_images.py +0 -0
  182. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_drag_and_drop.py +0 -0
  183. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_error_page.py +0 -0
  184. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_event_firing.py +0 -0
  185. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_fail.py +0 -0
  186. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_geolocation.py +0 -0
  187. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_get_coffee.py +0 -0
  188. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_get_locale_code.py +0 -0
  189. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_get_pdf_text.py +0 -0
  190. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_get_user_agent.py +0 -0
  191. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_hack_search.py +0 -0
  192. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_image_saving.py +0 -0
  193. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_inspect_html.py +0 -0
  194. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_login.py +0 -0
  195. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_markers.py +0 -0
  196. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_mfa_login.py +0 -0
  197. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_multiple_drivers.py +0 -0
  198. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_null.py +0 -0
  199. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_override_driver.py +0 -0
  200. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_override_sb_fixture.py +0 -0
  201. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_parse_soup.py +0 -0
  202. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_pdf_asserts.py +0 -0
  203. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_pytest_parametrize.py +0 -0
  204. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_repeat_tests.py +0 -0
  205. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_request_sb_fixture.py +0 -0
  206. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_save_screenshots.py +0 -0
  207. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_sb_fixture.py +0 -0
  208. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_scrape_bing.py +0 -0
  209. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_select_options.py +0 -0
  210. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_shadow_dom.py +0 -0
  211. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_show_file_choosers.py +0 -0
  212. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_skype_site.py +0 -0
  213. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_suite.py +0 -0
  214. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_swag_labs.py +0 -0
  215. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_tinymce.py +0 -0
  216. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_todomvc.py +0 -0
  217. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_url_asserts.py +0 -0
  218. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_usefixtures.py +0 -0
  219. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_verify_chromedriver.py +0 -0
  220. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_window_switching.py +0 -0
  221. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_xfail.py +0 -0
  222. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/test_xkcd.py +0 -0
  223. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/time_limit_test.py +0 -0
  224. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/ReadMe.md +0 -0
  225. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/bootstrap_google_tour.py +0 -0
  226. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
  227. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/driverjs_maps_tour.py +0 -0
  228. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/google_tour.py +0 -0
  229. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/hopscotch_google_tour.py +0 -0
  230. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/introjs_google_tour.py +0 -0
  231. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/maps_introjs_tour.py +0 -0
  232. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/octocat_tour.py +0 -0
  233. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/shepherd_google_tour.py +0 -0
  234. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/tour_examples/xkcd_tour.py +0 -0
  235. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/ReadMe.md +0 -0
  236. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/chinese_test_1.py +0 -0
  237. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/dutch_test_1.py +0 -0
  238. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/english_test_1.py +0 -0
  239. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/french_test_1.py +0 -0
  240. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/italian_test_1.py +0 -0
  241. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/japanese_test_1.py +0 -0
  242. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/korean_test_1.py +0 -0
  243. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/portuguese_test_1.py +0 -0
  244. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/pytest.ini +0 -0
  245. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/russian_test_1.py +0 -0
  246. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/translations/spanish_test_1.py +0 -0
  247. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/unit_tests/ReadMe.md +0 -0
  248. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/unit_tests/verify_framework.py +0 -0
  249. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/upgrade_chromedriver.py +0 -0
  250. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/upload_file_test.py +0 -0
  251. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/user_agent_test.py +0 -0
  252. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/verify_undetected.py +0 -0
  253. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/ReadMe.md +0 -0
  254. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/__init__.py +0 -0
  255. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/case_plans/layout_test.VisualLayoutTests.test_applitools_layout_change.md +0 -0
  256. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/case_plans/python_home_test.VisualLayoutTests.test_python_home_layout_change.md +0 -0
  257. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_applitools_change.md +0 -0
  258. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_xkcd_logo_change.md +0 -0
  259. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/case_plans/test_layout_fail.VisualLayout_FixtureTests.test_python_home_change.md +0 -0
  260. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/case_plans/xkcd_visual_test.VisualLayoutTests.test_xkcd_layout_change.md +0 -0
  261. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/layout_test.py +0 -0
  262. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/python_home_test.py +0 -0
  263. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/test_layout_fail.py +0 -0
  264. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/visual_testing/xkcd_visual_test.py +0 -0
  265. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/wordle_test.py +0 -0
  266. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/xpath_test.py +0 -0
  267. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/examples/youtube_search_test.py +0 -0
  268. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/ReadMe.md +0 -0
  269. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/behave_gui.md +0 -0
  270. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/case_plans.md +0 -0
  271. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/chinese.md +0 -0
  272. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/commander.md +0 -0
  273. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/customizing_test_runs.md +0 -0
  274. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/demo_mode.md +0 -0
  275. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/desired_capabilities.md +0 -0
  276. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/features_list.md +0 -0
  277. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/handling_iframes.md +0 -0
  278. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/happy_customers.md +0 -0
  279. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/hidden_files_info.md +0 -0
  280. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/how_it_works.md +0 -0
  281. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/html_inspector.md +0 -0
  282. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/install.md +0 -0
  283. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/install_python_pip_git.md +0 -0
  284. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/js_package_manager.md +0 -0
  285. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/locale_codes.md +0 -0
  286. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/method_summary.md +0 -0
  287. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/mobile_testing.md +0 -0
  288. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/mysql_installation.md +0 -0
  289. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/recorder_mode.md +0 -0
  290. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/shadow_dom.md +0 -0
  291. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/syntax_formats.md +0 -0
  292. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/thank_you.md +0 -0
  293. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/translations.md +0 -0
  294. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/useful_grep_commands.md +0 -0
  295. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/using_safari_driver.md +0 -0
  296. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/verify_webdriver.md +0 -0
  297. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/virtualenv_instructions.md +0 -0
  298. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/help_docs/webdriver_installation.md +0 -0
  299. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/install.sh +0 -0
  300. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/__init__.py +0 -0
  301. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/azure/azure_pipelines/ReadMe.md +0 -0
  302. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/azure/jenkins/ReadMe.md +0 -0
  303. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/ReadMe.md +0 -0
  304. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/behave.ini +0 -0
  305. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/__init__.py +0 -0
  306. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/behave.ini +0 -0
  307. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/calculator.feature +0 -0
  308. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/environment.py +0 -0
  309. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/fail_page.feature +0 -0
  310. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/realworld.feature +0 -0
  311. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/steps/__init__.py +0 -0
  312. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/steps/calculator.py +0 -0
  313. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/steps/fail_page.py +0 -0
  314. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/steps/real_world.py +0 -0
  315. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/steps/swag_labs.py +0 -0
  316. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/behave/features/swag_labs.feature +0 -0
  317. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/brython/ReadMe.md +0 -0
  318. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/brython/index.html +0 -0
  319. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/brython/index.py +0 -0
  320. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/brython/library.html +0 -0
  321. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/docker/ReadMe.md +0 -0
  322. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/docker/docker-entrypoint.sh +0 -0
  323. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/docker/run_docker_test_in_chrome.sh +0 -0
  324. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/github/ReadMe.md +0 -0
  325. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/github/workflows/ReadMe.md +0 -0
  326. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/github/workflows/extras.md +0 -0
  327. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/google_cloud/ReadMe.md +0 -0
  328. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/katalon/ReadMe.md +0 -0
  329. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/linux/Linuxfile.sh +0 -0
  330. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/linux/ReadMe.md +0 -0
  331. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/linux/Xvfb_launcher.sh +0 -0
  332. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/linux/jenkins_permissions.sh +0 -0
  333. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/linux/tomcat_permissions.sh +0 -0
  334. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/node_js/ReadMe.md +0 -0
  335. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/node_js/__init__.py +0 -0
  336. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/node_js/index.html +0 -0
  337. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/node_js/my_first_test.py +0 -0
  338. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/node_js/npm-shrinkwrap.json +0 -0
  339. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/node_js/package.json +0 -0
  340. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/node_js/server.js +0 -0
  341. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/node_js/test_demo_site.py +0 -0
  342. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/selenium_grid/ReadMe.md +0 -0
  343. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/integrations/selenium_ide/ReadMe.md +0 -0
  344. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs.yml +0 -0
  345. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/ReadMe.txt +0 -0
  346. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/docs_instructions.txt +0 -0
  347. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/dash_pie.png +0 -0
  348. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/dash_pie_2.png +0 -0
  349. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/dash_pie_3.png +0 -0
  350. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/favicon.ico +0 -0
  351. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/grad_logo.png +0 -0
  352. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/green_icon.png +0 -0
  353. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/green_logo.png +0 -0
  354. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/green_logo2.png +0 -0
  355. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/green_logo3.png +0 -0
  356. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/logo3.png +0 -0
  357. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/logo3a.png +0 -0
  358. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/logo3b.png +0 -0
  359. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/logo3c.png +0 -0
  360. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/logo4.png +0 -0
  361. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/logo5.png +0 -0
  362. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/logo6.png +0 -0
  363. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/logo7.png +0 -0
  364. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/sb_icon.png +0 -0
  365. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/sb_logo_10.png +0 -0
  366. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/sb_logo_7.png +0 -0
  367. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/side_by_side.png +0 -0
  368. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/social/share_facebook.svg +0 -0
  369. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/social/share_github.svg +0 -0
  370. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/social/share_gitter.svg +0 -0
  371. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/social/share_instagram.svg +0 -0
  372. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/img/social/share_twitter.svg +0 -0
  373. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/index.txt +0 -0
  374. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/prepare.py +0 -0
  375. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/mkdocs_build/requirements.txt +0 -0
  376. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/pytest.ini +0 -0
  377. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/sbase/ReadMe.txt +0 -0
  378. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/sbase/__init__.py +0 -0
  379. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/sbase/__main__.py +0 -0
  380. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/sbase/steps.py +0 -0
  381. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/ReadMe.md +0 -0
  382. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/__init__.py +0 -0
  383. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/__main__.py +0 -0
  384. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/behave/__init__.py +0 -0
  385. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/behave/behave_helper.py +0 -0
  386. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/behave/behave_sb.py +0 -0
  387. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/behave/steps.py +0 -0
  388. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/common/ReadMe.md +0 -0
  389. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/common/__init__.py +0 -0
  390. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/common/decorators.py +0 -0
  391. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/common/encryption.py +0 -0
  392. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/common/exceptions.py +0 -0
  393. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/common/obfuscate.py +0 -0
  394. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/common/unobfuscate.py +0 -0
  395. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/config/__init__.py +0 -0
  396. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/config/ad_block_list.py +0 -0
  397. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/config/proxy_list.py +0 -0
  398. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/config/settings.py +0 -0
  399. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/ReadMe.md +0 -0
  400. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/__init__.py +0 -0
  401. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
  402. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
  403. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/run.py +0 -0
  404. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  405. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  406. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
  407. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_install.py +0 -0
  408. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  409. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  410. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  411. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  412. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  413. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  414. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_print.py +0 -0
  415. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  416. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/__init__.py +0 -0
  417. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/application_manager.py +0 -0
  418. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/capabilities_parser.py +0 -0
  419. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/colored_traceback.py +0 -0
  420. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/create_db_tables.sql +0 -0
  421. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/detect_b_ver.py +0 -0
  422. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/download_helper.py +0 -0
  423. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/encoded_images.py +0 -0
  424. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/jqc_helper.py +0 -0
  425. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/log_helper.py +0 -0
  426. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/mysql.py +0 -0
  427. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/proxy_helper.py +0 -0
  428. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/recorder_helper.py +0 -0
  429. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/report_helper.py +0 -0
  430. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/s3_manager.py +0 -0
  431. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/sb_driver.py +0 -0
  432. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/session_helper.py +0 -0
  433. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/settings_parser.py +0 -0
  434. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/style_sheet.py +0 -0
  435. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/testcase_manager.py +0 -0
  436. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/tour_helper.py +0 -0
  437. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/core/visual_helper.py +0 -0
  438. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/drivers/ReadMe.md +0 -0
  439. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/drivers/__init__.py +0 -0
  440. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/extensions/ReadMe.md +0 -0
  441. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/extensions/__init__.py +0 -0
  442. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/extensions/ad_block.zip +0 -0
  443. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/extensions/disable_csp.zip +0 -0
  444. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/extensions/recorder.zip +0 -0
  445. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
  446. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/__init__.py +0 -0
  447. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/constants.py +0 -0
  448. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  449. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/errors.py +0 -0
  450. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/js_utils.py +0 -0
  451. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/page_actions.py +0 -0
  452. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/page_utils.py +0 -0
  453. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
  454. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/words.py +0 -0
  455. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  456. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/js_code/__init__.py +0 -0
  457. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/js_code/active_css_js.py +0 -0
  458. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/js_code/live_js.py +0 -0
  459. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/js_code/recorder_js.py +0 -0
  460. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/masterqa/ReadMe.md +0 -0
  461. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/masterqa/__init__.py +0 -0
  462. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/masterqa/master_qa.py +0 -0
  463. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/__init__.py +0 -0
  464. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/base_plugin.py +0 -0
  465. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/basic_test_info.py +0 -0
  466. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  467. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/page_source.py +0 -0
  468. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/pytest_plugin.py +0 -0
  469. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  470. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/screen_shots.py +0 -0
  471. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/plugins/selenium_plugin.py +0 -0
  472. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/resources/ReadMe.md +0 -0
  473. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/resources/__init__.py +0 -0
  474. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/resources/favicon.ico +0 -0
  475. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/__init__.py +0 -0
  476. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/chinese.py +0 -0
  477. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/dutch.py +0 -0
  478. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/french.py +0 -0
  479. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/italian.py +0 -0
  480. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/japanese.py +0 -0
  481. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/korean.py +0 -0
  482. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/master_dict.py +0 -0
  483. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/portuguese.py +0 -0
  484. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/russian.py +0 -0
  485. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/spanish.py +0 -0
  486. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/translate/translator.py +0 -0
  487. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/undetected/__init__.py +0 -0
  488. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/undetected/cdp.py +0 -0
  489. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/undetected/dprocess.py +0 -0
  490. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/undetected/options.py +0 -0
  491. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/undetected/patcher.py +0 -0
  492. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/undetected/reactor.py +0 -0
  493. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/undetected/webelement.py +0 -0
  494. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/__init__.py +0 -0
  495. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/ReadMe.md +0 -0
  496. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  497. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  498. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  499. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  500. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  501. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  502. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  503. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  504. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  505. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  506. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  507. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_ide/ReadMe.md +0 -0
  508. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  509. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  510. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
  511. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
  512. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase.egg-info/entry_points.txt +0 -0
  513. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/seleniumbase.egg-info/top_level.txt +0 -0
  514. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/setup.cfg +0 -0
  515. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/virtualenv_install.sh +0 -0
  516. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/win_install.bat +0 -0
  517. {seleniumbase-4.28.0a2 → seleniumbase-4.28.1}/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.0a2
3
+ Version: 4.28.1
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"
@@ -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"
@@ -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.1"
@@ -467,7 +467,7 @@ def uc_open_with_reconnect(driver, url, reconnect_time=None):
467
467
  if (url.startswith("http:") or url.startswith("https:")):
468
468
  script = 'window.open("%s","_blank");' % url
469
469
  driver.execute_script(script)
470
- time.sleep(0.02)
470
+ time.sleep(0.05)
471
471
  driver.close()
472
472
  if reconnect_time == "disconnect":
473
473
  driver.disconnect()
@@ -497,7 +497,7 @@ def uc_open_with_disconnect(driver, url, timeout=None):
497
497
  if (url.startswith("http:") or url.startswith("https:")):
498
498
  script = 'window.open("%s","_blank");' % url
499
499
  driver.execute_script(script)
500
- time.sleep(0.02)
500
+ time.sleep(0.05)
501
501
  driver.close()
502
502
  driver.disconnect()
503
503
  min_timeout = 0.008
@@ -546,7 +546,17 @@ def uc_click(
546
546
  driver.reconnect(reconnect_time)
547
547
 
548
548
 
549
+ def verify_pyautogui_has_a_headed_browser():
550
+ """PyAutoGUI requires a headed browser so that it can
551
+ focus on the correct element when performing actions."""
552
+ if sb_config.headless or sb_config.headless2:
553
+ raise Exception(
554
+ "PyAutoGUI can't be used in headless mode!"
555
+ )
556
+
557
+
549
558
  def install_pyautogui_if_missing():
559
+ verify_pyautogui_has_a_headed_browser()
550
560
  pip_find_lock = fasteners.InterProcessLock(
551
561
  constants.PipInstall.FINDLOCK
552
562
  )
@@ -556,10 +566,11 @@ def install_pyautogui_if_missing():
556
566
  try:
557
567
  use_pyautogui_ver = constants.PyAutoGUI.VER
558
568
  if pyautogui.__version__ != use_pyautogui_ver:
569
+ del pyautogui
559
570
  shared_utils.pip_install(
560
571
  "pyautogui", version=use_pyautogui_ver
561
572
  )
562
- del pyautogui
573
+ import pyautogui
563
574
  except Exception:
564
575
  pass
565
576
  except Exception:
@@ -1020,7 +1031,7 @@ def _set_chrome_options(
1020
1031
  prefs["download.prompt_for_download"] = False
1021
1032
  prefs["credentials_enable_service"] = False
1022
1033
  prefs["local_discovery.notifications_enabled"] = False
1023
- prefs["safebrowsing.enabled"] = True
1034
+ prefs["safebrowsing.enabled"] = False # Prevent PW "data breach" pop-ups
1024
1035
  prefs["safebrowsing.disable_download_protection"] = True
1025
1036
  prefs["omnibox-max-zero-suggest-matches"] = 0
1026
1037
  prefs["omnibox-use-existing-autocomplete-client"] = 0
@@ -1623,6 +1634,10 @@ def get_driver(
1623
1634
  if headless2 and browser_name == constants.Browser.FIREFOX:
1624
1635
  headless2 = False # Only for Chromium
1625
1636
  headless = True
1637
+ if not hasattr(sb_config, "headless"):
1638
+ sb_config.headless = headless
1639
+ if not hasattr(sb_config, "headless2"):
1640
+ sb_config.headless2 = headless2
1626
1641
  if (
1627
1642
  binary_location
1628
1643
  and isinstance(binary_location, str)
@@ -2611,7 +2626,7 @@ def get_local_driver(
2611
2626
  "credentials_enable_service": False,
2612
2627
  "local_discovery.notifications_enabled": False,
2613
2628
  "safebrowsing.disable_download_protection": True,
2614
- "safebrowsing.enabled": True,
2629
+ "safebrowsing.enabled": False, # Prevent PW "data breach" pop-ups
2615
2630
  "omnibox-max-zero-suggest-matches": 0,
2616
2631
  "omnibox-use-existing-autocomplete-client": 0,
2617
2632
  "omnibox-trending-zero-prefix-suggestions-on-ntp": 0,
@@ -6822,10 +6822,10 @@ class BaseCase(unittest.TestCase):
6822
6822
  try:
6823
6823
  import cryptography
6824
6824
  if cryptography.__version__ != "39.0.2":
6825
+ del cryptography # To get newer ver
6825
6826
  shared_utils.pip_install(
6826
6827
  "cryptography", version="39.0.2"
6827
6828
  )
6828
- del cryptography # To get newer ver
6829
6829
  import cryptography
6830
6830
  except Exception:
6831
6831
  shared_utils.pip_install(
@@ -13718,7 +13718,7 @@ class BaseCase(unittest.TestCase):
13718
13718
  which is the default mode on Linux unless using another arg."""
13719
13719
  if "linux" in sys.platform and (not self.headed or self.xvfb):
13720
13720
  from sbvirtualdisplay import Display
13721
- if self.undetectable:
13721
+ if self.undetectable and not (self.headless or self.headless2):
13722
13722
  import Xlib.display
13723
13723
  try:
13724
13724
  self._xvfb_display = Display(
@@ -13749,10 +13749,10 @@ class BaseCase(unittest.TestCase):
13749
13749
  try:
13750
13750
  use_pyautogui_ver = constants.PyAutoGUI.VER
13751
13751
  if pyautogui.__version__ != use_pyautogui_ver:
13752
+ del pyautogui # To get newer ver
13752
13753
  shared_utils.pip_install(
13753
13754
  "pyautogui", version=use_pyautogui_ver
13754
13755
  )
13755
- del pyautogui # To get newer ver
13756
13756
  import pyautogui
13757
13757
  except Exception:
13758
13758
  pass
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.28.0a2
3
+ Version: 4.28.1
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"
@@ -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
@@ -65,11 +65,11 @@ markdown-it-py==2.2.0
65
65
  urllib3<2.3.0,>=1.26.18
66
66
 
67
67
  [:python_version >= "3.8"]
68
- pip>=24.1
68
+ pip>=24.1.1
69
69
  packaging>=24.1
70
- setuptools>=70.1.0
70
+ setuptools>=70.1.1
71
71
  wheel>=0.43.0
72
- filelock>=3.15.3
72
+ filelock>=3.15.4
73
73
  platformdirs>=4.2.2
74
74
  typing-extensions>=4.12.2
75
75
  trio==0.25.1
@@ -97,7 +97,7 @@ coverage==7.2.7
97
97
  pytest-cov==4.1.0
98
98
 
99
99
  [coverage:python_version >= "3.8"]
100
- coverage>=7.5.3
100
+ coverage>=7.5.4
101
101
  pytest-cov>=5.0.0
102
102
 
103
103
  [flake8]
@@ -147,18 +147,18 @@ setup(
147
147
  python_requires=">=3.7",
148
148
  install_requires=[
149
149
  'pip>=24.0;python_version<"3.8"',
150
- 'pip>=24.1;python_version>="3.8"',
150
+ 'pip>=24.1.1;python_version>="3.8"',
151
151
  'packaging>=24.0;python_version<"3.8"',
152
152
  'packaging>=24.1;python_version>="3.8"',
153
153
  'setuptools>=68.0.0;python_version<"3.8"',
154
- 'setuptools>=70.1.0;python_version>="3.8"',
154
+ 'setuptools>=70.1.1;python_version>="3.8"',
155
155
  'wheel>=0.42.0;python_version<"3.8"',
156
156
  'wheel>=0.43.0;python_version>="3.8"',
157
157
  'attrs>=23.2.0',
158
158
  "certifi>=2024.6.2",
159
159
  "exceptiongroup>=1.2.1",
160
160
  'filelock>=3.12.2;python_version<"3.8"',
161
- 'filelock>=3.15.3;python_version>="3.8"',
161
+ 'filelock>=3.15.4;python_version>="3.8"',
162
162
  'platformdirs>=4.0.0;python_version<"3.8"',
163
163
  'platformdirs>=4.2.2;python_version>="3.8"',
164
164
  'typing-extensions>=4.12.2;python_version>="3.8"',
@@ -234,7 +234,7 @@ setup(
234
234
  # Usage: coverage run -m pytest; coverage html; coverage report
235
235
  "coverage": [
236
236
  'coverage==7.2.7;python_version<"3.8"',
237
- 'coverage>=7.5.3;python_version>="3.8"',
237
+ 'coverage>=7.5.4;python_version>="3.8"',
238
238
  'pytest-cov==4.1.0;python_version<"3.8"',
239
239
  'pytest-cov>=5.0.0;python_version>="3.8"',
240
240
  ],
@@ -1,2 +0,0 @@
1
- # seleniumbase package
2
- __version__ = "4.28.0a2"
File without changes
File without changes
File without changes