seleniumbase 4.33.3__tar.gz → 4.33.5__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (392) hide show
  1. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/.gitignore +1 -0
  2. {seleniumbase-4.33.3/seleniumbase.egg-info → seleniumbase-4.33.5}/PKG-INFO +3 -4
  3. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/pyproject.toml +1 -1
  4. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/pytest.ini +1 -1
  5. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/requirements.txt +2 -3
  6. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/__version__.py +1 -1
  7. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_mkdir.py +2 -1
  8. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/browser_launcher.py +78 -53
  9. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/base_case.py +88 -69
  10. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/pytest_plugin.py +131 -8
  11. {seleniumbase-4.33.3 → seleniumbase-4.33.5/seleniumbase.egg-info}/PKG-INFO +3 -4
  12. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase.egg-info/requires.txt +2 -3
  13. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/setup.py +2 -3
  14. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/LICENSE +0 -0
  15. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/MANIFEST.in +0 -0
  16. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/README.md +0 -0
  17. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/__init__.py +0 -0
  18. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/basic_test.py +0 -0
  19. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/behave_bdd/__init__.py +0 -0
  20. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/behave_bdd/features/__init__.py +0 -0
  21. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/behave_bdd/features/environment.py +0 -0
  22. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/behave_bdd/features/steps/__init__.py +0 -0
  23. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/behave_bdd/features/steps/calculator.py +0 -0
  24. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/behave_bdd/features/steps/fail_page.py +0 -0
  25. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/behave_bdd/features/steps/imported.py +0 -0
  26. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
  27. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/__init__.py +0 -0
  28. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/base_test_case.py +0 -0
  29. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/boilerplate_test.py +0 -0
  30. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/classic_obj_test.py +0 -0
  31. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/page_objects.py +0 -0
  32. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/samples/__init__.py +0 -0
  33. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
  34. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
  35. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/samples/google_objects.py +0 -0
  36. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/samples/google_test.py +0 -0
  37. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/samples/sb_swag_test.py +0 -0
  38. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/samples/swag_labs_test.py +0 -0
  39. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/samples/test_page_objects.py +0 -0
  40. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/boilerplates/sb_fixture_test.py +0 -0
  41. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/capabilities/mac_cap_file.py +0 -0
  42. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/capabilities/sample_cap_file_BS.py +0 -0
  43. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/capabilities/sample_cap_file_SL.py +0 -0
  44. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/capabilities/selenoid_cap_file.py +0 -0
  45. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/capabilities/win10_cap_file.py +0 -0
  46. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/chart_maker/chart_presentation.py +0 -0
  47. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/chart_maker/my_chart.py +0 -0
  48. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/chart_maker/pie_charts.py +0 -0
  49. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/chart_maker/test_area_chart.py +0 -0
  50. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/chart_maker/test_display_chart.py +0 -0
  51. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/chart_maker/test_line_chart.py +0 -0
  52. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/chart_maker/test_multi_series.py +0 -0
  53. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/chart_maker/test_save_chart.py +0 -0
  54. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/coffee_cart_tests.py +0 -0
  55. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/custom_settings.py +0 -0
  56. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/desktop_apps/recorder.py +0 -0
  57. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/dialog_boxes/dialog_box_tour.py +0 -0
  58. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/edge_test.py +0 -0
  59. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/github_test.py +0 -0
  60. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/gui_test_runner.py +0 -0
  61. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/hack_the_planet.py +0 -0
  62. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/handle_alert_test.py +0 -0
  63. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/iframe_tests.py +0 -0
  64. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/locale_code_test.py +0 -0
  65. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/master_qa/__init__.py +0 -0
  66. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/master_qa/basic_masterqa_test_0.py +0 -0
  67. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/master_qa/masterqa_test_1.py +0 -0
  68. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/__init__.py +0 -0
  69. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/protractor/__init__.py +0 -0
  70. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/protractor/example_test.py +0 -0
  71. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/protractor/input_test.py +0 -0
  72. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/protractor/mat_paginator_test.py +0 -0
  73. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/raw_selenium/__init__.py +0 -0
  74. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
  75. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
  76. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/raw_selenium/messy_raw.py +0 -0
  77. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/raw_selenium/refined_raw.py +0 -0
  78. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/migration/raw_selenium/simple_sbase.py +0 -0
  79. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/my_first_test.py +0 -0
  80. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/nth_child_test.py +0 -0
  81. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/offline_examples/__init__.py +0 -0
  82. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/offline_examples/load_html_test.py +0 -0
  83. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/offline_examples/test_demo_page.py +0 -0
  84. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/offline_examples/test_extended_driver.py +0 -0
  85. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/offline_examples/test_handle_alerts.py +0 -0
  86. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/offline_examples/test_request_fixture.py +0 -0
  87. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/offline_examples/test_user_agent.py +0 -0
  88. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/old_wordle_script.py +0 -0
  89. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/parameterized_test.py +0 -0
  90. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/performance_test.py +0 -0
  91. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/presenter/core_presentation.py +0 -0
  92. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/presenter/edge_presentation.py +0 -0
  93. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/presenter/fundamentals.py +0 -0
  94. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/presenter/multi_uc.py +0 -0
  95. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/presenter/my_presentation.py +0 -0
  96. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/presenter/py_virtual_envs.py +0 -0
  97. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/presenter/uc_presentation.py +0 -0
  98. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/presenter/uc_presentation_3.py +0 -0
  99. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/proxy_test.py +0 -0
  100. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/rate_limiting_test.py +0 -0
  101. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_ahrefs.py +0 -0
  102. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_antibot_login.py +0 -0
  103. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_bing_captcha.py +0 -0
  104. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_block.py +0 -0
  105. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_brotector_captcha.py +0 -0
  106. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_call.py +0 -0
  107. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_cdp_logging.py +0 -0
  108. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_cf.py +0 -0
  109. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_cookies.py +0 -0
  110. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_detection.py +0 -0
  111. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_driver_context.py +0 -0
  112. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_driver_manager.py +0 -0
  113. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_file_call.py +0 -0
  114. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_form_turnstile.py +0 -0
  115. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_games.py +0 -0
  116. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_gui_click.py +0 -0
  117. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_hobbit.py +0 -0
  118. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_login_context.py +0 -0
  119. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_login_driver.py +0 -0
  120. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_login_sb.py +0 -0
  121. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_main_call.py +0 -0
  122. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_mobile.py +0 -0
  123. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_multi_drivers.py +0 -0
  124. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_nopecha.py +0 -0
  125. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_order_tickets.py +0 -0
  126. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_parameter_script.py +0 -0
  127. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_performance_logs.py +0 -0
  128. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_pixelscan.py +0 -0
  129. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_pyautogui.py +0 -0
  130. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_recaptcha.py +0 -0
  131. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_robot.py +0 -0
  132. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_sb.py +0 -0
  133. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_test_scripts.py +0 -0
  134. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_turnstile.py +0 -0
  135. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/raw_uc_mode.py +0 -0
  136. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/sb_fixture_tests.py +0 -0
  137. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/shadow_root_test.py +0 -0
  138. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/swag_labs_user_tests.py +0 -0
  139. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_3d_apis.py +0 -0
  140. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_apple_site.py +0 -0
  141. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_assert_elements.py +0 -0
  142. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_calculator.py +0 -0
  143. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_canvas.py +0 -0
  144. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_cdp_ad_blocking.py +0 -0
  145. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_checkboxes.py +0 -0
  146. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_chinese_pdf.py +0 -0
  147. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_chromedriver.py +0 -0
  148. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_coffee_cart.py +0 -0
  149. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_console_logging.py +0 -0
  150. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_contains_selector.py +0 -0
  151. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_cycle_elements.py +0 -0
  152. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_decryption.py +0 -0
  153. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_deferred_asserts.py +0 -0
  154. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_demo_site.py +0 -0
  155. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_detect_404s.py +0 -0
  156. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_docs_site.py +0 -0
  157. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_double_click.py +0 -0
  158. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_download_files.py +0 -0
  159. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_download_images.py +0 -0
  160. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_drag_and_drop.py +0 -0
  161. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_error_page.py +0 -0
  162. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_event_firing.py +0 -0
  163. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_fail.py +0 -0
  164. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_geolocation.py +0 -0
  165. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_get_coffee.py +0 -0
  166. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_get_locale_code.py +0 -0
  167. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_get_pdf_text.py +0 -0
  168. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_get_user_agent.py +0 -0
  169. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_hack_search.py +0 -0
  170. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_highlight_elements.py +0 -0
  171. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_image_saving.py +0 -0
  172. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_inspect_html.py +0 -0
  173. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_login.py +0 -0
  174. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_markers.py +0 -0
  175. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_mfa_login.py +0 -0
  176. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_multiple_drivers.py +0 -0
  177. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_null.py +0 -0
  178. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_override_driver.py +0 -0
  179. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_override_sb_fixture.py +0 -0
  180. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_parse_soup.py +0 -0
  181. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_pdf_asserts.py +0 -0
  182. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_pytest_parametrize.py +0 -0
  183. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_repeat_tests.py +0 -0
  184. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_request_sb_fixture.py +0 -0
  185. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_save_screenshots.py +0 -0
  186. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_sb_fixture.py +0 -0
  187. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_scrape_bing.py +0 -0
  188. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_select_options.py +0 -0
  189. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_shadow_dom.py +0 -0
  190. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_show_file_choosers.py +0 -0
  191. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_simple_login.py +0 -0
  192. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_skype_site.py +0 -0
  193. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_suite.py +0 -0
  194. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_swag_labs.py +0 -0
  195. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_tinymce.py +0 -0
  196. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_todomvc.py +0 -0
  197. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_url_asserts.py +0 -0
  198. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_usefixtures.py +0 -0
  199. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_verify_chromedriver.py +0 -0
  200. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_window_switching.py +0 -0
  201. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_xfail.py +0 -0
  202. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/test_xkcd.py +0 -0
  203. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/time_limit_test.py +0 -0
  204. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/bootstrap_google_tour.py +0 -0
  205. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
  206. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/driverjs_maps_tour.py +0 -0
  207. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/google_tour.py +0 -0
  208. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/hopscotch_google_tour.py +0 -0
  209. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/introjs_google_tour.py +0 -0
  210. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/maps_introjs_tour.py +0 -0
  211. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/octocat_tour.py +0 -0
  212. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/recordings/__init__.py +0 -0
  213. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/recordings/shepherd_google_tour_rec.py +0 -0
  214. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/shepherd_google_tour.py +0 -0
  215. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/tour_examples/xkcd_tour.py +0 -0
  216. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/chinese_test_1.py +0 -0
  217. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/dutch_test_1.py +0 -0
  218. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/english_test_1.py +0 -0
  219. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/french_test_1.py +0 -0
  220. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/italian_test_1.py +0 -0
  221. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/japanese_test_1.py +0 -0
  222. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/korean_test_1.py +0 -0
  223. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/portuguese_test_1.py +0 -0
  224. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/russian_test_1.py +0 -0
  225. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/translations/spanish_test_1.py +0 -0
  226. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/uc_cdp_events.py +0 -0
  227. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/unit_tests/verify_framework.py +0 -0
  228. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/upgrade_chromedriver.py +0 -0
  229. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/upload_file_test.py +0 -0
  230. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/user_agent_test.py +0 -0
  231. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/verify_undetected.py +0 -0
  232. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/visual_testing/__init__.py +0 -0
  233. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/visual_testing/layout_test.py +0 -0
  234. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/visual_testing/python_home_test.py +0 -0
  235. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/visual_testing/test_layout_fail.py +0 -0
  236. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/visual_testing/xkcd_visual_test.py +0 -0
  237. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/wordle_test.py +0 -0
  238. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/xpath_test.py +0 -0
  239. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/examples/youtube_search_test.py +0 -0
  240. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/install.sh +0 -0
  241. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/__init__.py +0 -0
  242. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/behave/features/__init__.py +0 -0
  243. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/behave/features/environment.py +0 -0
  244. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/behave/features/steps/__init__.py +0 -0
  245. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/behave/features/steps/calculator.py +0 -0
  246. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/behave/features/steps/fail_page.py +0 -0
  247. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/behave/features/steps/real_world.py +0 -0
  248. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/behave/features/steps/swag_labs.py +0 -0
  249. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/brython/index.py +0 -0
  250. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/node_js/__init__.py +0 -0
  251. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/node_js/my_first_test.py +0 -0
  252. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/integrations/node_js/test_demo_site.py +0 -0
  253. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/mkdocs_build/prepare.py +0 -0
  254. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/sbase/__init__.py +0 -0
  255. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/sbase/__main__.py +0 -0
  256. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/sbase/steps.py +0 -0
  257. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/__init__.py +0 -0
  258. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/__main__.py +0 -0
  259. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/behave/__init__.py +0 -0
  260. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/behave/behave_helper.py +0 -0
  261. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/behave/behave_sb.py +0 -0
  262. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/behave/steps.py +0 -0
  263. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/common/__init__.py +0 -0
  264. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/common/decorators.py +0 -0
  265. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/common/encryption.py +0 -0
  266. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/common/exceptions.py +0 -0
  267. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/common/obfuscate.py +0 -0
  268. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/common/unobfuscate.py +0 -0
  269. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/config/__init__.py +0 -0
  270. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/config/ad_block_list.py +0 -0
  271. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/config/proxy_list.py +0 -0
  272. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/config/settings.py +0 -0
  273. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/__init__.py +0 -0
  274. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/logo_helper.py +0 -0
  275. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/rich_helper.py +0 -0
  276. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/run.py +0 -0
  277. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  278. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  279. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_commander.py +0 -0
  280. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_install.py +0 -0
  281. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  282. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  283. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  284. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  285. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  286. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_print.py +0 -0
  287. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  288. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/__init__.py +0 -0
  289. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/application_manager.py +0 -0
  290. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/capabilities_parser.py +0 -0
  291. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/colored_traceback.py +0 -0
  292. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/create_db_tables.sql +0 -0
  293. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/detect_b_ver.py +0 -0
  294. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/download_helper.py +0 -0
  295. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/encoded_images.py +0 -0
  296. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/jqc_helper.py +0 -0
  297. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/log_helper.py +0 -0
  298. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/mysql.py +0 -0
  299. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/proxy_helper.py +0 -0
  300. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/recorder_helper.py +0 -0
  301. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/report_helper.py +0 -0
  302. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/s3_manager.py +0 -0
  303. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/sb_cdp.py +0 -0
  304. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/sb_driver.py +0 -0
  305. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/session_helper.py +0 -0
  306. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/settings_parser.py +0 -0
  307. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/style_sheet.py +0 -0
  308. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/testcase_manager.py +0 -0
  309. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/tour_helper.py +0 -0
  310. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/core/visual_helper.py +0 -0
  311. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/drivers/__init__.py +0 -0
  312. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/extensions/__init__.py +0 -0
  313. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/extensions/ad_block.zip +0 -0
  314. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/extensions/disable_csp.zip +0 -0
  315. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/extensions/recorder.zip +0 -0
  316. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/extensions/sbase_ext.zip +0 -0
  317. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/__init__.py +0 -0
  318. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/constants.py +0 -0
  319. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  320. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/errors.py +0 -0
  321. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/js_utils.py +0 -0
  322. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/page_actions.py +0 -0
  323. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/page_utils.py +0 -0
  324. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/shared_utils.py +0 -0
  325. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/unittest_helper.py +0 -0
  326. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/words.py +0 -0
  327. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  328. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/js_code/__init__.py +0 -0
  329. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/js_code/active_css_js.py +0 -0
  330. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/js_code/live_js.py +0 -0
  331. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/js_code/recorder_js.py +0 -0
  332. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/masterqa/__init__.py +0 -0
  333. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/masterqa/master_qa.py +0 -0
  334. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/__init__.py +0 -0
  335. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/base_plugin.py +0 -0
  336. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/basic_test_info.py +0 -0
  337. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  338. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/driver_manager.py +0 -0
  339. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/page_source.py +0 -0
  340. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  341. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/sb_manager.py +0 -0
  342. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/screen_shots.py +0 -0
  343. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/plugins/selenium_plugin.py +0 -0
  344. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/resources/__init__.py +0 -0
  345. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/__init__.py +0 -0
  346. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/chinese.py +0 -0
  347. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/dutch.py +0 -0
  348. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/french.py +0 -0
  349. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/italian.py +0 -0
  350. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/japanese.py +0 -0
  351. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/korean.py +0 -0
  352. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/master_dict.py +0 -0
  353. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/portuguese.py +0 -0
  354. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/russian.py +0 -0
  355. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/spanish.py +0 -0
  356. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/translate/translator.py +0 -0
  357. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/__init__.py +0 -0
  358. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp.py +0 -0
  359. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  360. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  361. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  362. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  363. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  364. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  365. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  366. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  367. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/dprocess.py +0 -0
  368. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/options.py +0 -0
  369. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/patcher.py +0 -0
  370. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/reactor.py +0 -0
  371. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/undetected/webelement.py +0 -0
  372. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/__init__.py +0 -0
  373. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  374. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  375. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  376. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  377. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  378. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  379. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  380. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  381. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  382. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  383. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  384. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  385. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  386. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase.egg-info/SOURCES.txt +0 -0
  387. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase.egg-info/dependency_links.txt +0 -0
  388. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase.egg-info/entry_points.txt +0 -0
  389. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/seleniumbase.egg-info/top_level.txt +0 -0
  390. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/setup.cfg +0 -0
  391. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/site/prepare.py +0 -0
  392. {seleniumbase-4.33.3 → seleniumbase-4.33.5}/virtualenv_install.sh +0 -0
@@ -100,6 +100,7 @@ latest_report
100
100
  report_archives
101
101
  archived_reports
102
102
  html_report.html
103
+ last_report.html
103
104
  report.html
104
105
  report.xml
105
106
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.33.3
3
+ Version: 4.33.5
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
@@ -76,7 +76,7 @@ Requires-Dist: pynose>=1.5.3
76
76
  Requires-Dist: platformdirs>=4.3.6
77
77
  Requires-Dist: typing-extensions>=4.12.2
78
78
  Requires-Dist: sbvirtualdisplay>=1.3.0
79
- Requires-Dist: six>=1.16.0
79
+ Requires-Dist: six>=1.17.0
80
80
  Requires-Dist: parse>=1.20.2
81
81
  Requires-Dist: parse-type>=0.6.4
82
82
  Requires-Dist: colorama>=0.4.6
@@ -104,9 +104,8 @@ Requires-Dist: sortedcontainers==2.4.0
104
104
  Requires-Dist: execnet==2.1.1
105
105
  Requires-Dist: iniconfig==2.0.0
106
106
  Requires-Dist: pluggy==1.5.0
107
- Requires-Dist: py==1.11.0
108
107
  Requires-Dist: pytest==8.3.4
109
- Requires-Dist: pytest-html==2.0.1
108
+ Requires-Dist: pytest-html==4.0.2
110
109
  Requires-Dist: pytest-metadata==3.1.1
111
110
  Requires-Dist: pytest-ordering==0.6
112
111
  Requires-Dist: pytest-rerunfailures==14.0; python_version < "3.9"
@@ -56,7 +56,7 @@ packages = [
56
56
  ]
57
57
 
58
58
  [tool.pytest.ini_options]
59
- addopts = ["--capture=no", "-p no:cacheprovider"]
59
+ addopts = ["--capture=tee-sys", "-p no:cacheprovider"]
60
60
  norecursedirs = [".*", "build", "dist", "recordings", "temp", "assets"]
61
61
  filterwarnings = [
62
62
  "ignore::pytest.PytestWarning",
@@ -1,7 +1,7 @@
1
1
  [pytest]
2
2
 
3
3
  # Display console output. Disable cacheprovider:
4
- addopts = --capture=no -p no:cacheprovider
4
+ addopts = --capture=tee-sys -p no:cacheprovider
5
5
 
6
6
  # Skip these directories during test collection:
7
7
  norecursedirs = .* build dist recordings temp assets
@@ -15,7 +15,7 @@ pynose>=1.5.3
15
15
  platformdirs>=4.3.6
16
16
  typing-extensions>=4.12.2
17
17
  sbvirtualdisplay>=1.3.0
18
- six>=1.16.0
18
+ six>=1.17.0
19
19
  parse>=1.20.2
20
20
  parse-type>=0.6.4
21
21
  colorama>=0.4.6
@@ -43,9 +43,8 @@ sortedcontainers==2.4.0
43
43
  execnet==2.1.1
44
44
  iniconfig==2.0.0
45
45
  pluggy==1.5.0
46
- py==1.11.0
47
46
  pytest==8.3.4
48
- pytest-html==2.0.1
47
+ pytest-html==4.0.2
49
48
  pytest-metadata==3.1.1
50
49
  pytest-ordering==0.6
51
50
  pytest-rerunfailures==14.0;python_version<"3.9"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.33.3"
2
+ __version__ = "4.33.5"
@@ -120,7 +120,7 @@ def main():
120
120
 
121
121
  data = []
122
122
  data.append("[pytest]")
123
- data.append("addopts = --capture=no -p no:cacheprovider")
123
+ data.append("addopts = --capture=tee-sys -p no:cacheprovider")
124
124
  data.append("norecursedirs = .* build dist recordings temp assets")
125
125
  data.append("filterwarnings =")
126
126
  data.append(" ignore::pytest.PytestWarning")
@@ -259,6 +259,7 @@ def main():
259
259
  data.append("report_archives")
260
260
  data.append("archived_reports")
261
261
  data.append("html_report.html")
262
+ data.append("last_report.html")
262
263
  data.append("report.html")
263
264
  data.append("report.xml")
264
265
  data.append("dashboard.html")
@@ -97,6 +97,13 @@ def log_d(message):
97
97
  print(message)
98
98
 
99
99
 
100
+ def make_writable(file_path):
101
+ # Set permissions to: "If you can read it, you can write it."
102
+ mode = os.stat(file_path).st_mode
103
+ mode |= (mode & 0o444) >> 1 # copy R bits to W
104
+ os.chmod(file_path, mode)
105
+
106
+
100
107
  def make_executable(file_path):
101
108
  # Set permissions to: "If you can read it, you can execute it."
102
109
  mode = os.stat(file_path).st_mode
@@ -810,66 +817,84 @@ def verify_pyautogui_has_a_headed_browser(driver):
810
817
  )
811
818
 
812
819
 
820
+ def __install_pyautogui_if_missing():
821
+ try:
822
+ import pyautogui
823
+ with suppress(Exception):
824
+ use_pyautogui_ver = constants.PyAutoGUI.VER
825
+ if pyautogui.__version__ != use_pyautogui_ver:
826
+ del pyautogui
827
+ shared_utils.pip_install(
828
+ "pyautogui", version=use_pyautogui_ver
829
+ )
830
+ import pyautogui
831
+ except Exception:
832
+ print("\nPyAutoGUI required! Installing now...")
833
+ shared_utils.pip_install(
834
+ "pyautogui", version=constants.PyAutoGUI.VER
835
+ )
836
+ try:
837
+ import pyautogui
838
+ except Exception:
839
+ if (
840
+ IS_LINUX
841
+ and hasattr(sb_config, "xvfb")
842
+ and hasattr(sb_config, "headed")
843
+ and hasattr(sb_config, "headless")
844
+ and hasattr(sb_config, "headless2")
845
+ and (not sb_config.headed or sb_config.xvfb)
846
+ and not (sb_config.headless or sb_config.headless2)
847
+ ):
848
+ from sbvirtualdisplay import Display
849
+ xvfb_width = 1366
850
+ xvfb_height = 768
851
+ if (
852
+ hasattr(sb_config, "_xvfb_width")
853
+ and sb_config._xvfb_width
854
+ and isinstance(sb_config._xvfb_width, int)
855
+ and hasattr(sb_config, "_xvfb_height")
856
+ and sb_config._xvfb_height
857
+ and isinstance(sb_config._xvfb_height, int)
858
+ ):
859
+ xvfb_width = sb_config._xvfb_width
860
+ xvfb_height = sb_config._xvfb_height
861
+ if xvfb_width < 1024:
862
+ xvfb_width = 1024
863
+ sb_config._xvfb_width = xvfb_width
864
+ if xvfb_height < 768:
865
+ xvfb_height = 768
866
+ sb_config._xvfb_height = xvfb_height
867
+ with suppress(Exception):
868
+ xvfb_display = Display(
869
+ visible=True,
870
+ size=(xvfb_width, xvfb_height),
871
+ backend="xvfb",
872
+ use_xauth=True,
873
+ )
874
+ xvfb_display.start()
875
+
876
+
813
877
  def install_pyautogui_if_missing(driver):
814
878
  verify_pyautogui_has_a_headed_browser(driver)
815
879
  pip_find_lock = fasteners.InterProcessLock(
816
880
  constants.PipInstall.FINDLOCK
817
881
  )
818
- with pip_find_lock: # Prevent issues with multiple processes
882
+ try:
883
+ with pip_find_lock:
884
+ pass
885
+ except Exception:
886
+ # Need write permissions
887
+ with suppress(Exception):
888
+ make_writable(constants.PipInstall.FINDLOCK)
819
889
  try:
820
- import pyautogui
821
- with suppress(Exception):
822
- use_pyautogui_ver = constants.PyAutoGUI.VER
823
- if pyautogui.__version__ != use_pyautogui_ver:
824
- del pyautogui
825
- shared_utils.pip_install(
826
- "pyautogui", version=use_pyautogui_ver
827
- )
828
- import pyautogui
890
+ with pip_find_lock:
891
+ pass
829
892
  except Exception:
830
- print("\nPyAutoGUI required! Installing now...")
831
- shared_utils.pip_install(
832
- "pyautogui", version=constants.PyAutoGUI.VER
833
- )
834
- try:
835
- import pyautogui
836
- except Exception:
837
- if (
838
- IS_LINUX
839
- and hasattr(sb_config, "xvfb")
840
- and hasattr(sb_config, "headed")
841
- and hasattr(sb_config, "headless")
842
- and hasattr(sb_config, "headless2")
843
- and (not sb_config.headed or sb_config.xvfb)
844
- and not (sb_config.headless or sb_config.headless2)
845
- ):
846
- from sbvirtualdisplay import Display
847
- xvfb_width = 1366
848
- xvfb_height = 768
849
- if (
850
- hasattr(sb_config, "_xvfb_width")
851
- and sb_config._xvfb_width
852
- and isinstance(sb_config._xvfb_width, int)
853
- and hasattr(sb_config, "_xvfb_height")
854
- and sb_config._xvfb_height
855
- and isinstance(sb_config._xvfb_height, int)
856
- ):
857
- xvfb_width = sb_config._xvfb_width
858
- xvfb_height = sb_config._xvfb_height
859
- if xvfb_width < 1024:
860
- xvfb_width = 1024
861
- sb_config._xvfb_width = xvfb_width
862
- if xvfb_height < 768:
863
- xvfb_height = 768
864
- sb_config._xvfb_height = xvfb_height
865
- with suppress(Exception):
866
- xvfb_display = Display(
867
- visible=True,
868
- size=(xvfb_width, xvfb_height),
869
- backend="xvfb",
870
- use_xauth=True,
871
- )
872
- xvfb_display.start()
893
+ # Since missing permissions, skip the locks
894
+ __install_pyautogui_if_missing()
895
+ return
896
+ with pip_find_lock: # Prevent issues with multiple processes
897
+ __install_pyautogui_if_missing()
873
898
 
874
899
 
875
900
  def get_configured_pyautogui(pyautogui_copy):
@@ -13974,84 +13974,103 @@ class BaseCase(unittest.TestCase):
13974
13974
  self.headless_active = True
13975
13975
  sb_config.headless_active = True
13976
13976
 
13977
+ def __activate_virtual_display(self):
13978
+ if self.undetectable and not (self.headless or self.headless2):
13979
+ from sbvirtualdisplay import Display
13980
+ import Xlib.display
13981
+ try:
13982
+ if not self._xvfb_width:
13983
+ self._xvfb_width = 1366
13984
+ if not self._xvfb_height:
13985
+ self._xvfb_height = 768
13986
+ self._xvfb_display = Display(
13987
+ visible=True,
13988
+ size=(self._xvfb_width, self._xvfb_height),
13989
+ backend="xvfb",
13990
+ use_xauth=True,
13991
+ )
13992
+ self._xvfb_display.start()
13993
+ if "DISPLAY" not in os.environ.keys():
13994
+ print(
13995
+ "\nX11 display failed! Will use regular xvfb!"
13996
+ )
13997
+ self.__activate_standard_virtual_display()
13998
+ except Exception as e:
13999
+ if hasattr(e, "msg"):
14000
+ print("\n" + str(e.msg))
14001
+ else:
14002
+ print(e)
14003
+ print("\nX11 display failed! Will use regular xvfb!")
14004
+ self.__activate_standard_virtual_display()
14005
+ return
14006
+ pyautogui_is_installed = False
14007
+ try:
14008
+ import pyautogui
14009
+ with suppress(Exception):
14010
+ use_pyautogui_ver = constants.PyAutoGUI.VER
14011
+ if pyautogui.__version__ != use_pyautogui_ver:
14012
+ del pyautogui # To get newer ver
14013
+ shared_utils.pip_install(
14014
+ "pyautogui", version=use_pyautogui_ver
14015
+ )
14016
+ import pyautogui
14017
+ pyautogui_is_installed = True
14018
+ except Exception:
14019
+ message = (
14020
+ "PyAutoGUI is required for UC Mode on Linux! "
14021
+ "Installing now..."
14022
+ )
14023
+ print("\n" + message)
14024
+ shared_utils.pip_install(
14025
+ "pyautogui", version=constants.PyAutoGUI.VER
14026
+ )
14027
+ import pyautogui
14028
+ pyautogui_is_installed = True
14029
+ if (
14030
+ pyautogui_is_installed
14031
+ and hasattr(pyautogui, "_pyautogui_x11")
14032
+ ):
14033
+ try:
14034
+ pyautogui._pyautogui_x11._display = (
14035
+ Xlib.display.Display(os.environ['DISPLAY'])
14036
+ )
14037
+ sb_config._pyautogui_x11_display = (
14038
+ pyautogui._pyautogui_x11._display
14039
+ )
14040
+ except Exception as e:
14041
+ if hasattr(e, "msg"):
14042
+ print("\n" + str(e.msg))
14043
+ else:
14044
+ print(e)
14045
+ else:
14046
+ self.__activate_standard_virtual_display()
14047
+
13977
14048
  def __activate_virtual_display_as_needed(self):
13978
14049
  """This is only needed on Linux.
13979
14050
  The "--xvfb" arg is still useful, as it prevents headless mode,
13980
14051
  which is the default mode on Linux unless using another arg."""
13981
14052
  if "linux" in sys.platform and (not self.headed or self.xvfb):
13982
- from sbvirtualdisplay import Display
13983
14053
  pip_find_lock = fasteners.InterProcessLock(
13984
14054
  constants.PipInstall.FINDLOCK
13985
14055
  )
14056
+ try:
14057
+ with pip_find_lock:
14058
+ pass
14059
+ except Exception:
14060
+ # Need write permissions
14061
+ with suppress(Exception):
14062
+ mode = os.stat(constants.PipInstall.FINDLOCK).st_mode
14063
+ mode |= (mode & 0o444) >> 1 # copy R bits to W
14064
+ os.chmod(constants.PipInstall.FINDLOCK, mode)
14065
+ try:
14066
+ with pip_find_lock:
14067
+ pass
14068
+ except Exception:
14069
+ # Since missing permissions, skip the locks
14070
+ self.__activate_virtual_display()
14071
+ return
13986
14072
  with pip_find_lock: # Prevent issues with multiple processes
13987
- if self.undetectable and not (self.headless or self.headless2):
13988
- import Xlib.display
13989
- try:
13990
- if not self._xvfb_width:
13991
- self._xvfb_width = 1366
13992
- if not self._xvfb_height:
13993
- self._xvfb_height = 768
13994
- self._xvfb_display = Display(
13995
- visible=True,
13996
- size=(self._xvfb_width, self._xvfb_height),
13997
- backend="xvfb",
13998
- use_xauth=True,
13999
- )
14000
- self._xvfb_display.start()
14001
- if "DISPLAY" not in os.environ.keys():
14002
- print(
14003
- "\nX11 display failed! Will use regular xvfb!"
14004
- )
14005
- self.__activate_standard_virtual_display()
14006
- except Exception as e:
14007
- if hasattr(e, "msg"):
14008
- print("\n" + str(e.msg))
14009
- else:
14010
- print(e)
14011
- print("\nX11 display failed! Will use regular xvfb!")
14012
- self.__activate_standard_virtual_display()
14013
- return
14014
- pyautogui_is_installed = False
14015
- try:
14016
- import pyautogui
14017
- with suppress(Exception):
14018
- use_pyautogui_ver = constants.PyAutoGUI.VER
14019
- if pyautogui.__version__ != use_pyautogui_ver:
14020
- del pyautogui # To get newer ver
14021
- shared_utils.pip_install(
14022
- "pyautogui", version=use_pyautogui_ver
14023
- )
14024
- import pyautogui
14025
- pyautogui_is_installed = True
14026
- except Exception:
14027
- message = (
14028
- "PyAutoGUI is required for UC Mode on Linux! "
14029
- "Installing now..."
14030
- )
14031
- print("\n" + message)
14032
- shared_utils.pip_install(
14033
- "pyautogui", version=constants.PyAutoGUI.VER
14034
- )
14035
- import pyautogui
14036
- pyautogui_is_installed = True
14037
- if (
14038
- pyautogui_is_installed
14039
- and hasattr(pyautogui, "_pyautogui_x11")
14040
- ):
14041
- try:
14042
- pyautogui._pyautogui_x11._display = (
14043
- Xlib.display.Display(os.environ['DISPLAY'])
14044
- )
14045
- sb_config._pyautogui_x11_display = (
14046
- pyautogui._pyautogui_x11._display
14047
- )
14048
- except Exception as e:
14049
- if hasattr(e, "msg"):
14050
- print("\n" + str(e.msg))
14051
- else:
14052
- print(e)
14053
- else:
14054
- self.__activate_standard_virtual_display()
14073
+ self.__activate_virtual_display()
14055
14074
 
14056
14075
  def __ad_block_as_needed(self):
14057
14076
  """This is an internal method for handling ad-blocking.
@@ -17,6 +17,7 @@ if sys.version_info >= (3, 11):
17
17
  python3_11_or_newer = True
18
18
  py311_patch2 = constants.PatchPy311.PATCH
19
19
  sys_argv = sys.argv
20
+ full_time = None
20
21
  pytest_plugins = ["pytester"] # Adds the "testdir" fixture
21
22
 
22
23
 
@@ -1708,6 +1709,7 @@ def pytest_configure(config):
1708
1709
  sb_config._saved_dashboard_pie = None # Copy of pie chart for html report
1709
1710
  sb_config._dash_final_summary = None # Dash status to add to html report
1710
1711
  sb_config._html_report_name = None # The name of the pytest html report
1712
+ sb_config._html_report_copy = None # The copy of the pytest html report
1711
1713
 
1712
1714
  arg_join = " ".join(sys_argv)
1713
1715
  if (
@@ -1741,6 +1743,7 @@ def pytest_configure(config):
1741
1743
  if sb_config.dashboard:
1742
1744
  if sb_config._html_report_name == "dashboard.html":
1743
1745
  sb_config._dash_is_html_report = True
1746
+ sb_config._html_report_copy = "last_report.html"
1744
1747
 
1745
1748
  # Recorder Mode does not support multi-threaded / multi-process runs.
1746
1749
  if sb_config.recorder_mode and sb_config._multithreaded:
@@ -2038,6 +2041,7 @@ def pytest_runtest_teardown(item):
2038
2041
  if (
2039
2042
  "-s" in sys_argv
2040
2043
  or "--capture=no" in sys_argv
2044
+ or "--capture=tee-sys" in sys_argv
2041
2045
  or (
2042
2046
  hasattr(sb_config.pytest_config, "invocation_params")
2043
2047
  and (
@@ -2045,6 +2049,9 @@ def pytest_runtest_teardown(item):
2045
2049
  or "--capture=no" in (
2046
2050
  sb_config.pytest_config.invocation_params.args
2047
2051
  )
2052
+ or "--capture=tee-sys" in (
2053
+ sb_config.pytest_config.invocation_params.args
2054
+ )
2048
2055
  )
2049
2056
  )
2050
2057
  ):
@@ -2053,6 +2060,10 @@ def pytest_runtest_teardown(item):
2053
2060
  sys.stdout.write("\n=> Fail Page: %s\n" % sb_config._fail_page)
2054
2061
 
2055
2062
 
2063
+ def pytest_html_duration_format(duration):
2064
+ return "%.2f" % duration
2065
+
2066
+
2056
2067
  def pytest_sessionfinish(session):
2057
2068
  pass
2058
2069
 
@@ -2103,9 +2114,11 @@ def pytest_terminal_summary(terminalreporter):
2103
2114
  )
2104
2115
 
2105
2116
 
2106
- def _perform_pytest_unconfigure_():
2117
+ def _perform_pytest_unconfigure_(config):
2107
2118
  from seleniumbase.core import proxy_helper
2108
2119
 
2120
+ reporter = config.pluginmanager.get_plugin("terminalreporter")
2121
+ duration = time.time() - reporter._sessionstarttime
2109
2122
  if (
2110
2123
  (hasattr(sb_config, "multi_proxy") and not sb_config.multi_proxy)
2111
2124
  or not hasattr(sb_config, "multi_proxy")
@@ -2133,6 +2146,69 @@ def _perform_pytest_unconfigure_():
2133
2146
  log_helper.clear_empty_logs()
2134
2147
  # Dashboard post-processing: Disable time-based refresh and stamp complete
2135
2148
  if not hasattr(sb_config, "dashboard") or not sb_config.dashboard:
2149
+ html_report_path = None
2150
+ the_html_r = None
2151
+ abs_path = os.path.abspath(".")
2152
+ if sb_config._html_report_name:
2153
+ html_report_path = os.path.join(
2154
+ abs_path, sb_config._html_report_name
2155
+ )
2156
+ if sb_config._html_report_copy:
2157
+ html_report_path_copy = os.path.join(
2158
+ abs_path, sb_config._html_report_copy
2159
+ )
2160
+ if (
2161
+ sb_config._using_html_report
2162
+ and html_report_path
2163
+ and os.path.exists(html_report_path)
2164
+ ):
2165
+ with open(html_report_path, "r", encoding="utf-8") as f:
2166
+ the_html_r = f.read()
2167
+ assets_chunk = "if (assets.length === 1) {"
2168
+ remove_media = "container.classList.remove('media-container')"
2169
+ rm_n_left = '<div class="media-container__nav--left"><</div>'
2170
+ rm_n_right = '<div class="media-container__nav--right">></div>'
2171
+ the_html_r = the_html_r.replace(
2172
+ assets_chunk,
2173
+ "%s %s" % (assets_chunk, remove_media),
2174
+ )
2175
+ the_html_r = the_html_r.replace(rm_n_left, "")
2176
+ the_html_r = the_html_r.replace(rm_n_right, "")
2177
+ the_html_r = the_html_r.replace("<ul>$", "$")
2178
+ the_html_r = the_html_r.replace("}<ul>", "}")
2179
+ the_html_r = the_html_r.replace(
2180
+ "<li>${val}</li>", "${val},&nbsp;&nbsp;"
2181
+ )
2182
+ the_html_r = the_html_r.replace(
2183
+ "<div>${value}</div>", "<span>${value}</span"
2184
+ )
2185
+ ph_link = '<a href="https://pypi.python.org/pypi/pytest-html">'
2186
+ sb_link = (
2187
+ '<a href="https://github.com/seleniumbase/SeleniumBase">'
2188
+ 'SeleniumBase</a>'
2189
+ )
2190
+ the_html_r = the_html_r.replace(
2191
+ ph_link, "%s and %s" % (sb_link, ph_link)
2192
+ )
2193
+ the_html_r = the_html_r.replace(
2194
+ "mediaName.innerText", "//mediaName.innerText"
2195
+ )
2196
+ the_html_r = the_html_r.replace(
2197
+ "counter.innerText", "//counter.innerText"
2198
+ )
2199
+ run_count = '<p class="run-count">'
2200
+ run_c_loc = the_html_r.find(run_count)
2201
+ rc_loc = the_html_r.find(" took ", run_c_loc)
2202
+ end_rc_loc = the_html_r.find(".</p>", rc_loc)
2203
+ run_time = "%.2f" % duration
2204
+ new_time = " ran in %s seconds" % run_time
2205
+ the_html_r = (
2206
+ the_html_r[:rc_loc] + new_time + the_html_r[end_rc_loc:]
2207
+ )
2208
+ with open(html_report_path, "w", encoding="utf-8") as f:
2209
+ f.write(the_html_r) # Finalize the HTML report
2210
+ with open(html_report_path_copy, "w", encoding="utf-8") as f:
2211
+ f.write(the_html_r) # Finalize the HTML report
2136
2212
  # Done with "pytest_unconfigure" unless using the Dashboard
2137
2213
  return
2138
2214
  stamp = ""
@@ -2220,6 +2296,10 @@ def _perform_pytest_unconfigure_():
2220
2296
  html_report_path = os.path.join(
2221
2297
  abs_path, sb_config._html_report_name
2222
2298
  )
2299
+ if sb_config._html_report_copy:
2300
+ html_report_path_copy = os.path.join(
2301
+ abs_path, sb_config._html_report_copy
2302
+ )
2223
2303
  if (
2224
2304
  sb_config._using_html_report
2225
2305
  and html_report_path
@@ -2237,7 +2317,7 @@ def _perform_pytest_unconfigure_():
2237
2317
  elif "\\" in h_r_name and h_r_name.endswith(".html"):
2238
2318
  h_r_name = h_r_name.split("\\")[-1]
2239
2319
  the_html_r = the_html_r.replace(
2240
- "<h1>%s</h1>" % h_r_name,
2320
+ '<h1 id="title">%s</h1>' % h_r_name,
2241
2321
  sb_config._saved_dashboard_pie,
2242
2322
  )
2243
2323
  the_html_r = the_html_r.replace(
@@ -2247,8 +2327,51 @@ def _perform_pytest_unconfigure_():
2247
2327
  )
2248
2328
  if sb_config._dash_final_summary:
2249
2329
  the_html_r += sb_config._dash_final_summary
2330
+ assets_chunk = "if (assets.length === 1) {"
2331
+ remove_media = "container.classList.remove('media-container')"
2332
+ rm_n_left = '<div class="media-container__nav--left"><</div>'
2333
+ rm_n_right = '<div class="media-container__nav--right">></div>'
2334
+ the_html_r = the_html_r.replace(
2335
+ assets_chunk,
2336
+ "%s %s" % (assets_chunk, remove_media),
2337
+ )
2338
+ the_html_r = the_html_r.replace(rm_n_left, "")
2339
+ the_html_r = the_html_r.replace(rm_n_right, "")
2340
+ the_html_r = the_html_r.replace("<ul>$", "$")
2341
+ the_html_r = the_html_r.replace("}<ul>", "}")
2342
+ the_html_r = the_html_r.replace(
2343
+ "<li>${val}</li>", "${val},&nbsp;&nbsp;"
2344
+ )
2345
+ the_html_r = the_html_r.replace(
2346
+ "<div>${value}</div>", "<span>${value}</span"
2347
+ )
2348
+ ph_link = '<a href="https://pypi.python.org/pypi/pytest-html">'
2349
+ sb_link = (
2350
+ '<a href="https://github.com/seleniumbase/SeleniumBase">'
2351
+ 'SeleniumBase</a>'
2352
+ )
2353
+ the_html_r = the_html_r.replace(
2354
+ ph_link, "%s and %s" % (sb_link, ph_link)
2355
+ )
2356
+ the_html_r = the_html_r.replace(
2357
+ "mediaName.innerText", "//mediaName.innerText"
2358
+ )
2359
+ the_html_r = the_html_r.replace(
2360
+ "counter.innerText", "//counter.innerText"
2361
+ )
2362
+ run_count = '<p class="run-count">'
2363
+ run_c_loc = the_html_r.find(run_count)
2364
+ rc_loc = the_html_r.find(" took ", run_c_loc)
2365
+ end_rc_loc = the_html_r.find(".</p>", rc_loc)
2366
+ run_time = "%.2f" % duration
2367
+ new_time = " ran in %s seconds" % run_time
2368
+ the_html_r = (
2369
+ the_html_r[:rc_loc] + new_time + the_html_r[end_rc_loc:]
2370
+ )
2250
2371
  with open(html_report_path, "w", encoding="utf-8") as f:
2251
2372
  f.write(the_html_r) # Finalize the HTML report
2373
+ with open(html_report_path_copy, "w", encoding="utf-8") as f:
2374
+ f.write(the_html_r) # Finalize the HTML report
2252
2375
  except KeyboardInterrupt:
2253
2376
  pass
2254
2377
  except Exception:
@@ -2281,19 +2404,19 @@ def pytest_unconfigure(config):
2281
2404
  with open(dashboard_path, "w", encoding="utf-8") as f:
2282
2405
  f.write(sb_config._dash_html)
2283
2406
  # Dashboard Multithreaded
2284
- _perform_pytest_unconfigure_()
2407
+ _perform_pytest_unconfigure_(config)
2285
2408
  return
2286
2409
  else:
2287
2410
  # Dash Lock is missing
2288
- _perform_pytest_unconfigure_()
2411
+ _perform_pytest_unconfigure_(config)
2289
2412
  return
2290
2413
  with dash_lock:
2291
2414
  # Multi-threaded tests
2292
- _perform_pytest_unconfigure_()
2415
+ _perform_pytest_unconfigure_(config)
2293
2416
  return
2294
2417
  else:
2295
2418
  # Single-threaded tests
2296
- _perform_pytest_unconfigure_()
2419
+ _perform_pytest_unconfigure_(config)
2297
2420
  return
2298
2421
 
2299
2422
 
@@ -2442,7 +2565,7 @@ def pytest_runtest_makereport(item, call):
2442
2565
  return
2443
2566
  extra = getattr(report, "extra", [])
2444
2567
  if len(extra_report) > 1 and extra_report[1]["content"]:
2445
- report.extra = extra + extra_report
2568
+ report.extras = extra + extra_report
2446
2569
  if sb_config._dash_is_html_report:
2447
2570
  # If the Dashboard URL is the same as the HTML Report URL,
2448
2571
  # have the html report refresh back to a dashboard on update.
@@ -2450,4 +2573,4 @@ def pytest_runtest_makereport(item, call):
2450
2573
  '<script type="text/javascript" src="%s">'
2451
2574
  "</script>" % constants.Dashboard.LIVE_JS
2452
2575
  )
2453
- report.extra.append(pytest_html.extras.html(refresh_updates))
2576
+ report.extras.append(pytest_html.extras.html(refresh_updates))