seleniumbase 4.15.9__tar.gz → 4.15.11__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.
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/PKG-INFO +191 -81
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/README.md +190 -80
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/ReadMe.md +7 -7
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/example_logs/ReadMe.md +5 -5
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/github_test.py +2 -2
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/hack_the_planet.py +2 -5
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/protractor/ReadMe.md +8 -7
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/customizing_test_runs.md +16 -10
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/happy_customers.md +35 -3
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/syntax_formats.md +2 -2
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/requirements.txt +6 -6
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/requirements.txt +5 -24
- seleniumbase-4.15.11/seleniumbase/__version__.py +2 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/pytest_plugin.py +4 -1
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/selenium_plugin.py +4 -1
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase.egg-info/PKG-INFO +191 -81
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase.egg-info/requires.txt +9 -24
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/setup.py +24 -30
- seleniumbase-4.15.9/seleniumbase/__version__.py +0 -2
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.github/Workflows.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.github/workflows/pages.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.github/workflows/python-nightly-mac.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.github/workflows/python-nightly-ubuntu.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.github/workflows/python-nightly-windows.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.github/workflows/python-package-legacy.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.github/workflows/python-package.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.gitignore +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/.travis.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/CHANGELOG.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/CNAME +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/CODE_OF_CONDUCT.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/CONTRIBUTING.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/Dockerfile +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/LICENSE +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/MANIFEST.in +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/SECURITY.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/_config.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/azure-pipelines.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/basic_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/behave.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/behave.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/calculator.feature +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/environment.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/fail_page.feature +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/realworld.feature +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/steps/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/steps/calculator.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/steps/fail_page.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/steps/imported.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/behave_bdd/features/swag_labs.feature +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/base_test_case.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/boilerplate_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/classic_obj_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/page_objects.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/file_parsing/qa_login_example.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/file_parsing/staging_login_example.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/google_objects.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/google_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/sb_swag_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/swag_labs_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/samples/test_page_objects.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/boilerplates/sb_fixture_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/capabilities/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/capabilities/mac_cap_file.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/capabilities/sample_cap_file_BS.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/capabilities/sample_cap_file_SL.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/capabilities/selenoid_cap_file.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/capabilities/win10_cap_file.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_plans/basic_test.MyTestClass.test_basics.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_plans/my_first_test.MyTestClass.test_swag_labs.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_plans/shadow_root_test.ShadowRootTest.test_shadow_root.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_plans/test_assert_elements.ListAssertTests.test_assert_list_of_elements.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_plans/test_calculator.CalculatorTests.test_6_times_7_plus_12_equals_54.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_plans/test_demo_site.DemoSiteTests.test_demo_site.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_plans/test_login.SwagLabsLoginTests.test_swag_labs_login.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_plans/test_mfa_login.TestMFALogin.test_mfa_login.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/case_summary.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/chart_presentation.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/my_chart.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/pie_charts.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/test_area_chart.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/test_display_chart.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/test_line_chart.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/test_multi_series.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/chart_maker/test_save_chart.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/coffee_cart_tests.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/custom_settings.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/desktop_apps/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/desktop_apps/recorder.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/dialog_boxes/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/dialog_boxes/dialog_box_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/edge_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/example_config.cfg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/example_logs/basic_test_info.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/example_logs/page_source.html +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/example_logs/screenshot.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/gui_test_runner.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/handle_alert_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/iframe_tests.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/locale_code_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/master_qa/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/master_qa/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/master_qa/basic_masterqa_test_0.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/master_qa/masterqa_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/master_qa/pytest.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/protractor/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/protractor/example_spec.js +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/protractor/example_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/protractor/input_spec.js +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/protractor/input_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/protractor/mat_paginator_spec.js +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/protractor/mat_paginator_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/raw_selenium/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/raw_selenium/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/raw_selenium/messy_raw.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/raw_selenium/pytest.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/raw_selenium/refined_raw.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/migration/raw_selenium/simple_sbase.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/my_first_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/nth_child_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/offline_examples/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/offline_examples/demo_page.html +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/offline_examples/load_html_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/offline_examples/test_demo_page.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/offline_examples/test_handle_alerts.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/offline_examples/test_request_fixture.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/offline_examples/test_user_agent.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/old_wordle_script.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/parameterized_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/performance_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/presenter/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/presenter/core_presentation.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/presenter/edge_presentation.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/presenter/fundamentals.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/presenter/my_presentation.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/presenter/py_virtual_envs.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/proxy_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/pytest.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/rate_limiting_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/raw_browser_launcher.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/raw_call.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/raw_driver_context.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/raw_file_call.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/raw_main_call.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/raw_parameter_script.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/raw_sb.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/raw_test_scripts.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/setup.cfg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/shadow_root_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/swag_labs_user_tests.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_apple_site.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_assert_elements.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_calculator.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_canvas.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_checkboxes.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_chinese_pdf.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_chromedriver.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_coffee_cart.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_console_logging.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_contains_selector.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_cycle_elements.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_decryption.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_deferred_asserts.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_demo_site.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_detect_404s.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_docs_site.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_double_click.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_download_files.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_download_images.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_drag_and_drop.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_error_page.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_event_firing.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_fail.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_get_locale_code.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_get_pdf_text.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_get_user_agent.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_hack_search.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_image_saving.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_inspect_html.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_login.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_markers.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_mfa_login.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_multiple_drivers.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_null.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_override_driver.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_override_sb_fixture.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_parse_soup.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_pdf_asserts.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_pytest_parametrize.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_repeat_tests.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_request_sb_fixture.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_save_screenshots.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_sb_fixture.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_scrape_bing.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_select_options.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_shadow_dom.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_show_file_choosers.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_skype_site.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_suite.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_swag_labs.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_tinymce.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_todomvc.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_url_asserts.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_usefixtures.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_verify_chromedriver.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_window_switching.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_xfail.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/test_xkcd.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/time_limit_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/bootstrap_google_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/driverjs_maps_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/google_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/hopscotch_google_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/introjs_google_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/maps_introjs_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/octocat_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/shepherd_google_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/tour_examples/xkcd_tour.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/chinese_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/dutch_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/english_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/french_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/italian_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/japanese_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/korean_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/portuguese_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/pytest.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/russian_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/translations/spanish_test_1.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/uc_cdp_events.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/unit_tests/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/unit_tests/verify_framework.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/upgrade_chromedriver.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/upload_file_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/user_agent_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/verify_undetected.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/case_plans/layout_test.VisualLayoutTests.test_applitools_layout_change.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/case_plans/python_home_test.VisualLayoutTests.test_python_home_layout_change.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_applitools_change.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_xkcd_logo_change.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/case_plans/test_layout_fail.VisualLayout_FixtureTests.test_python_home_change.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/case_plans/xkcd_visual_test.VisualLayoutTests.test_xkcd_layout_change.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/layout_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/python_home_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/test_layout_fail.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/visual_testing/xkcd_visual_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/wordle_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/xpath_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/examples/youtube_search_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/behave_gui.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/case_plans.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/chinese.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/commander.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/demo_mode.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/desired_capabilities.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/features_list.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/hidden_files_info.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/how_it_works.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/html_inspector.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/install.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/install_python_pip_git.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/js_package_manager.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/locale_codes.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/method_summary.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/mobile_testing.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/mysql_installation.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/recorder_mode.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/shadow_dom.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/thank_you.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/translations.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/useful_grep_commands.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/using_safari_driver.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/verify_webdriver.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/virtualenv_instructions.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/help_docs/webdriver_installation.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/install.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/azure/azure_pipelines/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/azure/jenkins/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/behave.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/behave.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/calculator.feature +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/environment.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/fail_page.feature +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/realworld.feature +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/steps/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/steps/calculator.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/steps/fail_page.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/steps/real_world.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/steps/swag_labs.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/behave/features/swag_labs.feature +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/brython/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/brython/index.html +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/brython/index.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/brython/library.html +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/docker/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/docker/docker-entrypoint.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/docker/docker_config.cfg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/docker/run_docker_test_in_chrome.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/docker/run_docker_test_in_firefox.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/github/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/github/workflows/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/github/workflows/extras.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/google_cloud/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/katalon/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/linux/Linuxfile.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/linux/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/linux/Xvfb_launcher.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/linux/jenkins_permissions.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/linux/tomcat_permissions.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/node_js/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/node_js/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/node_js/index.html +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/node_js/my_first_test.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/node_js/npm-shrinkwrap.json +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/node_js/package.json +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/node_js/server.js +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/node_js/test_demo_site.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/selenium_grid/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/integrations/selenium_ide/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs.yml +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/ReadMe.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/docs_instructions.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/dash_pie.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/dash_pie_2.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/dash_pie_3.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/favicon.ico +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/grad_logo.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/green_icon.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/green_logo.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/green_logo2.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/green_logo3.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/logo3.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/logo3a.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/logo3b.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/logo3c.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/logo4.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/logo5.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/logo6.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/logo7.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/sb_icon.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/sb_logo_10.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/sb_logo_7.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/side_by_side.png +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/social/share_facebook.svg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/social/share_github.svg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/social/share_gitter.svg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/social/share_instagram.svg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/img/social/share_twitter.svg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/index.html +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/mkdocs_build/prepare.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/pytest.ini +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/sbase/ReadMe.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/sbase/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/sbase/__main__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/sbase/steps.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/common/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/browser_launcher.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/drivers/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/extensions/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/base_case.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/masterqa/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/resources/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/resources/favicon.ico +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_ide/ReadMe.md +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/setup.cfg +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/virtualenv_install.sh +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/win_install.bat +0 -0
- {seleniumbase-4.15.9 → seleniumbase-4.15.11}/win_virtualenv.bat +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.15.
|
3
|
+
Version: 4.15.11
|
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
|
@@ -70,13 +70,13 @@ License-File: LICENSE
|
|
70
70
|
|
71
71
|
<h1>SeleniumBase</h1>
|
72
72
|
|
73
|
-
<
|
73
|
+
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="266" /></a></p>
|
74
74
|
|
75
|
-
<
|
75
|
+
<h2 align="center" class="hero__title">All-in-one Test Automation Framework</h2>
|
76
76
|
|
77
|
-
<
|
77
|
+
<h3 align="center"><img src="https://seleniumbase.github.io/cdn/img/python_logo.png" title="SeleniumBase" width="29" /> For Python enthusiasts and enterprise developers <img src="https://seleniumbase.github.io/cdn/img/python_logo.png" title="SeleniumBase" width="29" /></h3>
|
78
78
|
|
79
|
-
<
|
79
|
+
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></p>
|
80
80
|
|
81
81
|
<p align="center">
|
82
82
|
<a href="#python_installation">🚀 Start</a> |
|
@@ -118,7 +118,40 @@ License-File: LICENSE
|
|
118
118
|
|
119
119
|
--------
|
120
120
|
|
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
|
+
|
123
|
+
<blockquote>
|
124
|
+
<p dir="auto"><strong>Jump to:</strong></p>
|
125
|
+
<ul dir="auto">
|
126
|
+
<li><a href="#install_seleniumbase" ><strong>Get Started / Installation</strong></a></li>
|
127
|
+
<li><a href="#basic_example_and_usage"><strong>Basic Example / Usage</strong></a></li>
|
128
|
+
<li><a href="#common_methods" ><strong>Common Test Methods</strong></a></li>
|
129
|
+
<li><a href="#fun_facts" ><strong>Fun Facts / Learn More</strong></a></li>
|
130
|
+
<li><a href="#demo_mode_and_debugging"><strong>Demo Mode / Debugging</strong></a></li>
|
131
|
+
<li><a href="#command_line_options" ><strong>Command-line Options</strong></a></li>
|
132
|
+
<li><a href="#directory_configuration"><strong>Directory Configuration</strong></a></li>
|
133
|
+
<li><a href="#seleniumbase_dashboard" ><strong>SeleniumBase Dashboard</strong></a></li>
|
134
|
+
<li><a href="#creating_visual_reports"><strong>Generating Test Reports</strong></a></li>
|
135
|
+
</ul>
|
136
|
+
</blockquote>
|
137
|
+
|
138
|
+
--------
|
139
|
+
|
121
140
|
<a id="multiple_examples"></a>
|
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>
|
143
|
+
|
144
|
+
```bash
|
145
|
+
cd examples/
|
146
|
+
pytest test_demo_site.py
|
147
|
+
```
|
148
|
+
|
149
|
+
<p align="left"><a href="https://seleniumbase.io/demo_page" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/demo_page_5.gif" width="480" alt="SeleniumBase Example" title="SeleniumBase Example" /></a></p>
|
150
|
+
|
151
|
+
> Easy to type, click, select, toggle, drag-and-drop, etc.
|
152
|
+
|
153
|
+
--------
|
154
|
+
|
122
155
|
<p align="left"><b>Example:</b> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">test_coffee_cart.py</a> from <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank">./examples/</a></p>
|
123
156
|
|
124
157
|
```bash
|
@@ -152,13 +185,15 @@ class CoffeeCartTest(BaseCase):
|
|
152
185
|
self.assert_text("Thanks for your purchase.", "#app .success")
|
153
186
|
```
|
154
187
|
|
188
|
+
(For more examples, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.)
|
189
|
+
|
155
190
|
--------
|
156
191
|
|
157
192
|
<details>
|
158
193
|
<summary> ▶️ How is <b>SeleniumBase</b> different from raw Selenium? (<b>click to expand</b>)</summary>
|
159
194
|
<div>
|
160
195
|
|
161
|
-
<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>
|
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>
|
162
197
|
|
163
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>
|
164
199
|
|
@@ -193,7 +228,7 @@ With raw Selenium, that requires more code:<br />
|
|
193
228
|
<summary> ▶️ Learn about different ways of writing tests (<b>click to expand</b>)</summary>
|
194
229
|
<div>
|
195
230
|
|
196
|
-
<p align="left">📘📝 An example test with the <b>BaseCase</b> class. Runs with <b><a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b> or <b>
|
231
|
+
<p align="left">📘📝 An example test with the <b>BaseCase</b> class. Runs with <b><a href="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b> or <b>pynose</b>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">Learn more</a>)</p>
|
197
232
|
|
198
233
|
```python
|
199
234
|
from seleniumbase import BaseCase
|
@@ -243,7 +278,7 @@ with SB() as sb: # By default, browser="chrome" if not set.
|
|
243
278
|
sb.assert_exact_text("You have been signed out!", "#top_message")
|
244
279
|
```
|
245
280
|
|
246
|
-
<p align="left">📕📝 An example test with <b>behave-BDD</b> <a href="https://behave.readthedocs.io/en/stable/gherkin.html" 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>behave</code></b>. (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">Learn more</a>)</p>
|
247
282
|
|
248
283
|
```gherkin
|
249
284
|
Feature: SeleniumBase scenarios for the RealWorld App
|
@@ -267,6 +302,8 @@ Feature: SeleniumBase scenarios for the RealWorld App
|
|
267
302
|
<a id="python_installation"></a>
|
268
303
|
<h2><img src="https://seleniumbase.github.io/cdn/img/python_logo.png" title="SeleniumBase" width="42" /> Set up Python & Git:</h2>
|
269
304
|
|
305
|
+
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=FACE42" title="Supported Python Versions" /></a>
|
306
|
+
|
270
307
|
🔵 Add <b><a href="https://www.python.org/downloads/">Python</a></b> and <b><a href="https://git-scm.com/">Git</a></b> to your System PATH.
|
271
308
|
|
272
309
|
🔵 Using a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/virtualenv_instructions.md">Python virtual env</a> is recommended.
|
@@ -276,7 +313,7 @@ Feature: SeleniumBase scenarios for the RealWorld App
|
|
276
313
|
|
277
314
|
**You can install ``seleniumbase`` from [PyPI](https://pypi.org/project/seleniumbase/) or [GitHub](https://github.com/seleniumbase/SeleniumBase):**
|
278
315
|
|
279
|
-
🔵 **
|
316
|
+
🔵 **How to install ``seleniumbase`` from PyPI:**
|
280
317
|
|
281
318
|
```bash
|
282
319
|
pip install seleniumbase
|
@@ -286,7 +323,7 @@ pip install seleniumbase
|
|
286
323
|
* (Add ``--force-reinstall`` to upgrade indirect packages.)
|
287
324
|
* (Use ``pip3`` if multiple versions of Python are present.)
|
288
325
|
|
289
|
-
🔵 **
|
326
|
+
🔵 **How to install ``seleniumbase`` from a GitHub clone:**
|
290
327
|
|
291
328
|
```bash
|
292
329
|
git clone https://github.com/seleniumbase/SeleniumBase.git
|
@@ -294,14 +331,14 @@ cd SeleniumBase/
|
|
294
331
|
pip install -e .
|
295
332
|
```
|
296
333
|
|
297
|
-
**
|
334
|
+
🔵 **How to upgrade an existing install from a GitHub clone:**
|
298
335
|
|
299
336
|
```bash
|
300
337
|
git pull
|
301
338
|
pip install -e .
|
302
339
|
```
|
303
340
|
|
304
|
-
🔵 Type ``seleniumbase`` or ``sbase`` to verify that SeleniumBase was installed successfully
|
341
|
+
🔵 **Type ``seleniumbase`` or ``sbase`` to verify that SeleniumBase was installed successfully:**
|
305
342
|
|
306
343
|
```bash
|
307
344
|
______ __ _ ____
|
@@ -348,16 +385,38 @@ COMMANDS:
|
|
348
385
|
Use "pytest" for running tests.
|
349
386
|
```
|
350
387
|
|
351
|
-
|
352
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Downloading webdrivers:</h3>
|
388
|
+
<h3>🔵 Downloading webdrivers:</h3>
|
353
389
|
|
354
390
|
✅ SeleniumBase automatically downloads webdrivers as needed, such as ``chromedriver``.
|
355
391
|
|
392
|
+
<div></div>
|
393
|
+
<details>
|
394
|
+
<summary> ▶️ Here's output from a chromedriver download. (<b>click to expand</b>)</summary>
|
395
|
+
|
396
|
+
```bash
|
397
|
+
*** chromedriver version for download = 114.0.5735.90 (Latest)
|
398
|
+
|
399
|
+
Downloading chromedriver_mac_arm64.zip from:
|
400
|
+
https://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_mac_arm64.zip ...
|
401
|
+
Download Complete!
|
402
|
+
|
403
|
+
Extracting ['chromedriver'] from chromedriver_mac_arm64.zip ...
|
404
|
+
Unzip Complete!
|
405
|
+
|
406
|
+
The file [chromedriver] was saved to:
|
407
|
+
/Users/michael/github/SeleniumBase/seleniumbase/drivers/chromedriver
|
408
|
+
|
409
|
+
Making [chromedriver 114.0.5735.90] executable ...
|
410
|
+
[chromedriver 114.0.5735.90] is now ready for use!
|
411
|
+
```
|
412
|
+
|
413
|
+
</details>
|
414
|
+
|
356
415
|
✅ To manually download a webdriver, see [Console Scripts](https://seleniumbase.io/seleniumbase/console_scripts/ReadMe/) OR [Webdriver Installation](https://seleniumbase.io/help_docs/webdriver_installation/).
|
357
416
|
|
358
417
|
|
359
418
|
<a id="basic_example_and_usage"></a>
|
360
|
-
<
|
419
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Basic Example / Usage:</h2>
|
361
420
|
|
362
421
|
🔵 If you've cloned SeleniumBase, you can run tests from the [examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder.
|
363
422
|
|
@@ -372,6 +431,8 @@ pytest my_first_test.py
|
|
372
431
|
|
373
432
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py"><img src="https://seleniumbase.github.io/cdn/gif/swag_labs_4.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
|
374
433
|
|
434
|
+
> SeleniumBase easily handles login, shopping, and checkout.
|
435
|
+
|
375
436
|
<p align="left"><b>Here's the code for <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py">my_first_test.py</a>:</b></p>
|
376
437
|
|
377
438
|
```python
|
@@ -410,7 +471,7 @@ class MyTestClass(BaseCase):
|
|
410
471
|
|
411
472
|
|
412
473
|
<a id="common_methods"></a>
|
413
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Here are some common SeleniumBase methods
|
474
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Here are some common SeleniumBase methods:</h3>
|
414
475
|
|
415
476
|
```python
|
416
477
|
self.open(url) # Navigate the browser window to the URL.
|
@@ -463,12 +524,21 @@ self.assert_no_js_errors() # Verify there are no JS errors.
|
|
463
524
|
self.type("input", "dogs\n")
|
464
525
|
```
|
465
526
|
|
466
|
-
SeleniumBase
|
527
|
+
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>.
|
467
528
|
|
468
529
|
```bash
|
469
|
-
pytest
|
530
|
+
pytest coffee_cart_tests.py --rs
|
531
|
+
pytest test_sb_fixture.py
|
532
|
+
pytest test_suite.py --rs --html=report.html --dashboard
|
470
533
|
|
471
|
-
|
534
|
+
pynose basic_test.py --mobile
|
535
|
+
pynose test_suite.py --headless --report --show-report
|
536
|
+
|
537
|
+
python raw_sb.py
|
538
|
+
python raw_test_scripts.py
|
539
|
+
|
540
|
+
behave realworld.feature
|
541
|
+
behave calculator.feature -D rs -D dashboard
|
472
542
|
```
|
473
543
|
|
474
544
|
<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>
|
@@ -476,7 +546,7 @@ nosetests test_suite.py --firefox
|
|
476
546
|
* Python files that start with ``test_`` or end with ``_test.py``.
|
477
547
|
* Python methods that start with ``test_``.
|
478
548
|
|
479
|
-
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
|
549
|
+
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.
|
480
550
|
|
481
551
|
<p>✅ You can do a pre-flight check to see which tests would get discovered by <code>pytest</code> before the real flight:</p>
|
482
552
|
|
@@ -484,12 +554,12 @@ With a SeleniumBase [pytest.ini](https://github.com/seleniumbase/SeleniumBase/bl
|
|
484
554
|
pytest --collect-only -q
|
485
555
|
```
|
486
556
|
|
487
|
-
<p>✅ You can be more specific when calling <code>pytest</code> on a file:</p>
|
557
|
+
<p>✅ You can be more specific when calling <code>pytest</code> or <code>pynose</code> on a file:</p>
|
488
558
|
|
489
559
|
```bash
|
490
560
|
pytest [FILE_NAME.py]::[CLASS_NAME]::[METHOD_NAME]
|
491
561
|
|
492
|
-
|
562
|
+
pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
|
493
563
|
```
|
494
564
|
|
495
565
|
<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,39 +572,56 @@ nosetests [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
|
|
502
572
|
✅ SeleniumBase works on all popular CI/CD platforms:
|
503
573
|
<p><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md"><img alt="GitHub Actions integration" src="https://img.shields.io/badge/GitHub_Actions-12B2C2.svg?logo=GitHubActions&logoColor=CFFFC2" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md"><img alt="Jenkins integration" src="https://img.shields.io/badge/Jenkins-32B242.svg?logo=jenkins&logoColor=white" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/azure_pipelines/ReadMe.md"><img alt="Azure integration" src="https://img.shields.io/badge/Azure-2288EE.svg?logo=AzurePipelines&logoColor=white" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/google_cloud/ReadMe.md"><img alt="Google Cloud integration" src="https://img.shields.io/badge/Google_Cloud-11CAE8.svg?logo=GoogleCloud&logoColor=EE0066" /></a> <a href="#utilizing_advanced_features"><img alt="AWS integration" src="https://img.shields.io/badge/AWS-4488DD.svg?logo=AmazonAWS&logoColor=FFFF44" /></a> <a href="https://en.wikipedia.org/wiki/Personal_computer" target="_blank"><img alt="Your Computer" src="https://img.shields.io/badge/💻_Your_Computer-44E6E6.svg" /></a></p>
|
504
574
|
|
505
|
-
<p>✅ SeleniumBase includes an automated/manual hybrid solution called <b><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">MasterQA</a></b
|
575
|
+
<p>✅ SeleniumBase includes an automated/manual hybrid solution called <b><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">MasterQA</a></b> to speed up manual testing with automation while the manual tester handles validation.</p>
|
506
576
|
|
507
577
|
<p>✅ For a full list of SeleniumBase features, <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">Click Here</a>.</p>
|
508
578
|
|
509
579
|
|
510
|
-
<a id="
|
511
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" />
|
580
|
+
<a id="demo_mode_and_debugging"></a>
|
581
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Demo Mode / Debugging:</h2>
|
512
582
|
|
513
|
-
<a
|
514
|
-
🔵 <b>Demo Mode</b> helps you see what a test is doing. If a test is moving too fast for your eyes, run it in <b>Demo Mode</b>, which pauses the browser briefly between actions, highlights page elements being acted on, and displays assertions:
|
583
|
+
🔵 <b>Demo Mode</b> helps you see what a test is doing. If a test is moving too fast for your eyes, run it in <b>Demo Mode</b> to pause the browser briefly between actions, highlight page elements being acted on, and display assertions:
|
515
584
|
|
516
585
|
```bash
|
517
586
|
pytest my_first_test.py --demo
|
518
587
|
```
|
519
588
|
|
520
|
-
🔵
|
589
|
+
🔵 ``time.sleep(seconds)`` can be used to make a test wait at a specific spot:
|
590
|
+
|
591
|
+
```python
|
592
|
+
import time; time.sleep(3) # Do nothing for 3 seconds.
|
593
|
+
```
|
594
|
+
|
595
|
+
🔵 **Debug Mode** with Python's built-in **[pdb](https://docs.python.org/3/library/pdb.html)** library helps you debug tests:
|
521
596
|
|
522
597
|
```python
|
523
|
-
import
|
524
|
-
import
|
525
|
-
|
598
|
+
import pdb; pdb.set_trace()
|
599
|
+
import pytest; pytest.set_trace()
|
600
|
+
breakpoint() # Shortcut for "import pdb; pdb.set_trace()"
|
526
601
|
```
|
527
602
|
|
603
|
+
> (**``pdb``** commands: ``n``, ``c``, ``s``, ``u``, ``d`` => ``next``, ``continue``, ``step``, ``up``, ``down``)
|
604
|
+
|
528
605
|
🔵 To pause an active test that throws an exception or error, (*and keep the browser window open while **Debug Mode** begins in the console*), add **``--pdb``** as a ``pytest`` option:
|
529
606
|
|
530
607
|
```bash
|
531
|
-
pytest
|
608
|
+
pytest test_fail.py --pdb
|
609
|
+
```
|
610
|
+
|
611
|
+
🔵 To start tests in Debug Mode, add **``--trace``** as a ``pytest`` option:
|
612
|
+
|
613
|
+
```bash
|
614
|
+
pytest test_coffee_cart.py --trace
|
532
615
|
```
|
533
616
|
|
534
|
-
(
|
617
|
+
<a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/cdn/gif/coffee_pdbp.gif" alt="SeleniumBase test with the pdbp (Pdb+) debugger" title="SeleniumBase test with the pdbp (Pdb+) debugger" /></a>
|
618
|
+
|
619
|
+
|
620
|
+
<a id="command_line_options"></a>
|
621
|
+
<h2>🔵 Command-line Options:</h2>
|
535
622
|
|
536
623
|
<a id="pytest_options"></a>
|
537
|
-
|
624
|
+
✅ Here are some useful command-line options that come with <code>pytest</code>:
|
538
625
|
|
539
626
|
```bash
|
540
627
|
-v # Verbose mode. Prints the full name of each test and shows more details.
|
@@ -551,7 +638,7 @@ pytest my_first_test.py --pdb
|
|
551
638
|
```
|
552
639
|
|
553
640
|
<a id="new_pytest_options"></a>
|
554
|
-
|
641
|
+
✅ SeleniumBase provides additional <code>pytest</code> command-line options for tests:
|
555
642
|
|
556
643
|
```bash
|
557
644
|
--browser=BROWSER # (The web browser to use. Default: "chrome".)
|
@@ -648,7 +735,9 @@ pytest my_first_test.py --pdb
|
|
648
735
|
|
649
736
|
(See the full list of command-line option definitions **[here](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/plugins/pytest_plugin.py)**. For detailed examples of command-line options, see **[customizing_test_runs.md](https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md)**)
|
650
737
|
|
651
|
-
|
738
|
+
--------
|
739
|
+
|
740
|
+
🔵 During test failures, logs and screenshots from the most recent test run will get saved to the ``latest_logs/`` folder. Those logs will get moved to ``archived_logs/`` if you add --archive_logs to command-line options, or have ``ARCHIVE_EXISTING_LOGS`` set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), otherwise log files with be cleaned up at the start of the next test run. The ``test_suite.py`` collection contains tests that fail on purpose so that you can see how logging works.
|
652
741
|
|
653
742
|
```bash
|
654
743
|
cd examples/
|
@@ -666,10 +755,10 @@ Here's the command-line option to add to tests: (See [examples/custom_settings.p
|
|
666
755
|
🔵 To pass additional data from the command-line to tests, add ``--data="ANY STRING"``.
|
667
756
|
Inside your tests, you can use ``self.data`` to access that.
|
668
757
|
|
758
|
+
<a id="directory_configuration"></a>
|
759
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Directory Configuration:</h2>
|
669
760
|
|
670
|
-
|
671
|
-
|
672
|
-
🔵 When running tests with **pytest**, you'll want a copy of **[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)** in your root folders. When running tests with **nosetests**, you'll want a copy of **[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)** in your root folders. These files specify default configuration details for tests. Folders should also include a blank ``__init__.py`` file, which allows your tests to import files from that folder.
|
761
|
+
🔵 When running tests with **pytest**, you'll want a copy of **[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)** in your root folders. When running tests with **pynose**, you'll want a copy of **[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)** in your root folders. These files specify default configuration details for tests. Folders should also include a blank ``__init__.py`` file to allow your tests to import files from that folder.
|
673
762
|
|
674
763
|
🔵 ``sbase mkdir DIR`` creates a folder with config files and sample tests:
|
675
764
|
|
@@ -719,7 +808,7 @@ ui_tests/
|
|
719
808
|
└── setup.cfg
|
720
809
|
```
|
721
810
|
|
722
|
-
Of those files, the ``pytest.ini`` config file is the most important, followed by a blank ``__init__.py`` file. There's also a ``setup.cfg`` file (
|
811
|
+
Of those files, the ``pytest.ini`` config file is the most important, followed by a blank ``__init__.py`` file. There's also a ``setup.cfg`` file (for pynose). Finally, the ``requirements.txt`` file can be used to help you install seleniumbase into your environments (if it's not already installed).
|
723
812
|
|
724
813
|
--------
|
725
814
|
|
@@ -749,7 +838,8 @@ pytest test_fail.py
|
|
749
838
|
|
750
839
|
--------
|
751
840
|
|
752
|
-
<
|
841
|
+
<a id="seleniumbase_dashboard"></a>
|
842
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> SeleniumBase Dashboard:</h2>
|
753
843
|
|
754
844
|
🔵 The ``--dashboard`` option for pytest generates a SeleniumBase Dashboard located at ``dashboard.html``, which updates automatically as tests run and produce results. Example:
|
755
845
|
|
@@ -778,11 +868,11 @@ pytest test_suite.py --dashboard --rs --headless
|
|
778
868
|
--------
|
779
869
|
|
780
870
|
<a id="creating_visual_reports"></a>
|
781
|
-
<
|
871
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Generating Test Reports:</h2>
|
782
872
|
|
783
|
-
<
|
873
|
+
<h3>🔵 Pytest Reports:</h3>
|
784
874
|
|
785
|
-
|
875
|
+
✅ Using ``--html=report.html`` gives you a fancy report of the name specified after your test suite completes.
|
786
876
|
|
787
877
|
```bash
|
788
878
|
pytest test_suite.py --html=report.html
|
@@ -790,9 +880,9 @@ pytest test_suite.py --html=report.html
|
|
790
880
|
|
791
881
|
<img src="https://seleniumbase.github.io/cdn/img/html_report.png" alt="Example Pytest Report" title="Example Pytest Report" width="520" />
|
792
882
|
|
793
|
-
|
883
|
+
✅ When combining pytest html reports with SeleniumBase Dashboard usage, the pie chart from the Dashboard will get added to the html report. Additionally, if you set the html report URL to be the same as the Dashboard URL when also using the dashboard, (example: ``--dashboard --html=dashboard.html``), then the Dashboard will become an advanced html report when all the tests complete.
|
794
884
|
|
795
|
-
|
885
|
+
✅ Here's an example of an upgraded html report:
|
796
886
|
|
797
887
|
```bash
|
798
888
|
pytest test_suite.py --dashboard --html=report.html
|
@@ -808,19 +898,19 @@ You can also use ``--junit-xml=report.xml`` to get an xml report instead. Jenkin
|
|
808
898
|
pytest test_suite.py --junit-xml=report.xml
|
809
899
|
```
|
810
900
|
|
811
|
-
<
|
901
|
+
<h3>🔵 pynose Reports:</h3>
|
812
902
|
|
813
903
|
The ``--report`` option gives you a fancy report after your test suite completes.
|
814
904
|
|
815
905
|
```bash
|
816
|
-
|
906
|
+
pynose test_suite.py --report
|
817
907
|
```
|
818
908
|
|
819
|
-
<img src="https://seleniumbase.github.io/cdn/img/nose_report.png" alt="Example
|
909
|
+
<img src="https://seleniumbase.github.io/cdn/img/nose_report.png" alt="Example pynose Report" title="Example pynose Report" width="320" />
|
820
910
|
|
821
|
-
(NOTE: You can add ``--show-report`` to immediately display
|
911
|
+
(NOTE: You can add ``--show-report`` to immediately display pynose reports after the test suite completes. Only use ``--show-report`` when running tests locally because it pauses the test run.)
|
822
912
|
|
823
|
-
<
|
913
|
+
<h3>🔵 Behave Dashboard & Reports:</h4>
|
824
914
|
|
825
915
|
(The [behave_bdd/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/behave_bdd) folder can be found in the [examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder.)
|
826
916
|
|
@@ -836,7 +926,7 @@ You can also use ``--junit`` to get ``.xml`` reports for each Behave feature. Je
|
|
836
926
|
behave behave_bdd/features/ --junit -D rs -D headless
|
837
927
|
```
|
838
928
|
|
839
|
-
<
|
929
|
+
<h3>🔵 Allure Reports:</h3>
|
840
930
|
|
841
931
|
See: [https://docs.qameta.io/allure/](https://docs.qameta.io/allure/#_pytest)
|
842
932
|
|
@@ -852,6 +942,7 @@ Now your tests can create Allure results files, which can be processed by Allure
|
|
852
942
|
pytest test_suite.py --alluredir=allure_results
|
853
943
|
```
|
854
944
|
|
945
|
+
--------
|
855
946
|
|
856
947
|
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Using a Proxy Server:</h3>
|
857
948
|
|
@@ -915,7 +1006,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
|
|
915
1006
|
<ul>
|
916
1007
|
<li>You can set up a <a href="https://jenkins.io/" target="_blank">Jenkins</a> build server for running tests at regular intervals. For a real-world Jenkins example of headless browser automation in action, check out the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md">SeleniumBase Jenkins example on Azure</a> or the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/google_cloud/ReadMe.md">SeleniumBase Jenkins example on Google Cloud</a>.</li>
|
917
1008
|
|
918
|
-
<li>You can use <a href="https://selenium.dev/documentation/en/grid/" target="_blank">the Selenium Grid</a> to scale your testing by distributing tests on several machines with parallel execution. To do this, check out the <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/utilities/selenium_grid">SeleniumBase selenium_grid folder</a>, which should have everything you need, including the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">Selenium Grid ReadMe</a
|
1009
|
+
<li>You can use <a href="https://selenium.dev/documentation/en/grid/" target="_blank">the Selenium Grid</a> to scale your testing by distributing tests on several machines with parallel execution. To do this, check out the <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/utilities/selenium_grid">SeleniumBase selenium_grid folder</a>, which should have everything you need, including the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">Selenium Grid ReadMe</a> to help you get started.</li>
|
919
1010
|
|
920
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>
|
921
1012
|
|
@@ -934,7 +1025,7 @@ pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
|
|
934
1025
|
<a id="detailed_method_specifications"></a>
|
935
1026
|
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Detailed Method Specifications and Examples:</h3>
|
936
1027
|
|
937
|
-
🔵 Navigating to a web page: (and related commands)
|
1028
|
+
🔵 **Navigating to a web page: (and related commands)**
|
938
1029
|
|
939
1030
|
```python
|
940
1031
|
self.open("https://xkcd.com/378/") # This method opens the specified page.
|
@@ -959,7 +1050,7 @@ head_close_tag = source.find('</head>', head_open_tag)
|
|
959
1050
|
everything_inside_head = source[head_open_tag+len('<head>'):head_close_tag]
|
960
1051
|
```
|
961
1052
|
|
962
|
-
🔵 Clicking
|
1053
|
+
🔵 **Clicking:**
|
963
1054
|
|
964
1055
|
To click an element on the page:
|
965
1056
|
|
@@ -969,7 +1060,7 @@ self.click("div#my_id")
|
|
969
1060
|
|
970
1061
|
**ProTip™:** In most web browsers, you can right-click on a page and select ``Inspect Element`` to see the CSS selector details that you'll need to create your own scripts.
|
971
1062
|
|
972
|
-
🔵 Typing Text
|
1063
|
+
🔵 **Typing Text:**
|
973
1064
|
|
974
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:
|
975
1066
|
|
@@ -979,19 +1070,19 @@ self.type("input#id_value", "2012")
|
|
979
1070
|
|
980
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.
|
981
1072
|
|
982
|
-
🔵 Getting the text from an element on a page
|
1073
|
+
🔵 **Getting the text from an element on a page:**
|
983
1074
|
|
984
1075
|
```python
|
985
1076
|
text = self.get_text("header h2")
|
986
1077
|
```
|
987
1078
|
|
988
|
-
🔵 Getting the attribute value from an element on a page
|
1079
|
+
🔵 **Getting the attribute value from an element on a page:**
|
989
1080
|
|
990
1081
|
```python
|
991
1082
|
attribute = self.get_attribute("#comic img", "title")
|
992
1083
|
```
|
993
1084
|
|
994
|
-
🔵 Asserting existence of an element on a page within some number of seconds
|
1085
|
+
🔵 **Asserting existence of an element on a page within some number of seconds:**
|
995
1086
|
|
996
1087
|
```python
|
997
1088
|
self.wait_for_element_present("div.my_class", timeout=10)
|
@@ -999,7 +1090,7 @@ self.wait_for_element_present("div.my_class", timeout=10)
|
|
999
1090
|
|
1000
1091
|
(NOTE: You can also use: ``self.assert_element_present(ELEMENT)``)
|
1001
1092
|
|
1002
|
-
🔵 Asserting visibility of an element on a page within some number of seconds
|
1093
|
+
🔵 **Asserting visibility of an element on a page within some number of seconds:**
|
1003
1094
|
|
1004
1095
|
```python
|
1005
1096
|
self.wait_for_element_visible("a.my_class", timeout=5)
|
@@ -1025,7 +1116,7 @@ You can also use ``*=`` to search for any partial value in a CSS selector as sho
|
|
1025
1116
|
self.click('a[name*="partial_name"]')
|
1026
1117
|
```
|
1027
1118
|
|
1028
|
-
🔵 Asserting visibility of text inside an element on a page within some number of seconds
|
1119
|
+
🔵 **Asserting visibility of text inside an element on a page within some number of seconds:**
|
1029
1120
|
|
1030
1121
|
```python
|
1031
1122
|
self.assert_text("Make it so!", "div#trek div.picard div.quotes")
|
@@ -1034,7 +1125,7 @@ self.assert_text("Tea. Earl Grey. Hot.", "div#trek div.picard div.quotes", timeo
|
|
1034
1125
|
|
1035
1126
|
(NOTE: ``self.find_text(TEXT, ELEMENT)`` and ``self.wait_for_text(TEXT, ELEMENT)`` also do this. For backwards compatibility, older method names were kept, but the default timeout may be different.)
|
1036
1127
|
|
1037
|
-
🔵 Asserting Anything
|
1128
|
+
🔵 **Asserting Anything:**
|
1038
1129
|
|
1039
1130
|
```python
|
1040
1131
|
self.assert_true(var1 == var2)
|
@@ -1044,7 +1135,7 @@ self.assert_false(var1 == var2)
|
|
1044
1135
|
self.assert_equal(var1, var2)
|
1045
1136
|
```
|
1046
1137
|
|
1047
|
-
🔵 Useful Conditional Statements: (with creative examples)
|
1138
|
+
🔵 **Useful Conditional Statements: (with creative examples)**
|
1048
1139
|
|
1049
1140
|
❓ ``is_element_visible(selector):`` (visible on the page)
|
1050
1141
|
|
@@ -1117,7 +1208,7 @@ if self.is_link_text_visible("Stop! Hammer time!"):
|
|
1117
1208
|
self.click_link("Stop! Hammer time!")
|
1118
1209
|
```
|
1119
1210
|
|
1120
|
-
|
1211
|
+
<h3>🔵 Switching Tabs:</h3>
|
1121
1212
|
|
1122
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>
|
1123
1214
|
|
@@ -1125,16 +1216,27 @@ if self.is_link_text_visible("Stop! Hammer time!"):
|
|
1125
1216
|
self.switch_to_window(1) # This switches to the new tab (0 is the first one)
|
1126
1217
|
```
|
1127
1218
|
|
1128
|
-
|
1219
|
+
<h3>🔵 How to handle iframes:</h3>
|
1220
|
+
|
1221
|
+
🔵 <b>ProTip™:</b> iframes follow the same principle as new windows: You must first switch to the iframe if you want to perform actions in there:
|
1222
|
+
|
1223
|
+
```python
|
1224
|
+
self.switch_to_frame("iframe")
|
1225
|
+
# ... Now perform actions inside the iframe
|
1226
|
+
self.switch_to_parent_frame() # Exit the current iframe
|
1227
|
+
```
|
1228
|
+
|
1229
|
+
To exit from multiple iframes, use ``self.switch_to_default_content()``. If inside a single iframe, this has the same effect as ``self.switch_to_parent_frame()``.
|
1230
|
+
|
1231
|
+
🔵 You can also use a context manager to act inside iframes:
|
1129
1232
|
|
1130
1233
|
```python
|
1131
|
-
self.
|
1132
|
-
# Now
|
1133
|
-
#
|
1134
|
-
self.switch_to_default_content() # Exit the iframe when you're done
|
1234
|
+
with self.frame_switch("iframe"):
|
1235
|
+
# ... Now perform actions while inside the code block
|
1236
|
+
# You have left the iframe!
|
1135
1237
|
```
|
1136
1238
|
|
1137
|
-
|
1239
|
+
<h3>🔵 How to execute custom jQuery scripts:</h3>
|
1138
1240
|
|
1139
1241
|
<p>jQuery is a powerful JavaScript library that allows you to perform advanced actions in a web browser.
|
1140
1242
|
If the web page you're on already has jQuery loaded, you can start executing jQuery scripts immediately.
|
@@ -1178,7 +1280,11 @@ self.execute_script("return jQuery('textarea')[2].value") # Returns the css "va
|
|
1178
1280
|
|
1179
1281
|
</details>
|
1180
1282
|
|
1181
|
-
|
1283
|
+
<h3>🔵 How to handle a restrictive CSP:</h3>
|
1284
|
+
|
1285
|
+
🛑 Some websites have a restrictive [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to prevent users from loading jQuery and other external libraries onto their websites. If you need to use jQuery or another JS library on such a website, add ``--disable-csp`` as a ``pytest`` command-line option.
|
1286
|
+
|
1287
|
+
<h3>🔵 More JavaScript fun:</h3>
|
1182
1288
|
|
1183
1289
|
<div></div>
|
1184
1290
|
<details>
|
@@ -1197,7 +1303,7 @@ self.click("a.analytics") # Clicks the generated button
|
|
1197
1303
|
|
1198
1304
|
</details>
|
1199
1305
|
|
1200
|
-
|
1306
|
+
<h3>🔵 How to use deferred asserts:</h3>
|
1201
1307
|
|
1202
1308
|
<p>Let's say you want to verify multiple different elements on a web page in a single test, but you don't want the test to fail until you verified several elements at once so that you don't have to rerun the test to find more missing elements on the same page. That's where deferred asserts come in. Here's the example:</p>
|
1203
1309
|
|
@@ -1206,7 +1312,6 @@ from seleniumbase import BaseCase
|
|
1206
1312
|
BaseCase.main(__name__, __file__)
|
1207
1313
|
|
1208
1314
|
class MyTestClass(BaseCase):
|
1209
|
-
|
1210
1315
|
def test_deferred_asserts(self):
|
1211
1316
|
self.open('https://xkcd.com/993/')
|
1212
1317
|
self.wait_for_element('#comic')
|
@@ -1222,7 +1327,7 @@ class MyTestClass(BaseCase):
|
|
1222
1327
|
<code>deferred_assert_element()</code> and <code>deferred_assert_text()</code> will save any exceptions that would be raised.
|
1223
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.
|
1224
1329
|
|
1225
|
-
|
1330
|
+
<h3>🔵 How to access raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a>:</h3>
|
1226
1331
|
|
1227
1332
|
<p>If you need access to any commands that come with standard <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a>, you can call them directly like this:</p>
|
1228
1333
|
|
@@ -1234,9 +1339,9 @@ self.driver.find_elements("partial link text", "GitHub")
|
|
1234
1339
|
|
1235
1340
|
(In general, you'll want to use the SeleniumBase versions of methods when available.)
|
1236
1341
|
|
1237
|
-
|
1342
|
+
<h3>🔵 How to retry failing tests automatically:</h3>
|
1238
1343
|
|
1239
|
-
<p>You can use <code
|
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>
|
1240
1345
|
|
1241
1346
|
```bash
|
1242
1347
|
pytest --reruns=1 --reruns-delay=1
|
@@ -1244,10 +1349,15 @@ pytest --reruns=1 --reruns-delay=1
|
|
1244
1349
|
|
1245
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>
|
1246
1351
|
|
1352
|
+
--------
|
1247
1353
|
|
1248
|
-
|
1354
|
+
> "Catch bugs in QA before deploying code to Production!"
|
1249
1355
|
|
1250
|
-
<
|
1356
|
+
<p align="left"><a href="https://seleniumbase.io/error_page" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/error_page.gif" alt="Catch bugs in QA before deploying code to Production!" title="Catch bugs in QA before deploying code to Production!" /></a></p>
|
1357
|
+
|
1358
|
+
--------
|
1359
|
+
|
1360
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Wrap-Up</h3>
|
1251
1361
|
|
1252
1362
|
<p>
|
1253
1363
|
<div><b>If you see something, say something!</b></div>
|
@@ -1267,9 +1377,9 @@ pytest --reruns=1 --reruns-delay=1
|
|
1267
1377
|
<p><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a></p>
|
1268
1378
|
|
1269
1379
|
<p><div>
|
1270
|
-
<span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="
|
1271
|
-
<span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="
|
1272
|
-
<span><a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://seleniumbase.github.io/img/social/share_gitter.svg" title="SeleniumBase on Gitter" alt="SeleniumBase on Gitter" width="
|
1380
|
+
<span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="70" /></a></span>
|
1381
|
+
<span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="64" /></a></span>
|
1382
|
+
<span><a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://seleniumbase.github.io/img/social/share_gitter.svg" title="SeleniumBase on Gitter" alt="SeleniumBase on Gitter" width="52" /></a></span>
|
1273
1383
|
</div></p>
|
1274
1384
|
|
1275
1385
|
--------
|