seleniumbase 4.16.1__tar.gz → 4.16.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/PKG-INFO +35 -35
  2. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/README.md +34 -34
  3. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/ReadMe.md +5 -5
  4. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/hack_the_planet.py +2 -2
  5. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_browser_launcher.py +3 -3
  6. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_driver_context.py +3 -3
  7. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/uc_cdp_events.py +8 -9
  8. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/verify_undetected.py +3 -1
  9. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/behave_gui.md +3 -3
  10. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/commander.md +3 -3
  11. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/customizing_test_runs.md +4 -4
  12. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/demo_mode.md +4 -4
  13. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/method_summary.md +37 -28
  14. seleniumbase-4.16.3/help_docs/mysql_installation.md +94 -0
  15. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/syntax_formats.md +53 -55
  16. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/ReadMe.md +5 -5
  17. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs.yml +0 -1
  18. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/requirements.txt +6 -5
  19. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/requirements.txt +10 -10
  20. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/sbase/steps.py +65 -0
  21. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/__version__.py +1 -1
  22. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/behave/behave_helper.py +29 -1
  23. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/exceptions.py +6 -1
  24. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_install.py +20 -4
  25. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/browser_launcher.py +63 -8
  26. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/recorder_helper.py +29 -1
  27. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/base_case.py +238 -10
  28. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/page_actions.py +131 -4
  29. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/shared_utils.py +5 -0
  30. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/words.py +15 -1
  31. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/chinese.py +4 -0
  32. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/dutch.py +4 -0
  33. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/french.py +4 -0
  34. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/italian.py +4 -0
  35. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/japanese.py +4 -0
  36. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/korean.py +4 -0
  37. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/master_dict.py +25 -0
  38. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/portuguese.py +4 -0
  39. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/russian.py +4 -0
  40. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/spanish.py +4 -0
  41. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/patcher.py +5 -0
  42. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/PKG-INFO +35 -35
  43. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/SOURCES.txt +0 -2
  44. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/requires.txt +10 -10
  45. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/setup.py +10 -10
  46. seleniumbase-4.16.1/.travis.yml +0 -42
  47. seleniumbase-4.16.1/help_docs/mysql_installation.md +0 -62
  48. seleniumbase-4.16.1/mkdocs_build/index.html +0 -13
  49. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/Workflows.md +0 -0
  50. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/pages.yml +0 -0
  51. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-nightly-mac.yml +0 -0
  52. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-nightly-ubuntu.yml +0 -0
  53. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-nightly-windows.yml +0 -0
  54. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-package-legacy.yml +0 -0
  55. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-package.yml +0 -0
  56. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.gitignore +0 -0
  57. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/CHANGELOG.md +0 -0
  58. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/CNAME +0 -0
  59. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/CODE_OF_CONDUCT.md +0 -0
  60. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/CONTRIBUTING.md +0 -0
  61. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/Dockerfile +0 -0
  62. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/LICENSE +0 -0
  63. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/MANIFEST.in +0 -0
  64. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/SECURITY.md +0 -0
  65. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/_config.yml +0 -0
  66. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/azure-pipelines.yml +0 -0
  67. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/ReadMe.md +0 -0
  68. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/__init__.py +0 -0
  69. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/basic_test.py +0 -0
  70. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/__init__.py +0 -0
  71. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/behave.ini +0 -0
  72. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/__init__.py +0 -0
  73. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/behave.ini +0 -0
  74. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/calculator.feature +0 -0
  75. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/environment.py +0 -0
  76. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/fail_page.feature +0 -0
  77. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/realworld.feature +0 -0
  78. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/__init__.py +0 -0
  79. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/calculator.py +0 -0
  80. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/fail_page.py +0 -0
  81. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/imported.py +0 -0
  82. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
  83. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/swag_labs.feature +0 -0
  84. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/ReadMe.md +0 -0
  85. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/__init__.py +0 -0
  86. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/base_test_case.py +0 -0
  87. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/boilerplate_test.py +0 -0
  88. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/classic_obj_test.py +0 -0
  89. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/page_objects.py +0 -0
  90. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/__init__.py +0 -0
  91. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
  92. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
  93. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/file_parsing/qa_login_example.txt +0 -0
  94. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/file_parsing/staging_login_example.txt +0 -0
  95. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/google_objects.py +0 -0
  96. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/google_test.py +0 -0
  97. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/sb_swag_test.py +0 -0
  98. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/swag_labs_test.py +0 -0
  99. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/test_page_objects.py +0 -0
  100. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/sb_fixture_test.py +0 -0
  101. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/ReadMe.md +0 -0
  102. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/mac_cap_file.py +0 -0
  103. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/sample_cap_file_BS.py +0 -0
  104. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/sample_cap_file_SL.py +0 -0
  105. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/selenoid_cap_file.py +0 -0
  106. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/win10_cap_file.py +0 -0
  107. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/basic_test.MyTestClass.test_basics.md +0 -0
  108. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/my_first_test.MyTestClass.test_swag_labs.md +0 -0
  109. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/shadow_root_test.ShadowRootTest.test_shadow_root.md +0 -0
  110. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_assert_elements.ListAssertTests.test_assert_list_of_elements.md +0 -0
  111. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_calculator.CalculatorTests.test_6_times_7_plus_12_equals_54.md +0 -0
  112. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_demo_site.DemoSiteTests.test_demo_site.md +0 -0
  113. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_login.SwagLabsLoginTests.test_swag_labs_login.md +0 -0
  114. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_mfa_login.TestMFALogin.test_mfa_login.md +0 -0
  115. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_summary.md +0 -0
  116. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/ReadMe.md +0 -0
  117. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/chart_presentation.py +0 -0
  118. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/my_chart.py +0 -0
  119. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/pie_charts.py +0 -0
  120. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_area_chart.py +0 -0
  121. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_display_chart.py +0 -0
  122. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_line_chart.py +0 -0
  123. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_multi_series.py +0 -0
  124. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_save_chart.py +0 -0
  125. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/coffee_cart_tests.py +0 -0
  126. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/custom_settings.py +0 -0
  127. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/desktop_apps/ReadMe.md +0 -0
  128. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/desktop_apps/recorder.py +0 -0
  129. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/dialog_boxes/ReadMe.md +0 -0
  130. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/dialog_boxes/dialog_box_tour.py +0 -0
  131. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/edge_test.py +0 -0
  132. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_config.cfg +0 -0
  133. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_logs/ReadMe.md +0 -0
  134. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_logs/basic_test_info.txt +0 -0
  135. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_logs/page_source.html +0 -0
  136. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_logs/screenshot.png +0 -0
  137. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/github_test.py +0 -0
  138. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/gui_test_runner.py +0 -0
  139. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/handle_alert_test.py +0 -0
  140. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/iframe_tests.py +0 -0
  141. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/locale_code_test.py +0 -0
  142. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/ReadMe.md +0 -0
  143. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/__init__.py +0 -0
  144. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/basic_masterqa_test_0.py +0 -0
  145. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/masterqa_test_1.py +0 -0
  146. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/pytest.ini +0 -0
  147. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/__init__.py +0 -0
  148. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/ReadMe.md +0 -0
  149. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/__init__.py +0 -0
  150. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/example_spec.js +0 -0
  151. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/example_test.py +0 -0
  152. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/input_spec.js +0 -0
  153. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/input_test.py +0 -0
  154. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/mat_paginator_spec.js +0 -0
  155. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/mat_paginator_test.py +0 -0
  156. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/ReadMe.md +0 -0
  157. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/__init__.py +0 -0
  158. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
  159. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
  160. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/messy_raw.py +0 -0
  161. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/pytest.ini +0 -0
  162. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/refined_raw.py +0 -0
  163. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/simple_sbase.py +0 -0
  164. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/my_first_test.py +0 -0
  165. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/nth_child_test.py +0 -0
  166. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/__init__.py +0 -0
  167. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/demo_page.html +0 -0
  168. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/load_html_test.py +0 -0
  169. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/test_demo_page.py +0 -0
  170. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/test_handle_alerts.py +0 -0
  171. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/test_request_fixture.py +0 -0
  172. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/test_user_agent.py +0 -0
  173. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/old_wordle_script.py +0 -0
  174. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/parameterized_test.py +0 -0
  175. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/performance_test.py +0 -0
  176. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/ReadMe.md +0 -0
  177. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/core_presentation.py +0 -0
  178. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/edge_presentation.py +0 -0
  179. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/fundamentals.py +0 -0
  180. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/my_presentation.py +0 -0
  181. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/py_virtual_envs.py +0 -0
  182. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/proxy_test.py +0 -0
  183. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/pytest.ini +0 -0
  184. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/rate_limiting_test.py +0 -0
  185. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_call.py +0 -0
  186. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_file_call.py +0 -0
  187. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_main_call.py +0 -0
  188. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_parameter_script.py +0 -0
  189. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_sb.py +0 -0
  190. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_test_scripts.py +0 -0
  191. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/setup.cfg +0 -0
  192. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/shadow_root_test.py +0 -0
  193. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/swag_labs_user_tests.py +0 -0
  194. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_apple_site.py +0 -0
  195. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_assert_elements.py +0 -0
  196. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_calculator.py +0 -0
  197. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_canvas.py +0 -0
  198. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_checkboxes.py +0 -0
  199. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_chinese_pdf.py +0 -0
  200. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_chromedriver.py +0 -0
  201. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_coffee_cart.py +0 -0
  202. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_console_logging.py +0 -0
  203. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_contains_selector.py +0 -0
  204. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_cycle_elements.py +0 -0
  205. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_decryption.py +0 -0
  206. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_deferred_asserts.py +0 -0
  207. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_demo_site.py +0 -0
  208. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_detect_404s.py +0 -0
  209. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_docs_site.py +0 -0
  210. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_double_click.py +0 -0
  211. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_download_files.py +0 -0
  212. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_download_images.py +0 -0
  213. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_drag_and_drop.py +0 -0
  214. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_error_page.py +0 -0
  215. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_event_firing.py +0 -0
  216. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_fail.py +0 -0
  217. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_geolocation.py +0 -0
  218. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_get_locale_code.py +0 -0
  219. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_get_pdf_text.py +0 -0
  220. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_get_user_agent.py +0 -0
  221. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_hack_search.py +0 -0
  222. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_image_saving.py +0 -0
  223. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_inspect_html.py +0 -0
  224. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_login.py +0 -0
  225. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_markers.py +0 -0
  226. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_mfa_login.py +0 -0
  227. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_multiple_drivers.py +0 -0
  228. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_null.py +0 -0
  229. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_override_driver.py +0 -0
  230. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_override_sb_fixture.py +0 -0
  231. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_parse_soup.py +0 -0
  232. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_pdf_asserts.py +0 -0
  233. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_pytest_parametrize.py +0 -0
  234. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_repeat_tests.py +0 -0
  235. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_request_sb_fixture.py +0 -0
  236. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_save_screenshots.py +0 -0
  237. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_sb_fixture.py +0 -0
  238. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_scrape_bing.py +0 -0
  239. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_select_options.py +0 -0
  240. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_shadow_dom.py +0 -0
  241. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_show_file_choosers.py +0 -0
  242. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_skype_site.py +0 -0
  243. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_suite.py +0 -0
  244. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_swag_labs.py +0 -0
  245. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_tinymce.py +0 -0
  246. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_todomvc.py +0 -0
  247. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_url_asserts.py +0 -0
  248. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_usefixtures.py +0 -0
  249. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_verify_chromedriver.py +0 -0
  250. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_window_switching.py +0 -0
  251. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_xfail.py +0 -0
  252. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_xkcd.py +0 -0
  253. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/time_limit_test.py +0 -0
  254. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/ReadMe.md +0 -0
  255. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/bootstrap_google_tour.py +0 -0
  256. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
  257. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/driverjs_maps_tour.py +0 -0
  258. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/google_tour.py +0 -0
  259. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/hopscotch_google_tour.py +0 -0
  260. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/introjs_google_tour.py +0 -0
  261. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/maps_introjs_tour.py +0 -0
  262. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/octocat_tour.py +0 -0
  263. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/shepherd_google_tour.py +0 -0
  264. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/xkcd_tour.py +0 -0
  265. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/ReadMe.md +0 -0
  266. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/chinese_test_1.py +0 -0
  267. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/dutch_test_1.py +0 -0
  268. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/english_test_1.py +0 -0
  269. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/french_test_1.py +0 -0
  270. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/italian_test_1.py +0 -0
  271. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/japanese_test_1.py +0 -0
  272. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/korean_test_1.py +0 -0
  273. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/portuguese_test_1.py +0 -0
  274. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/pytest.ini +0 -0
  275. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/russian_test_1.py +0 -0
  276. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/spanish_test_1.py +0 -0
  277. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/unit_tests/ReadMe.md +0 -0
  278. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/unit_tests/verify_framework.py +0 -0
  279. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/upgrade_chromedriver.py +0 -0
  280. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/upload_file_test.py +0 -0
  281. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/user_agent_test.py +0 -0
  282. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/ReadMe.md +0 -0
  283. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/__init__.py +0 -0
  284. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/layout_test.VisualLayoutTests.test_applitools_layout_change.md +0 -0
  285. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/python_home_test.VisualLayoutTests.test_python_home_layout_change.md +0 -0
  286. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_applitools_change.md +0 -0
  287. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_xkcd_logo_change.md +0 -0
  288. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/test_layout_fail.VisualLayout_FixtureTests.test_python_home_change.md +0 -0
  289. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/xkcd_visual_test.VisualLayoutTests.test_xkcd_layout_change.md +0 -0
  290. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/layout_test.py +0 -0
  291. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/python_home_test.py +0 -0
  292. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/test_layout_fail.py +0 -0
  293. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/xkcd_visual_test.py +0 -0
  294. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/wordle_test.py +0 -0
  295. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/xpath_test.py +0 -0
  296. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/youtube_search_test.py +0 -0
  297. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/ReadMe.md +0 -0
  298. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/case_plans.md +0 -0
  299. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/chinese.md +0 -0
  300. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/desired_capabilities.md +0 -0
  301. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/features_list.md +0 -0
  302. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/happy_customers.md +0 -0
  303. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/hidden_files_info.md +0 -0
  304. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/how_it_works.md +0 -0
  305. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/html_inspector.md +0 -0
  306. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/install.md +0 -0
  307. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/install_python_pip_git.md +0 -0
  308. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/js_package_manager.md +0 -0
  309. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/locale_codes.md +0 -0
  310. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/mobile_testing.md +0 -0
  311. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/recorder_mode.md +0 -0
  312. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/shadow_dom.md +0 -0
  313. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/thank_you.md +0 -0
  314. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/translations.md +0 -0
  315. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/useful_grep_commands.md +0 -0
  316. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/using_safari_driver.md +0 -0
  317. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/verify_webdriver.md +0 -0
  318. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/virtualenv_instructions.md +0 -0
  319. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/webdriver_installation.md +0 -0
  320. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/install.sh +0 -0
  321. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/__init__.py +0 -0
  322. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/azure/azure_pipelines/ReadMe.md +0 -0
  323. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/azure/jenkins/ReadMe.md +0 -0
  324. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/behave.ini +0 -0
  325. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/__init__.py +0 -0
  326. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/behave.ini +0 -0
  327. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/calculator.feature +0 -0
  328. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/environment.py +0 -0
  329. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/fail_page.feature +0 -0
  330. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/realworld.feature +0 -0
  331. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/__init__.py +0 -0
  332. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/calculator.py +0 -0
  333. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/fail_page.py +0 -0
  334. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/real_world.py +0 -0
  335. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/swag_labs.py +0 -0
  336. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/swag_labs.feature +0 -0
  337. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/brython/ReadMe.md +0 -0
  338. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/brython/index.html +0 -0
  339. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/brython/index.py +0 -0
  340. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/brython/library.html +0 -0
  341. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/ReadMe.md +0 -0
  342. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/docker-entrypoint.sh +0 -0
  343. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/docker_config.cfg +0 -0
  344. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/run_docker_test_in_chrome.sh +0 -0
  345. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/run_docker_test_in_firefox.sh +0 -0
  346. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/github/ReadMe.md +0 -0
  347. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/github/workflows/ReadMe.md +0 -0
  348. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/github/workflows/extras.md +0 -0
  349. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/google_cloud/ReadMe.md +0 -0
  350. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/katalon/ReadMe.md +0 -0
  351. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/Linuxfile.sh +0 -0
  352. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/ReadMe.md +0 -0
  353. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/Xvfb_launcher.sh +0 -0
  354. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/jenkins_permissions.sh +0 -0
  355. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/tomcat_permissions.sh +0 -0
  356. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/ReadMe.md +0 -0
  357. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/__init__.py +0 -0
  358. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/index.html +0 -0
  359. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/my_first_test.py +0 -0
  360. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/npm-shrinkwrap.json +0 -0
  361. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/package.json +0 -0
  362. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/server.js +0 -0
  363. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/test_demo_site.py +0 -0
  364. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/selenium_grid/ReadMe.md +0 -0
  365. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/selenium_ide/ReadMe.md +0 -0
  366. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/ReadMe.txt +0 -0
  367. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/docs_instructions.txt +0 -0
  368. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/dash_pie.png +0 -0
  369. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/dash_pie_2.png +0 -0
  370. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/dash_pie_3.png +0 -0
  371. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/favicon.ico +0 -0
  372. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/grad_logo.png +0 -0
  373. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/green_icon.png +0 -0
  374. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/green_logo.png +0 -0
  375. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/green_logo2.png +0 -0
  376. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/green_logo3.png +0 -0
  377. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo3.png +0 -0
  378. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo3a.png +0 -0
  379. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo3b.png +0 -0
  380. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo3c.png +0 -0
  381. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo4.png +0 -0
  382. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo5.png +0 -0
  383. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo6.png +0 -0
  384. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo7.png +0 -0
  385. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/sb_icon.png +0 -0
  386. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/sb_logo_10.png +0 -0
  387. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/sb_logo_7.png +0 -0
  388. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/side_by_side.png +0 -0
  389. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_facebook.svg +0 -0
  390. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_github.svg +0 -0
  391. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_gitter.svg +0 -0
  392. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_instagram.svg +0 -0
  393. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_twitter.svg +0 -0
  394. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/prepare.py +0 -0
  395. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/pytest.ini +0 -0
  396. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/sbase/ReadMe.txt +0 -0
  397. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/sbase/__init__.py +0 -0
  398. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/sbase/__main__.py +0 -0
  399. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/ReadMe.md +0 -0
  400. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/__init__.py +0 -0
  401. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/__main__.py +0 -0
  402. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/behave/__init__.py +0 -0
  403. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/behave/behave_sb.py +0 -0
  404. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/behave/steps.py +0 -0
  405. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/ReadMe.md +0 -0
  406. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/__init__.py +0 -0
  407. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/decorators.py +0 -0
  408. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/encryption.py +0 -0
  409. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/obfuscate.py +0 -0
  410. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/unobfuscate.py +0 -0
  411. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/config/__init__.py +0 -0
  412. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/config/ad_block_list.py +0 -0
  413. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/config/proxy_list.py +0 -0
  414. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/config/settings.py +0 -0
  415. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/ReadMe.md +0 -0
  416. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/__init__.py +0 -0
  417. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/logo_helper.py +0 -0
  418. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/rich_helper.py +0 -0
  419. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/run.py +0 -0
  420. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  421. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  422. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_commander.py +0 -0
  423. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  424. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  425. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  426. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  427. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  428. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  429. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_print.py +0 -0
  430. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  431. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/__init__.py +0 -0
  432. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/application_manager.py +0 -0
  433. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/capabilities_parser.py +0 -0
  434. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/colored_traceback.py +0 -0
  435. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/create_db_tables.sql +0 -0
  436. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/detect_b_ver.py +0 -0
  437. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/download_helper.py +0 -0
  438. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/encoded_images.py +0 -0
  439. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/jqc_helper.py +0 -0
  440. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/log_helper.py +0 -0
  441. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/mysql.py +0 -0
  442. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/proxy_helper.py +0 -0
  443. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/report_helper.py +0 -0
  444. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/s3_manager.py +0 -0
  445. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/session_helper.py +0 -0
  446. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/settings_parser.py +0 -0
  447. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/style_sheet.py +0 -0
  448. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/testcase_manager.py +0 -0
  449. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/tour_helper.py +0 -0
  450. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/visual_helper.py +0 -0
  451. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/drivers/ReadMe.md +0 -0
  452. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/drivers/__init__.py +0 -0
  453. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/ReadMe.md +0 -0
  454. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/__init__.py +0 -0
  455. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/ad_block.zip +0 -0
  456. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/disable_csp.zip +0 -0
  457. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/recorder.zip +0 -0
  458. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/sbase_ext.zip +0 -0
  459. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/__init__.py +0 -0
  460. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/constants.py +0 -0
  461. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  462. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/errors.py +0 -0
  463. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/js_utils.py +0 -0
  464. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/page_utils.py +0 -0
  465. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/unittest_helper.py +0 -0
  466. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  467. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/js_code/__init__.py +0 -0
  468. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/js_code/active_css_js.py +0 -0
  469. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/js_code/live_js.py +0 -0
  470. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/js_code/recorder_js.py +0 -0
  471. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/masterqa/ReadMe.md +0 -0
  472. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/masterqa/__init__.py +0 -0
  473. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/masterqa/master_qa.py +0 -0
  474. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/__init__.py +0 -0
  475. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/base_plugin.py +0 -0
  476. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/basic_test_info.py +0 -0
  477. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  478. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/driver_manager.py +0 -0
  479. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/page_source.py +0 -0
  480. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/pytest_plugin.py +0 -0
  481. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  482. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/sb_manager.py +0 -0
  483. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/screen_shots.py +0 -0
  484. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/selenium_plugin.py +0 -0
  485. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/resources/ReadMe.md +0 -0
  486. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/resources/__init__.py +0 -0
  487. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/resources/favicon.ico +0 -0
  488. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/__init__.py +0 -0
  489. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/translator.py +0 -0
  490. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/__init__.py +0 -0
  491. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/cdp.py +0 -0
  492. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/dprocess.py +0 -0
  493. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/options.py +0 -0
  494. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/reactor.py +0 -0
  495. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/webelement.py +0 -0
  496. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/__init__.py +0 -0
  497. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/ReadMe.md +0 -0
  498. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  499. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  500. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  501. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  502. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  503. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  504. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  505. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  506. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  507. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  508. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  509. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_ide/ReadMe.md +0 -0
  510. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  511. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  512. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/dependency_links.txt +0 -0
  513. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/entry_points.txt +0 -0
  514. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/top_level.txt +0 -0
  515. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/setup.cfg +0 -0
  516. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/virtualenv_install.sh +0 -0
  517. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/win_install.bat +0 -0
  518. {seleniumbase-4.16.1 → seleniumbase-4.16.3}/win_virtualenv.bat +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.16.1
3
+ Version: 4.16.3
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
@@ -121,7 +121,7 @@ License-File: LICENSE
121
121
  <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_p3.png" alt="SeleniumBase" title="SeleniumBase" width="232" /></a></p>
122
122
 
123
123
  <blockquote>
124
- <p dir="auto"><strong>Jump to:</strong></p>
124
+ <p dir="auto"><strong>Explore the README:</strong></p>
125
125
  <ul dir="auto">
126
126
  <li><a href="#install_seleniumbase" ><strong>Get Started / Installation</strong></a></li>
127
127
  <li><a href="#basic_example_and_usage"><strong>Basic Example / Usage</strong></a></li>
@@ -139,7 +139,7 @@ License-File: LICENSE
139
139
 
140
140
  <a id="multiple_examples"></a>
141
141
 
142
- <p align="left"><b>Example:</b> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">test_demo_site.py</a> from <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank">./examples/</a> (Uses <code>--chrome</code> by default)</p>
142
+ <p align="left"><b>Example:</b> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">test_demo_site.py</a> from <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank">./examples/</a> (Uses <code translate="no">--chrome</code> by default)</p>
143
143
 
144
144
  ```bash
145
145
  cd examples/
@@ -159,7 +159,7 @@ cd examples/
159
159
  pytest test_coffee_cart.py --demo
160
160
  ```
161
161
 
162
- <p>(<code>--demo</code> mode slows down tests and highlights actions)</p>
162
+ <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
163
163
 
164
164
  <p align="left"><a href="https://seleniumbase.io/coffee/" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/coffee_cart.gif" width="480" alt="SeleniumBase Coffee Cart Test" title="SeleniumBase Coffee Cart Test" /></a></p>
165
165
 
@@ -193,29 +193,29 @@ class CoffeeCartTest(BaseCase):
193
193
  <summary> ▶️ How is <b>SeleniumBase</b> different from raw Selenium? (<b>click to expand</b>)</summary>
194
194
  <div>
195
195
 
196
- <p>💡 SeleniumBase is a Python framework for browser automation and testing. SeleniumBase uses <a href="https://www.w3.org/TR/webdriver2/#endpoints" target="_blank">Selenium/WebDriver</a> APIs, and incorporates test-runners such as <code>pytest</code>, <code>pynose</code>, and <code>behave</code> to provide organized structure, test discovery, test execution, test state (<i>eg. passed, failed, or skipped</i>), and command-line options for changing default settings (<i>such as choosing the browser to use</i>). With raw Selenium, you would need to set up your own options-parser for configuring tests from the command-line.</p>
196
+ <p>💡 SeleniumBase is a Python framework for browser automation and testing. SeleniumBase uses <a href="https://www.w3.org/TR/webdriver2/#endpoints" target="_blank">Selenium/WebDriver</a> APIs, and incorporates test-runners such as <code translate="no">pytest</code>, <code translate="no">pynose</code>, and <code translate="no">behave</code> to provide organized structure, test discovery, test execution, test state (<i>eg. passed, failed, or skipped</i>), and command-line options for changing default settings (<i>such as choosing the browser to use</i>). With raw Selenium, you would need to set up your own options-parser for configuring tests from the command-line.</p>
197
197
 
198
- <p>💡 With raw Selenium, commands that use selectors need to specify the type of selector (eg. <code>"css selector", "button#myButton"</code>). With SeleniumBase, there's auto-detection between CSS Selectors and XPath, which means you don't need to specify the type of selector in your commands (<i>but optionally you could</i>).</p>
198
+ <p>💡 With raw Selenium, commands that use selectors need to specify the type of selector (eg. <code translate="no">"css selector", "button#myButton"</code>). With SeleniumBase, there's auto-detection between CSS Selectors and XPath, which means you don't need to specify the type of selector in your commands (<i>but optionally you could</i>).</p>
199
199
 
200
- <p>💡 SeleniumBase methods often perform multiple actions in a single method call. For example, <code>self.type(selector,text)</code> does the following:<br />1. Waits for the element to be visible.<br />2. Waits for the element to be interactive.<br />3. Clears the text field.<br />4. Types in the new text.<br />5. Presses Enter/Submit if the text ends in <code>"\n"</code>.<br />With raw Selenium, those actions require multiple method calls.</p>
200
+ <p>💡 SeleniumBase methods often perform multiple actions in a single method call. For example, <code translate="no">self.type(selector,text)</code> does the following:<br />1. Waits for the element to be visible.<br />2. Waits for the element to be interactive.<br />3. Clears the text field.<br />4. Types in the new text.<br />5. Presses Enter/Submit if the text ends in <code translate="no">"\n"</code>.<br />With raw Selenium, those actions require multiple method calls.</p>
201
201
 
202
202
  <p>💡 SeleniumBase uses default timeout values when not set:<br />
203
- ✅<code>self.click("button")</code><br />
203
+ ✅<code translate="no">self.click("button")</code><br />
204
204
  With raw Selenium, methods would fail instantly (<i>by default</i>) if an element needed more time to load:<br />
205
- ❌<code>self.driver.find_element(by="css selector", value="button").click()</code><br />
205
+ ❌<code translate="no">self.driver.find_element(by="css selector", value="button").click()</code><br />
206
206
  (Reliable code is better than unreliable code.)</p>
207
207
 
208
208
  <p>💡 SeleniumBase lets you change the explicit timeout values of methods:<br />
209
- ✅<code>self.click("button",timeout=10)</code><br />
209
+ ✅<code translate="no">self.click("button",timeout=10)</code><br />
210
210
  With raw Selenium, that requires more code:<br />
211
- ❌<code>WebDriverWait(driver,10).until(EC.element_to_be_clickable("css selector", "button")).click()</code><br />
211
+ ❌<code translate="no">WebDriverWait(driver,10).until(EC.element_to_be_clickable("css selector", "button")).click()</code><br />
212
212
  (Simple code is better than complex code.)</p>
213
213
 
214
214
  <p>💡 SeleniumBase gives you clean error output when a test fails. With raw Selenium, error messages can get very messy.</p>
215
215
 
216
- <p>💡 SeleniumBase gives you the option to generate a dashboard and reports for tests. It also saves screenshots from failing tests to the <code>./latest_logs/</code> folder. Raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">Selenium</a> does not have these options out-of-the-box.</p>
216
+ <p>💡 SeleniumBase gives you the option to generate a dashboard and reports for tests. It also saves screenshots from failing tests to the <code translate="no">./latest_logs/</code> folder. Raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">Selenium</a> does not have these options out-of-the-box.</p>
217
217
 
218
- <p>💡 SeleniumBase includes desktop GUI apps for running tests, such as <b>SeleniumBase Commander</b> for <code>pytest</code> and <b>SeleniumBase Behave GUI for <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md"><code>behave</code></a>.</b></p>
218
+ <p>💡 SeleniumBase includes desktop GUI apps for running tests, such as <b>SeleniumBase Commander</b> for <code translate="no">pytest</code> and <b>SeleniumBase Behave GUI for <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md"><code translate="no">behave</code></a>.</b></p>
219
219
 
220
220
  <p>💡 SeleniumBase has its own Recorder / Test Generator that can create tests from manual browser actions. SeleniumBase also includes other useful tools and console scripts for getting things done quickly. (<i>See the documentation for more details!</i>)</p>
221
221
 
@@ -246,7 +246,7 @@ class TestMFALogin(BaseCase):
246
246
  self.save_screenshot_to_logs()
247
247
  ```
248
248
 
249
- <p align="left">📗📝 An example test with the <b><code>sb</code></b> <code>pytest</code> fixture. Runs with <b><a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b>.</p>
249
+ <p align="left">📗📝 An example test with the <b><code translate="no">sb</code></b> <code translate="no">pytest</code> fixture. Runs with <b><a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b>.</p>
250
250
 
251
251
  ```python
252
252
  def test_mfa_login(sb):
@@ -260,7 +260,7 @@ def test_mfa_login(sb):
260
260
  sb.save_screenshot_to_logs()
261
261
  ```
262
262
 
263
- <p align="left">📙📝 An example test with the <b><code>SB</code></b> Context Manager. Runs with pure <b><code>python</code></b>.</p>
263
+ <p align="left">📙📝 An example test with the <b><code translate="no">SB</code></b> Context Manager. Runs with pure <b><code translate="no">python</code></b>.</p>
264
264
 
265
265
  ```python
266
266
  from seleniumbase import SB
@@ -278,7 +278,7 @@ with SB() as sb: # By default, browser="chrome" if not set.
278
278
  sb.assert_exact_text("You have been signed out!", "#top_message")
279
279
  ```
280
280
 
281
- <p align="left">📕📝 An example test with <b>behave-BDD</b> <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> structure. Runs with <b><code>behave</code></b>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">Learn more</a>)</p>
281
+ <p align="left">📕📝 An example test with <b>behave-BDD</b> <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> structure. Runs with <b><code translate="no">behave</code></b>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">Learn more</a>)</p>
282
282
 
283
283
  ```gherkin
284
284
  Feature: SeleniumBase scenarios for the RealWorld App
@@ -522,7 +522,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
522
522
  self.type("input", "dogs\n") # (The "\n" presses ENTER)
523
523
  ```
524
524
 
525
- Most SeleniumBase scripts can be run with <code>pytest</code>, <code>pynose</code>, or pure <code>python</code>. Not all test runners can run all test formats. For example, tests that use the ``sb`` pytest fixture can only be run with ``pytest``. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
525
+ Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the ``sb`` pytest fixture can only be run with ``pytest``. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
526
526
 
527
527
  ```bash
528
528
  pytest coffee_cart_tests.py --rs
@@ -539,20 +539,20 @@ behave realworld.feature
539
539
  behave calculator.feature -D rs -D dashboard
540
540
  ```
541
541
 
542
- <p>✅ <code>pytest</code> includes automatic test discovery. If you don't specify a specific file or folder to run, <code>pytest</code> will automatically search through all subdirectories for tests to run based on the following criteria:</p>
542
+ <p>✅ <code translate="no">pytest</code> includes automatic test discovery. If you don't specify a specific file or folder to run, <code translate="no">pytest</code> will automatically search through all subdirectories for tests to run based on the following criteria:</p>
543
543
 
544
544
  * Python files that start with ``test_`` or end with ``_test.py``.
545
545
  * Python methods that start with ``test_``.
546
546
 
547
547
  With a SeleniumBase [pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/pytest.ini) file present, you can modify default discovery settings. The Python class name can be anything because ``seleniumbase.BaseCase`` inherits ``unittest.TestCase`` to trigger autodiscovery.
548
548
 
549
- <p>✅ You can do a pre-flight check to see which tests would get discovered by <code>pytest</code> before the real flight:</p>
549
+ <p>✅ You can do a pre-flight check to see which tests would get discovered by <code translate="no">pytest</code> before the real flight:</p>
550
550
 
551
551
  ```bash
552
552
  pytest --collect-only -q
553
553
  ```
554
554
 
555
- <p>✅ You can be more specific when calling <code>pytest</code> or <code>pynose</code> on a file:</p>
555
+ <p>✅ You can be more specific when calling <code translate="no">pytest</code> or <code translate="no">pynose</code> on a file:</p>
556
556
 
557
557
  ```bash
558
558
  pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
@@ -560,7 +560,7 @@ pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
560
560
  pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
561
561
  ```
562
562
 
563
- <p>✅ No More Flaky Tests! SeleniumBase methods automatically wait for page elements to finish loading before interacting with them (<i>up to a timeout limit</i>). This means <b>you no longer need random <span><code>time.sleep()</code></span> statements</b> in your scripts.</p>
563
+ <p>✅ No More Flaky Tests! SeleniumBase methods automatically wait for page elements to finish loading before interacting with them (<i>up to a timeout limit</i>). This means <b>you no longer need random <span><code translate="no">time.sleep()</code></span> statements</b> in your scripts.</p>
564
564
  <img src="https://img.shields.io/badge/Flaky%20Tests%3F-%20NO%21-11BBDD.svg" alt="NO MORE FLAKY TESTS!" />
565
565
 
566
566
  ✅ SeleniumBase supports all major browsers and operating systems:
@@ -621,7 +621,7 @@ pytest test_coffee_cart.py --trace
621
621
  <h2>🔵 Command-line Options:</h2>
622
622
 
623
623
  <a id="pytest_options"></a>
624
- ✅ Here are some useful command-line options that come with <code>pytest</code>:
624
+ ✅ Here are some useful command-line options that come with <code translate="no">pytest</code>:
625
625
 
626
626
  ```bash
627
627
  -v # Verbose mode. Prints the full name of each test and shows more details.
@@ -638,7 +638,7 @@ pytest test_coffee_cart.py --trace
638
638
  ```
639
639
 
640
640
  <a id="new_pytest_options"></a>
641
- ✅ SeleniumBase provides additional <code>pytest</code> command-line options for tests:
641
+ ✅ SeleniumBase provides additional <code translate="no">pytest</code> command-line options for tests:
642
642
 
643
643
  ```bash
644
644
  --browser=BROWSER # (The web browser to use. Default: "chrome".)
@@ -984,7 +984,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
984
984
 
985
985
  <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Handling Pop-Up / Pop Up Alerts:</h3>
986
986
 
987
- 🔵 <code>self.accept_alert()</code> automatically waits for and accepts alert pop-ups. <code>self.dismiss_alert()</code> automatically waits for and dismisses alert pop-ups. On occasion, some methods like <code>self.click(SELECTOR)</code> might dismiss a pop-up on its own because they call JavaScript to make sure that the <code>readyState</code> of the page is <code>complete</code> before advancing. If you're trying to accept a pop-up that got dismissed this way, use this workaround: Call <code>self.find_element(SELECTOR).click()</code> instead, (which will let the pop-up remain on the screen), and then use <code>self.accept_alert()</code> to accept the pop-up (<a href="https://github.com/seleniumbase/SeleniumBase/issues/600#issuecomment-647270426">more on that here</a>). If pop-ups are intermittent, wrap code in a try/except block.
987
+ 🔵 <code translate="no">self.accept_alert()</code> automatically waits for and accepts alert pop-ups. <code translate="no">self.dismiss_alert()</code> automatically waits for and dismisses alert pop-ups. On occasion, some methods like <code translate="no">self.click(SELECTOR)</code> might dismiss a pop-up on its own because they call JavaScript to make sure that the <code translate="no">readyState</code> of the page is <code translate="no">complete</code> before advancing. If you're trying to accept a pop-up that got dismissed this way, use this workaround: Call <code translate="no">self.find_element(SELECTOR).click()</code> instead, (which will let the pop-up remain on the screen), and then use <code translate="no">self.accept_alert()</code> to accept the pop-up (<a href="https://github.com/seleniumbase/SeleniumBase/issues/600#issuecomment-647270426">more on that here</a>). If pop-ups are intermittent, wrap code in a try/except block.
988
988
 
989
989
 
990
990
  <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Building Guided Tours for Websites:</h3>
@@ -1010,7 +1010,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
1010
1010
 
1011
1011
  <li>If you're using the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mysql_installation.md">SeleniumBase MySQL feature</a> to save results from tests running on a server machine, you can install <a href="https://dev.mysql.com/downloads/tools/workbench/">MySQL Workbench</a> to help you read & write from your DB more easily.</li>
1012
1012
 
1013
- <li>If you're using AWS, you can set up an <a href="https://aws.amazon.com/s3/" target="_blank">Amazon S3</a> account for saving log files and screenshots from your tests. To activate this feature, modify <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py">settings.py</a> with connection details in the S3 section, and add <code>--with-s3-logging</code> on the command-line when running your tests.</li>
1013
+ <li>If you're using AWS, you can set up an <a href="https://aws.amazon.com/s3/" target="_blank">Amazon S3</a> account for saving log files and screenshots from your tests. To activate this feature, modify <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py">settings.py</a> with connection details in the S3 section, and add <code translate="no">--with-s3-logging</code> on the command-line when running your tests.</li>
1014
1014
  </ul>
1015
1015
 
1016
1016
  Here's an example of running tests with some additional features enabled:
@@ -1041,7 +1041,7 @@ self.get_current_url() # This method returns the current page URL.
1041
1041
  self.get_page_source() # This method returns the current page source.
1042
1042
  ```
1043
1043
 
1044
- <b>ProTip™:</b> You can use the <code>self.get_page_source()</code> method with Python's <code>find()</code> command to parse through HTML to find something specific. (For more advanced parsing, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_parse_soup.py">BeautifulSoup example</a>.)
1044
+ <b>ProTip™:</b> You can use the <code translate="no">self.get_page_source()</code> method with Python's <code translate="no">find()</code> command to parse through HTML to find something specific. (For more advanced parsing, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_parse_soup.py">BeautifulSoup example</a>.)
1045
1045
 
1046
1046
  ```python
1047
1047
  source = self.get_page_source()
@@ -1062,13 +1062,13 @@ self.click("div#my_id")
1062
1062
 
1063
1063
  🔵 **Typing Text:**
1064
1064
 
1065
- <code>self.type(selector, text)</code> # updates the text from the specified element with the specified value. An exception is raised if the element is missing or if the text field is not editable. Example:
1065
+ <code translate="no">self.type(selector, text)</code> # updates the text from the specified element with the specified value. An exception is raised if the element is missing or if the text field is not editable. Example:
1066
1066
 
1067
1067
  ```python
1068
1068
  self.type("input#id_value", "2012")
1069
1069
  ```
1070
1070
 
1071
- You can also use <code>self.add_text()</code> or the <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a> <code>.send_keys()</code> command, but those won't clear the text box first if there's already text inside.
1071
+ You can also use <code translate="no">self.add_text()</code> or the <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a> <code translate="no">.send_keys()</code> command, but those won't clear the text box first if there's already text inside.
1072
1072
 
1073
1073
  🔵 **Getting the text from an element on a page:**
1074
1074
 
@@ -1170,7 +1170,7 @@ if self.is_text_visible("You Shall Not Pass!", "h1"):
1170
1170
 
1171
1171
  <div></div>
1172
1172
  <details>
1173
- <summary> ▶️ Click for a longer example of <code>is_text_visible():</code></summary>
1173
+ <summary> ▶️ Click for a longer example of <code translate="no">is_text_visible():</code></summary>
1174
1174
 
1175
1175
  ```python
1176
1176
  def get_mirror_universe_captain_picard_superbowl_ad(superbowl_year):
@@ -1210,7 +1210,7 @@ if self.is_link_text_visible("Stop! Hammer time!"):
1210
1210
 
1211
1211
  <h3>🔵 Switching Tabs:</h3>
1212
1212
 
1213
- <p>If your test opens up a new tab/window, you can switch to it. (SeleniumBase automatically switches to new tabs that don't open to <code>about:blank</code> URLs.)</p>
1213
+ <p>If your test opens up a new tab/window, you can switch to it. (SeleniumBase automatically switches to new tabs that don't open to <code translate="no">about:blank</code> URLs.)</p>
1214
1214
 
1215
1215
  ```python
1216
1216
  self.switch_to_window(1) # This switches to the new tab (0 is the first one)
@@ -1299,7 +1299,7 @@ self.execute_script('''document.body.innerHTML = \"%s\"''' % referral_link)
1299
1299
  self.click("a.analytics") # Clicks the generated button
1300
1300
  ```
1301
1301
 
1302
- (Due to popular demand, this traffic generation example has been included in SeleniumBase with the <code>self.generate_referral(start_page, end_page)</code> and the <code>self.generate_traffic(start_page, end_page, loops)</code> methods.)
1302
+ (Due to popular demand, this traffic generation example has been included in SeleniumBase with the <code translate="no">self.generate_referral(start_page, end_page)</code> and the <code translate="no">self.generate_traffic(start_page, end_page, loops)</code> methods.)
1303
1303
 
1304
1304
  </details>
1305
1305
 
@@ -1324,8 +1324,8 @@ class MyTestClass(BaseCase):
1324
1324
  self.process_deferred_asserts()
1325
1325
  ```
1326
1326
 
1327
- <code>deferred_assert_element()</code> and <code>deferred_assert_text()</code> will save any exceptions that would be raised.
1328
- To flush out all the failed deferred asserts into a single exception, make sure to call <code>self.process_deferred_asserts()</code> at the end of your test method. If your test hits multiple pages, you can call <code>self.process_deferred_asserts()</code> before navigating to a new page so that the screenshot from your log files matches the URL where the deferred asserts were made.
1327
+ <code translate="no">deferred_assert_element()</code> and <code translate="no">deferred_assert_text()</code> will save any exceptions that would be raised.
1328
+ To flush out all the failed deferred asserts into a single exception, make sure to call <code translate="no">self.process_deferred_asserts()</code> at the end of your test method. If your test hits multiple pages, you can call <code translate="no">self.process_deferred_asserts()</code> before navigating to a new page so that the screenshot from your log files matches the URL where the deferred asserts were made.
1329
1329
 
1330
1330
  <h3>🔵 How to access raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a>:</h3>
1331
1331
 
@@ -1341,13 +1341,13 @@ self.driver.find_elements("partial link text", "GitHub")
1341
1341
 
1342
1342
  <h3>🔵 How to retry failing tests automatically:</h3>
1343
1343
 
1344
- <p>You can use <code>pytest --reruns=NUM</code> to retry failing tests that many times. Add <code>--reruns-delay=SECONDS</code> to wait that many seconds between retries. Example:</p>
1344
+ <p>You can use <code translate="no">pytest --reruns=NUM</code> to retry failing tests that many times. Add <code translate="no">--reruns-delay=SECONDS</code> to wait that many seconds between retries. Example:</p>
1345
1345
 
1346
1346
  ```bash
1347
1347
  pytest --reruns=1 --reruns-delay=1
1348
1348
  ```
1349
1349
 
1350
- <p>You can use the <code>@retry_on_exception()</code> decorator to retry failing methods. (First import: <code>from seleniumbase import decorators</code>). To learn more about SeleniumBase decorators, <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/common">click here</a>.</p>
1350
+ <p>You can use the <code translate="no">@retry_on_exception()</code> decorator to retry failing methods. (First import: <code translate="no">from seleniumbase import decorators</code>). To learn more about SeleniumBase decorators, <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/common">click here</a>.</p>
1351
1351
 
1352
1352
  --------
1353
1353
 
@@ -60,7 +60,7 @@
60
60
  <p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_p3.png" alt="SeleniumBase" title="SeleniumBase" width="232" /></a></p>
61
61
 
62
62
  <blockquote>
63
- <p dir="auto"><strong>Jump to:</strong></p>
63
+ <p dir="auto"><strong>Explore the README:</strong></p>
64
64
  <ul dir="auto">
65
65
  <li><a href="#install_seleniumbase" ><strong>Get Started / Installation</strong></a></li>
66
66
  <li><a href="#basic_example_and_usage"><strong>Basic Example / Usage</strong></a></li>
@@ -78,7 +78,7 @@
78
78
 
79
79
  <a id="multiple_examples"></a>
80
80
 
81
- <p align="left"><b>Example:</b> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">test_demo_site.py</a> from <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank">./examples/</a> (Uses <code>--chrome</code> by default)</p>
81
+ <p align="left"><b>Example:</b> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">test_demo_site.py</a> from <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank">./examples/</a> (Uses <code translate="no">--chrome</code> by default)</p>
82
82
 
83
83
  ```bash
84
84
  cd examples/
@@ -98,7 +98,7 @@ cd examples/
98
98
  pytest test_coffee_cart.py --demo
99
99
  ```
100
100
 
101
- <p>(<code>--demo</code> mode slows down tests and highlights actions)</p>
101
+ <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
102
102
 
103
103
  <p align="left"><a href="https://seleniumbase.io/coffee/" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/coffee_cart.gif" width="480" alt="SeleniumBase Coffee Cart Test" title="SeleniumBase Coffee Cart Test" /></a></p>
104
104
 
@@ -132,29 +132,29 @@ class CoffeeCartTest(BaseCase):
132
132
  <summary> ▶️ How is <b>SeleniumBase</b> different from raw Selenium? (<b>click to expand</b>)</summary>
133
133
  <div>
134
134
 
135
- <p>💡 SeleniumBase is a Python framework for browser automation and testing. SeleniumBase uses <a href="https://www.w3.org/TR/webdriver2/#endpoints" target="_blank">Selenium/WebDriver</a> APIs, and incorporates test-runners such as <code>pytest</code>, <code>pynose</code>, and <code>behave</code> to provide organized structure, test discovery, test execution, test state (<i>eg. passed, failed, or skipped</i>), and command-line options for changing default settings (<i>such as choosing the browser to use</i>). With raw Selenium, you would need to set up your own options-parser for configuring tests from the command-line.</p>
135
+ <p>💡 SeleniumBase is a Python framework for browser automation and testing. SeleniumBase uses <a href="https://www.w3.org/TR/webdriver2/#endpoints" target="_blank">Selenium/WebDriver</a> APIs, and incorporates test-runners such as <code translate="no">pytest</code>, <code translate="no">pynose</code>, and <code translate="no">behave</code> to provide organized structure, test discovery, test execution, test state (<i>eg. passed, failed, or skipped</i>), and command-line options for changing default settings (<i>such as choosing the browser to use</i>). With raw Selenium, you would need to set up your own options-parser for configuring tests from the command-line.</p>
136
136
 
137
- <p>💡 With raw Selenium, commands that use selectors need to specify the type of selector (eg. <code>"css selector", "button#myButton"</code>). With SeleniumBase, there's auto-detection between CSS Selectors and XPath, which means you don't need to specify the type of selector in your commands (<i>but optionally you could</i>).</p>
137
+ <p>💡 With raw Selenium, commands that use selectors need to specify the type of selector (eg. <code translate="no">"css selector", "button#myButton"</code>). With SeleniumBase, there's auto-detection between CSS Selectors and XPath, which means you don't need to specify the type of selector in your commands (<i>but optionally you could</i>).</p>
138
138
 
139
- <p>💡 SeleniumBase methods often perform multiple actions in a single method call. For example, <code>self.type(selector,text)</code> does the following:<br />1. Waits for the element to be visible.<br />2. Waits for the element to be interactive.<br />3. Clears the text field.<br />4. Types in the new text.<br />5. Presses Enter/Submit if the text ends in <code>"\n"</code>.<br />With raw Selenium, those actions require multiple method calls.</p>
139
+ <p>💡 SeleniumBase methods often perform multiple actions in a single method call. For example, <code translate="no">self.type(selector,text)</code> does the following:<br />1. Waits for the element to be visible.<br />2. Waits for the element to be interactive.<br />3. Clears the text field.<br />4. Types in the new text.<br />5. Presses Enter/Submit if the text ends in <code translate="no">"\n"</code>.<br />With raw Selenium, those actions require multiple method calls.</p>
140
140
 
141
141
  <p>💡 SeleniumBase uses default timeout values when not set:<br />
142
- ✅<code>self.click("button")</code><br />
142
+ ✅<code translate="no">self.click("button")</code><br />
143
143
  With raw Selenium, methods would fail instantly (<i>by default</i>) if an element needed more time to load:<br />
144
- ❌<code>self.driver.find_element(by="css selector", value="button").click()</code><br />
144
+ ❌<code translate="no">self.driver.find_element(by="css selector", value="button").click()</code><br />
145
145
  (Reliable code is better than unreliable code.)</p>
146
146
 
147
147
  <p>💡 SeleniumBase lets you change the explicit timeout values of methods:<br />
148
- ✅<code>self.click("button",timeout=10)</code><br />
148
+ ✅<code translate="no">self.click("button",timeout=10)</code><br />
149
149
  With raw Selenium, that requires more code:<br />
150
- ❌<code>WebDriverWait(driver,10).until(EC.element_to_be_clickable("css selector", "button")).click()</code><br />
150
+ ❌<code translate="no">WebDriverWait(driver,10).until(EC.element_to_be_clickable("css selector", "button")).click()</code><br />
151
151
  (Simple code is better than complex code.)</p>
152
152
 
153
153
  <p>💡 SeleniumBase gives you clean error output when a test fails. With raw Selenium, error messages can get very messy.</p>
154
154
 
155
- <p>💡 SeleniumBase gives you the option to generate a dashboard and reports for tests. It also saves screenshots from failing tests to the <code>./latest_logs/</code> folder. Raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">Selenium</a> does not have these options out-of-the-box.</p>
155
+ <p>💡 SeleniumBase gives you the option to generate a dashboard and reports for tests. It also saves screenshots from failing tests to the <code translate="no">./latest_logs/</code> folder. Raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">Selenium</a> does not have these options out-of-the-box.</p>
156
156
 
157
- <p>💡 SeleniumBase includes desktop GUI apps for running tests, such as <b>SeleniumBase Commander</b> for <code>pytest</code> and <b>SeleniumBase Behave GUI for <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md"><code>behave</code></a>.</b></p>
157
+ <p>💡 SeleniumBase includes desktop GUI apps for running tests, such as <b>SeleniumBase Commander</b> for <code translate="no">pytest</code> and <b>SeleniumBase Behave GUI for <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md"><code translate="no">behave</code></a>.</b></p>
158
158
 
159
159
  <p>💡 SeleniumBase has its own Recorder / Test Generator that can create tests from manual browser actions. SeleniumBase also includes other useful tools and console scripts for getting things done quickly. (<i>See the documentation for more details!</i>)</p>
160
160
 
@@ -185,7 +185,7 @@ class TestMFALogin(BaseCase):
185
185
  self.save_screenshot_to_logs()
186
186
  ```
187
187
 
188
- <p align="left">📗📝 An example test with the <b><code>sb</code></b> <code>pytest</code> fixture. Runs with <b><a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b>.</p>
188
+ <p align="left">📗📝 An example test with the <b><code translate="no">sb</code></b> <code translate="no">pytest</code> fixture. Runs with <b><a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b>.</p>
189
189
 
190
190
  ```python
191
191
  def test_mfa_login(sb):
@@ -199,7 +199,7 @@ def test_mfa_login(sb):
199
199
  sb.save_screenshot_to_logs()
200
200
  ```
201
201
 
202
- <p align="left">📙📝 An example test with the <b><code>SB</code></b> Context Manager. Runs with pure <b><code>python</code></b>.</p>
202
+ <p align="left">📙📝 An example test with the <b><code translate="no">SB</code></b> Context Manager. Runs with pure <b><code translate="no">python</code></b>.</p>
203
203
 
204
204
  ```python
205
205
  from seleniumbase import SB
@@ -217,7 +217,7 @@ with SB() as sb: # By default, browser="chrome" if not set.
217
217
  sb.assert_exact_text("You have been signed out!", "#top_message")
218
218
  ```
219
219
 
220
- <p align="left">📕📝 An example test with <b>behave-BDD</b> <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> structure. Runs with <b><code>behave</code></b>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">Learn more</a>)</p>
220
+ <p align="left">📕📝 An example test with <b>behave-BDD</b> <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> structure. Runs with <b><code translate="no">behave</code></b>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">Learn more</a>)</p>
221
221
 
222
222
  ```gherkin
223
223
  Feature: SeleniumBase scenarios for the RealWorld App
@@ -461,7 +461,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
461
461
  self.type("input", "dogs\n") # (The "\n" presses ENTER)
462
462
  ```
463
463
 
464
- Most SeleniumBase scripts can be run with <code>pytest</code>, <code>pynose</code>, or pure <code>python</code>. Not all test runners can run all test formats. For example, tests that use the ``sb`` pytest fixture can only be run with ``pytest``. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
464
+ Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the ``sb`` pytest fixture can only be run with ``pytest``. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
465
465
 
466
466
  ```bash
467
467
  pytest coffee_cart_tests.py --rs
@@ -478,20 +478,20 @@ behave realworld.feature
478
478
  behave calculator.feature -D rs -D dashboard
479
479
  ```
480
480
 
481
- <p>✅ <code>pytest</code> includes automatic test discovery. If you don't specify a specific file or folder to run, <code>pytest</code> will automatically search through all subdirectories for tests to run based on the following criteria:</p>
481
+ <p>✅ <code translate="no">pytest</code> includes automatic test discovery. If you don't specify a specific file or folder to run, <code translate="no">pytest</code> will automatically search through all subdirectories for tests to run based on the following criteria:</p>
482
482
 
483
483
  * Python files that start with ``test_`` or end with ``_test.py``.
484
484
  * Python methods that start with ``test_``.
485
485
 
486
486
  With a SeleniumBase [pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/pytest.ini) file present, you can modify default discovery settings. The Python class name can be anything because ``seleniumbase.BaseCase`` inherits ``unittest.TestCase`` to trigger autodiscovery.
487
487
 
488
- <p>✅ You can do a pre-flight check to see which tests would get discovered by <code>pytest</code> before the real flight:</p>
488
+ <p>✅ You can do a pre-flight check to see which tests would get discovered by <code translate="no">pytest</code> before the real flight:</p>
489
489
 
490
490
  ```bash
491
491
  pytest --collect-only -q
492
492
  ```
493
493
 
494
- <p>✅ You can be more specific when calling <code>pytest</code> or <code>pynose</code> on a file:</p>
494
+ <p>✅ You can be more specific when calling <code translate="no">pytest</code> or <code translate="no">pynose</code> on a file:</p>
495
495
 
496
496
  ```bash
497
497
  pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
@@ -499,7 +499,7 @@ pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
499
499
  pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
500
500
  ```
501
501
 
502
- <p>✅ No More Flaky Tests! SeleniumBase methods automatically wait for page elements to finish loading before interacting with them (<i>up to a timeout limit</i>). This means <b>you no longer need random <span><code>time.sleep()</code></span> statements</b> in your scripts.</p>
502
+ <p>✅ No More Flaky Tests! SeleniumBase methods automatically wait for page elements to finish loading before interacting with them (<i>up to a timeout limit</i>). This means <b>you no longer need random <span><code translate="no">time.sleep()</code></span> statements</b> in your scripts.</p>
503
503
  <img src="https://img.shields.io/badge/Flaky%20Tests%3F-%20NO%21-11BBDD.svg" alt="NO MORE FLAKY TESTS!" />
504
504
 
505
505
  ✅ SeleniumBase supports all major browsers and operating systems:
@@ -560,7 +560,7 @@ pytest test_coffee_cart.py --trace
560
560
  <h2>🔵 Command-line Options:</h2>
561
561
 
562
562
  <a id="pytest_options"></a>
563
- ✅ Here are some useful command-line options that come with <code>pytest</code>:
563
+ ✅ Here are some useful command-line options that come with <code translate="no">pytest</code>:
564
564
 
565
565
  ```bash
566
566
  -v # Verbose mode. Prints the full name of each test and shows more details.
@@ -577,7 +577,7 @@ pytest test_coffee_cart.py --trace
577
577
  ```
578
578
 
579
579
  <a id="new_pytest_options"></a>
580
- ✅ SeleniumBase provides additional <code>pytest</code> command-line options for tests:
580
+ ✅ SeleniumBase provides additional <code translate="no">pytest</code> command-line options for tests:
581
581
 
582
582
  ```bash
583
583
  --browser=BROWSER # (The web browser to use. Default: "chrome".)
@@ -923,7 +923,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
923
923
 
924
924
  <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Handling Pop-Up / Pop Up Alerts:</h3>
925
925
 
926
- 🔵 <code>self.accept_alert()</code> automatically waits for and accepts alert pop-ups. <code>self.dismiss_alert()</code> automatically waits for and dismisses alert pop-ups. On occasion, some methods like <code>self.click(SELECTOR)</code> might dismiss a pop-up on its own because they call JavaScript to make sure that the <code>readyState</code> of the page is <code>complete</code> before advancing. If you're trying to accept a pop-up that got dismissed this way, use this workaround: Call <code>self.find_element(SELECTOR).click()</code> instead, (which will let the pop-up remain on the screen), and then use <code>self.accept_alert()</code> to accept the pop-up (<a href="https://github.com/seleniumbase/SeleniumBase/issues/600#issuecomment-647270426">more on that here</a>). If pop-ups are intermittent, wrap code in a try/except block.
926
+ 🔵 <code translate="no">self.accept_alert()</code> automatically waits for and accepts alert pop-ups. <code translate="no">self.dismiss_alert()</code> automatically waits for and dismisses alert pop-ups. On occasion, some methods like <code translate="no">self.click(SELECTOR)</code> might dismiss a pop-up on its own because they call JavaScript to make sure that the <code translate="no">readyState</code> of the page is <code translate="no">complete</code> before advancing. If you're trying to accept a pop-up that got dismissed this way, use this workaround: Call <code translate="no">self.find_element(SELECTOR).click()</code> instead, (which will let the pop-up remain on the screen), and then use <code translate="no">self.accept_alert()</code> to accept the pop-up (<a href="https://github.com/seleniumbase/SeleniumBase/issues/600#issuecomment-647270426">more on that here</a>). If pop-ups are intermittent, wrap code in a try/except block.
927
927
 
928
928
 
929
929
  <h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Building Guided Tours for Websites:</h3>
@@ -949,7 +949,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
949
949
 
950
950
  <li>If you're using the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mysql_installation.md">SeleniumBase MySQL feature</a> to save results from tests running on a server machine, you can install <a href="https://dev.mysql.com/downloads/tools/workbench/">MySQL Workbench</a> to help you read & write from your DB more easily.</li>
951
951
 
952
- <li>If you're using AWS, you can set up an <a href="https://aws.amazon.com/s3/" target="_blank">Amazon S3</a> account for saving log files and screenshots from your tests. To activate this feature, modify <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py">settings.py</a> with connection details in the S3 section, and add <code>--with-s3-logging</code> on the command-line when running your tests.</li>
952
+ <li>If you're using AWS, you can set up an <a href="https://aws.amazon.com/s3/" target="_blank">Amazon S3</a> account for saving log files and screenshots from your tests. To activate this feature, modify <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py">settings.py</a> with connection details in the S3 section, and add <code translate="no">--with-s3-logging</code> on the command-line when running your tests.</li>
953
953
  </ul>
954
954
 
955
955
  Here's an example of running tests with some additional features enabled:
@@ -980,7 +980,7 @@ self.get_current_url() # This method returns the current page URL.
980
980
  self.get_page_source() # This method returns the current page source.
981
981
  ```
982
982
 
983
- <b>ProTip™:</b> You can use the <code>self.get_page_source()</code> method with Python's <code>find()</code> command to parse through HTML to find something specific. (For more advanced parsing, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_parse_soup.py">BeautifulSoup example</a>.)
983
+ <b>ProTip™:</b> You can use the <code translate="no">self.get_page_source()</code> method with Python's <code translate="no">find()</code> command to parse through HTML to find something specific. (For more advanced parsing, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_parse_soup.py">BeautifulSoup example</a>.)
984
984
 
985
985
  ```python
986
986
  source = self.get_page_source()
@@ -1001,13 +1001,13 @@ self.click("div#my_id")
1001
1001
 
1002
1002
  🔵 **Typing Text:**
1003
1003
 
1004
- <code>self.type(selector, text)</code> # updates the text from the specified element with the specified value. An exception is raised if the element is missing or if the text field is not editable. Example:
1004
+ <code translate="no">self.type(selector, text)</code> # updates the text from the specified element with the specified value. An exception is raised if the element is missing or if the text field is not editable. Example:
1005
1005
 
1006
1006
  ```python
1007
1007
  self.type("input#id_value", "2012")
1008
1008
  ```
1009
1009
 
1010
- You can also use <code>self.add_text()</code> or the <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a> <code>.send_keys()</code> command, but those won't clear the text box first if there's already text inside.
1010
+ You can also use <code translate="no">self.add_text()</code> or the <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a> <code translate="no">.send_keys()</code> command, but those won't clear the text box first if there's already text inside.
1011
1011
 
1012
1012
  🔵 **Getting the text from an element on a page:**
1013
1013
 
@@ -1109,7 +1109,7 @@ if self.is_text_visible("You Shall Not Pass!", "h1"):
1109
1109
 
1110
1110
  <div></div>
1111
1111
  <details>
1112
- <summary> ▶️ Click for a longer example of <code>is_text_visible():</code></summary>
1112
+ <summary> ▶️ Click for a longer example of <code translate="no">is_text_visible():</code></summary>
1113
1113
 
1114
1114
  ```python
1115
1115
  def get_mirror_universe_captain_picard_superbowl_ad(superbowl_year):
@@ -1149,7 +1149,7 @@ if self.is_link_text_visible("Stop! Hammer time!"):
1149
1149
 
1150
1150
  <h3>🔵 Switching Tabs:</h3>
1151
1151
 
1152
- <p>If your test opens up a new tab/window, you can switch to it. (SeleniumBase automatically switches to new tabs that don't open to <code>about:blank</code> URLs.)</p>
1152
+ <p>If your test opens up a new tab/window, you can switch to it. (SeleniumBase automatically switches to new tabs that don't open to <code translate="no">about:blank</code> URLs.)</p>
1153
1153
 
1154
1154
  ```python
1155
1155
  self.switch_to_window(1) # This switches to the new tab (0 is the first one)
@@ -1238,7 +1238,7 @@ self.execute_script('''document.body.innerHTML = \"%s\"''' % referral_link)
1238
1238
  self.click("a.analytics") # Clicks the generated button
1239
1239
  ```
1240
1240
 
1241
- (Due to popular demand, this traffic generation example has been included in SeleniumBase with the <code>self.generate_referral(start_page, end_page)</code> and the <code>self.generate_traffic(start_page, end_page, loops)</code> methods.)
1241
+ (Due to popular demand, this traffic generation example has been included in SeleniumBase with the <code translate="no">self.generate_referral(start_page, end_page)</code> and the <code translate="no">self.generate_traffic(start_page, end_page, loops)</code> methods.)
1242
1242
 
1243
1243
  </details>
1244
1244
 
@@ -1263,8 +1263,8 @@ class MyTestClass(BaseCase):
1263
1263
  self.process_deferred_asserts()
1264
1264
  ```
1265
1265
 
1266
- <code>deferred_assert_element()</code> and <code>deferred_assert_text()</code> will save any exceptions that would be raised.
1267
- To flush out all the failed deferred asserts into a single exception, make sure to call <code>self.process_deferred_asserts()</code> at the end of your test method. If your test hits multiple pages, you can call <code>self.process_deferred_asserts()</code> before navigating to a new page so that the screenshot from your log files matches the URL where the deferred asserts were made.
1266
+ <code translate="no">deferred_assert_element()</code> and <code translate="no">deferred_assert_text()</code> will save any exceptions that would be raised.
1267
+ To flush out all the failed deferred asserts into a single exception, make sure to call <code translate="no">self.process_deferred_asserts()</code> at the end of your test method. If your test hits multiple pages, you can call <code translate="no">self.process_deferred_asserts()</code> before navigating to a new page so that the screenshot from your log files matches the URL where the deferred asserts were made.
1268
1268
 
1269
1269
  <h3>🔵 How to access raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a>:</h3>
1270
1270
 
@@ -1280,13 +1280,13 @@ self.driver.find_elements("partial link text", "GitHub")
1280
1280
 
1281
1281
  <h3>🔵 How to retry failing tests automatically:</h3>
1282
1282
 
1283
- <p>You can use <code>pytest --reruns=NUM</code> to retry failing tests that many times. Add <code>--reruns-delay=SECONDS</code> to wait that many seconds between retries. Example:</p>
1283
+ <p>You can use <code translate="no">pytest --reruns=NUM</code> to retry failing tests that many times. Add <code translate="no">--reruns-delay=SECONDS</code> to wait that many seconds between retries. Example:</p>
1284
1284
 
1285
1285
  ```bash
1286
1286
  pytest --reruns=1 --reruns-delay=1
1287
1287
  ```
1288
1288
 
1289
- <p>You can use the <code>@retry_on_exception()</code> decorator to retry failing methods. (First import: <code>from seleniumbase import decorators</code>). To learn more about SeleniumBase decorators, <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/common">click here</a>.</p>
1289
+ <p>You can use the <code translate="no">@retry_on_exception()</code> decorator to retry failing methods. (First import: <code translate="no">from seleniumbase import decorators</code>). To learn more about SeleniumBase decorators, <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/common">click here</a>.</p>
1290
1290
 
1291
1291
  --------
1292
1292
 
@@ -16,15 +16,15 @@ Feature: SeleniumBase scenarios for the RealWorld App # features/realworld.featu
16
16
 
17
17
  Scenario: Verify RealWorld App (log in / sign out) # features/realworld.feature:3
18
18
  Given Open "seleniumbase.io/realworld/login" # ../../sbase/steps.py:10
19
- And Clear Session Storage # ../../sbase/steps.py:613
19
+ And Clear Session Storage # ../../sbase/steps.py:669
20
20
  When Type "demo_user" into "#username" # ../../sbase/steps.py:40
21
21
  And Type "secret_pass" into "#password" # ../../sbase/steps.py:40
22
- And Do MFA "GAXG2MTEOR3DMMDG" into "#totpcode" # ../../sbase/steps.py:309
22
+ And Do MFA "GAXG2MTEOR3DMMDG" into "#totpcode" # ../../sbase/steps.py:322
23
23
  Then Assert exact text "Welcome!" in "h1" # ../../sbase/steps.py:157
24
- And Highlight "img#image1" # ../../sbase/steps.py:171
24
+ And Highlight "img#image1" # ../../sbase/steps.py:184
25
25
  And Click 'a:contains("This Page")' # ../../sbase/steps.py:27
26
- And Save screenshot to logs # ../../sbase/steps.py:226
27
- When Click link "Sign out" # ../../sbase/steps.py:182
26
+ And Save screenshot to logs # ../../sbase/steps.py:239
27
+ When Click link "Sign out" # ../../sbase/steps.py:195
28
28
  Then Assert element 'a:contains("Sign in")' # ../../sbase/steps.py:120
29
29
  And Assert text "You have been signed out!" # ../../sbase/steps.py:145
30
30
  ✅ Scenario Passed!
@@ -28,9 +28,9 @@ class HackTests(BaseCase):
28
28
  zoom_in = "#ca-history a{zoom: 1.8;-moz-transform: scale(1.8);}"
29
29
  self.add_css_style(zoom_in)
30
30
  self.highlight("#ca-history a", loops=5, scroll=False)
31
- zoom_in = "div.thumbinner{zoom: 1.6;-moz-transform: scale(1.6);}"
31
+ zoom_in = "img[src*=Ayb]{zoom: 1.6;-moz-transform: scale(1.6);}"
32
32
  self.add_css_style(zoom_in)
33
- self.highlight("div.thumbinner", loops=10, scroll=False)
33
+ self.highlight("img[src*=Ayb]", loops=10, scroll=False)
34
34
 
35
35
  if not self.headless:
36
36
  self.open("https://www.apple.com/store")
@@ -7,9 +7,9 @@ from seleniumbase import page_actions
7
7
  driver = Driver(browser="chrome", headless=False)
8
8
  try:
9
9
  driver.get("https://seleniumbase.io/apps/calculator")
10
- page_actions.wait_for_element(driver, "4", by="id").click()
11
- page_actions.wait_for_element(driver, "2", by="id").click()
12
- page_actions.wait_for_text(driver, "42", "output", by="id")
10
+ page_actions.wait_for_element(driver, '[id="4"]').click()
11
+ page_actions.wait_for_element(driver, '[id="2"]').click()
12
+ page_actions.wait_for_text(driver, "42", "#output")
13
13
  js_utils.highlight_with_js(driver, "#output", loops=6)
14
14
  finally:
15
15
  driver.quit()
@@ -10,9 +10,9 @@ with DriverContext() as driver:
10
10
 
11
11
  with DriverContext(browser="chrome", incognito=True) as driver:
12
12
  driver.get("https://seleniumbase.io/apps/calculator")
13
- page_actions.wait_for_element(driver, "4", by="id").click()
14
- page_actions.wait_for_element(driver, "2", by="id").click()
15
- page_actions.wait_for_text(driver, "42", "output", by="id")
13
+ page_actions.wait_for_element(driver, '[id="4"]').click()
14
+ page_actions.wait_for_element(driver, '[id="2"]').click()
15
+ page_actions.wait_for_text(driver, "42", "#output")
16
16
  js_utils.highlight_with_js(driver, "#output", loops=6)
17
17
 
18
18
  with DriverContext() as driver: