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.
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/PKG-INFO +35 -35
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/README.md +34 -34
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/ReadMe.md +5 -5
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/hack_the_planet.py +2 -2
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_browser_launcher.py +3 -3
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_driver_context.py +3 -3
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/uc_cdp_events.py +8 -9
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/verify_undetected.py +3 -1
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/behave_gui.md +3 -3
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/commander.md +3 -3
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/customizing_test_runs.md +4 -4
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/demo_mode.md +4 -4
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/method_summary.md +37 -28
- seleniumbase-4.16.3/help_docs/mysql_installation.md +94 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/syntax_formats.md +53 -55
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/ReadMe.md +5 -5
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs.yml +0 -1
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/requirements.txt +6 -5
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/requirements.txt +10 -10
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/sbase/steps.py +65 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/behave/behave_helper.py +29 -1
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/exceptions.py +6 -1
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_install.py +20 -4
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/browser_launcher.py +63 -8
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/recorder_helper.py +29 -1
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/base_case.py +238 -10
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/page_actions.py +131 -4
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/shared_utils.py +5 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/words.py +15 -1
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/chinese.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/dutch.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/french.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/italian.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/japanese.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/korean.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/master_dict.py +25 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/portuguese.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/russian.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/spanish.py +4 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/patcher.py +5 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/PKG-INFO +35 -35
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/SOURCES.txt +0 -2
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/requires.txt +10 -10
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/setup.py +10 -10
- seleniumbase-4.16.1/.travis.yml +0 -42
- seleniumbase-4.16.1/help_docs/mysql_installation.md +0 -62
- seleniumbase-4.16.1/mkdocs_build/index.html +0 -13
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/Workflows.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/pages.yml +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-nightly-mac.yml +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-nightly-ubuntu.yml +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-nightly-windows.yml +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-package-legacy.yml +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.github/workflows/python-package.yml +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/.gitignore +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/CHANGELOG.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/CNAME +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/CODE_OF_CONDUCT.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/CONTRIBUTING.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/Dockerfile +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/LICENSE +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/MANIFEST.in +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/SECURITY.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/_config.yml +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/azure-pipelines.yml +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/basic_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/behave.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/behave.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/calculator.feature +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/environment.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/fail_page.feature +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/realworld.feature +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/calculator.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/fail_page.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/imported.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/behave_bdd/features/swag_labs.feature +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/base_test_case.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/boilerplate_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/classic_obj_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/page_objects.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/file_parsing/qa_login_example.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/file_parsing/staging_login_example.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/google_objects.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/google_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/sb_swag_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/swag_labs_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/samples/test_page_objects.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/boilerplates/sb_fixture_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/mac_cap_file.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/sample_cap_file_BS.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/sample_cap_file_SL.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/selenoid_cap_file.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/capabilities/win10_cap_file.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/basic_test.MyTestClass.test_basics.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/my_first_test.MyTestClass.test_swag_labs.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/shadow_root_test.ShadowRootTest.test_shadow_root.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_assert_elements.ListAssertTests.test_assert_list_of_elements.md +0 -0
- {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
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_demo_site.DemoSiteTests.test_demo_site.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_login.SwagLabsLoginTests.test_swag_labs_login.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_plans/test_mfa_login.TestMFALogin.test_mfa_login.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/case_summary.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/chart_presentation.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/my_chart.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/pie_charts.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_area_chart.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_display_chart.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_line_chart.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_multi_series.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/chart_maker/test_save_chart.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/coffee_cart_tests.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/custom_settings.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/desktop_apps/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/desktop_apps/recorder.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/dialog_boxes/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/dialog_boxes/dialog_box_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/edge_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_config.cfg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_logs/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_logs/basic_test_info.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_logs/page_source.html +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/example_logs/screenshot.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/github_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/gui_test_runner.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/handle_alert_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/iframe_tests.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/locale_code_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/basic_masterqa_test_0.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/masterqa_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/master_qa/pytest.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/example_spec.js +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/example_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/input_spec.js +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/input_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/mat_paginator_spec.js +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/protractor/mat_paginator_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/messy_raw.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/pytest.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/refined_raw.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/migration/raw_selenium/simple_sbase.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/my_first_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/nth_child_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/demo_page.html +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/load_html_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/test_demo_page.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/test_handle_alerts.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/test_request_fixture.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/offline_examples/test_user_agent.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/old_wordle_script.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/parameterized_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/performance_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/core_presentation.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/edge_presentation.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/fundamentals.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/my_presentation.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/presenter/py_virtual_envs.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/proxy_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/pytest.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/rate_limiting_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_call.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_file_call.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_main_call.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_parameter_script.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_sb.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/raw_test_scripts.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/setup.cfg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/shadow_root_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/swag_labs_user_tests.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_apple_site.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_assert_elements.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_calculator.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_canvas.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_checkboxes.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_chinese_pdf.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_chromedriver.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_coffee_cart.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_console_logging.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_contains_selector.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_cycle_elements.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_decryption.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_deferred_asserts.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_demo_site.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_detect_404s.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_docs_site.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_double_click.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_download_files.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_download_images.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_drag_and_drop.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_error_page.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_event_firing.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_fail.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_geolocation.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_get_locale_code.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_get_pdf_text.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_get_user_agent.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_hack_search.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_image_saving.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_inspect_html.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_login.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_markers.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_mfa_login.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_multiple_drivers.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_null.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_override_driver.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_override_sb_fixture.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_parse_soup.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_pdf_asserts.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_pytest_parametrize.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_repeat_tests.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_request_sb_fixture.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_save_screenshots.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_sb_fixture.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_scrape_bing.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_select_options.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_shadow_dom.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_show_file_choosers.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_skype_site.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_suite.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_swag_labs.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_tinymce.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_todomvc.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_url_asserts.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_usefixtures.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_verify_chromedriver.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_window_switching.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_xfail.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/test_xkcd.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/time_limit_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/bootstrap_google_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/driverjs_maps_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/google_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/hopscotch_google_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/introjs_google_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/maps_introjs_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/octocat_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/shepherd_google_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/tour_examples/xkcd_tour.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/chinese_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/dutch_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/english_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/french_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/italian_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/japanese_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/korean_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/portuguese_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/pytest.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/russian_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/translations/spanish_test_1.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/unit_tests/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/unit_tests/verify_framework.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/upgrade_chromedriver.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/upload_file_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/user_agent_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/layout_test.VisualLayoutTests.test_applitools_layout_change.md +0 -0
- {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
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_applitools_change.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/test_layout_fail.VisualLayoutFailureTests.test_xkcd_logo_change.md +0 -0
- {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
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/case_plans/xkcd_visual_test.VisualLayoutTests.test_xkcd_layout_change.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/layout_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/python_home_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/test_layout_fail.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/visual_testing/xkcd_visual_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/wordle_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/xpath_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/examples/youtube_search_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/case_plans.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/chinese.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/desired_capabilities.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/features_list.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/happy_customers.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/hidden_files_info.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/how_it_works.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/html_inspector.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/install.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/install_python_pip_git.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/js_package_manager.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/locale_codes.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/mobile_testing.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/recorder_mode.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/shadow_dom.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/thank_you.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/translations.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/useful_grep_commands.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/using_safari_driver.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/verify_webdriver.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/virtualenv_instructions.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/help_docs/webdriver_installation.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/install.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/azure/azure_pipelines/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/azure/jenkins/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/behave.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/behave.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/calculator.feature +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/environment.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/fail_page.feature +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/realworld.feature +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/calculator.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/fail_page.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/real_world.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/steps/swag_labs.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/behave/features/swag_labs.feature +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/brython/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/brython/index.html +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/brython/index.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/brython/library.html +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/docker-entrypoint.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/docker_config.cfg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/run_docker_test_in_chrome.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/docker/run_docker_test_in_firefox.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/github/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/github/workflows/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/github/workflows/extras.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/google_cloud/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/katalon/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/Linuxfile.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/Xvfb_launcher.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/jenkins_permissions.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/linux/tomcat_permissions.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/index.html +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/my_first_test.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/npm-shrinkwrap.json +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/package.json +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/server.js +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/node_js/test_demo_site.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/selenium_grid/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/integrations/selenium_ide/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/ReadMe.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/docs_instructions.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/dash_pie.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/dash_pie_2.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/dash_pie_3.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/favicon.ico +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/grad_logo.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/green_icon.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/green_logo.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/green_logo2.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/green_logo3.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo3.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo3a.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo3b.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo3c.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo4.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo5.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo6.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/logo7.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/sb_icon.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/sb_logo_10.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/sb_logo_7.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/side_by_side.png +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_facebook.svg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_github.svg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_gitter.svg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_instagram.svg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/img/social/share_twitter.svg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/mkdocs_build/prepare.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/pytest.ini +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/sbase/ReadMe.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/sbase/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/sbase/__main__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/drivers/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/masterqa/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/resources/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/resources/favicon.ico +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_ide/ReadMe.md +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/setup.cfg +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/virtualenv_install.sh +0 -0
- {seleniumbase-4.16.1 → seleniumbase-4.16.3}/win_install.bat +0 -0
- {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.
|
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>
|
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>
|
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:
|
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:
|
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:
|
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:
|
27
|
-
When Click link "Sign out" # ../../sbase/steps.py:
|
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 = "
|
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("
|
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"
|
11
|
-
page_actions.wait_for_element(driver, "2"
|
12
|
-
page_actions.wait_for_text(driver, "42", "output"
|
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"
|
14
|
-
page_actions.wait_for_element(driver, "2"
|
15
|
-
page_actions.wait_for_text(driver, "42", "output"
|
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:
|