seleniumbase 4.33.6__tar.gz → 4.33.8__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {seleniumbase-4.33.6/seleniumbase.egg-info → seleniumbase-4.33.8}/PKG-INFO +1 -1
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_pixelscan.py +1 -1
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_recaptcha.py +4 -2
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/browser_launcher.py +48 -29
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/log_helper.py +10 -4
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/proxy_helper.py +35 -30
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/sb_cdp.py +82 -24
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/settings_parser.py +2 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/base_case.py +36 -37
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/js_utils.py +2 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/shared_utils.py +11 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/pytest_plugin.py +19 -2
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp_driver/config.py +0 -1
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp_driver/element.py +13 -14
- {seleniumbase-4.33.6 → seleniumbase-4.33.8/seleniumbase.egg-info}/PKG-INFO +1 -1
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/.gitignore +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/LICENSE +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/MANIFEST.in +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/README.md +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/basic_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/behave_bdd/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/behave_bdd/features/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/behave_bdd/features/environment.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/behave_bdd/features/steps/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/behave_bdd/features/steps/calculator.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/behave_bdd/features/steps/fail_page.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/behave_bdd/features/steps/imported.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/behave_bdd/features/steps/swag_labs.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/base_test_case.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/boilerplate_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/classic_obj_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/page_objects.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/samples/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/samples/file_parsing/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/samples/file_parsing/parse_files.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/samples/google_objects.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/samples/google_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/samples/sb_swag_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/samples/swag_labs_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/samples/test_page_objects.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/boilerplates/sb_fixture_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/capabilities/mac_cap_file.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/capabilities/sample_cap_file_BS.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/capabilities/sample_cap_file_SL.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/capabilities/selenoid_cap_file.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/capabilities/win10_cap_file.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/chart_maker/chart_presentation.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/chart_maker/my_chart.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/chart_maker/pie_charts.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/chart_maker/test_area_chart.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/chart_maker/test_display_chart.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/chart_maker/test_line_chart.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/chart_maker/test_multi_series.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/chart_maker/test_save_chart.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/coffee_cart_tests.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/custom_settings.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/desktop_apps/recorder.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/dialog_boxes/dialog_box_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/edge_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/github_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/gui_test_runner.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/hack_the_planet.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/handle_alert_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/iframe_tests.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/locale_code_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/master_qa/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/master_qa/basic_masterqa_test_0.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/master_qa/masterqa_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/protractor/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/protractor/example_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/protractor/input_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/protractor/mat_paginator_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/raw_selenium/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/raw_selenium/flaky_messy_raw.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/raw_selenium/long_messy_raw.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/raw_selenium/messy_raw.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/raw_selenium/refined_raw.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/migration/raw_selenium/simple_sbase.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/my_first_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/nth_child_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/offline_examples/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/offline_examples/load_html_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/offline_examples/test_demo_page.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/offline_examples/test_extended_driver.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/offline_examples/test_handle_alerts.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/offline_examples/test_request_fixture.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/offline_examples/test_user_agent.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/old_wordle_script.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/parameterized_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/performance_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/presenter/core_presentation.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/presenter/edge_presentation.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/presenter/fundamentals.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/presenter/multi_uc.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/presenter/my_presentation.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/presenter/py_virtual_envs.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/presenter/uc_presentation.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/presenter/uc_presentation_3.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/proxy_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/rate_limiting_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_ahrefs.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_antibot_login.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_bing_captcha.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_block.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_brotector_captcha.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_call.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_cdp_logging.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_cf.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_cookies.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_detection.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_driver_context.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_driver_manager.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_file_call.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_form_turnstile.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_games.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_gui_click.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_hobbit.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_login_context.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_login_driver.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_login_sb.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_main_call.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_mobile.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_multi_drivers.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_nopecha.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_order_tickets.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_parameter_script.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_performance_logs.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_pyautogui.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_robot.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_sb.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_test_scripts.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_turnstile.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/raw_uc_mode.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/sb_fixture_tests.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/shadow_root_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/swag_labs_user_tests.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_3d_apis.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_apple_site.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_assert_elements.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_calculator.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_canvas.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_cdp_ad_blocking.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_checkboxes.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_chinese_pdf.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_chromedriver.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_coffee_cart.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_console_logging.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_contains_selector.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_cycle_elements.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_decryption.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_deferred_asserts.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_demo_site.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_detect_404s.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_docs_site.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_double_click.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_download_files.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_download_images.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_drag_and_drop.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_error_page.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_event_firing.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_fail.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_geolocation.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_get_coffee.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_get_locale_code.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_get_pdf_text.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_get_user_agent.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_hack_search.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_highlight_elements.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_image_saving.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_inspect_html.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_login.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_markers.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_mfa_login.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_multiple_drivers.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_null.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_override_driver.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_override_sb_fixture.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_parse_soup.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_pdf_asserts.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_pytest_parametrize.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_repeat_tests.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_request_sb_fixture.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_save_screenshots.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_sb_fixture.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_scrape_bing.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_select_options.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_shadow_dom.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_show_file_choosers.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_simple_login.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_skype_site.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_suite.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_swag_labs.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_tinymce.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_todomvc.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_url_asserts.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_usefixtures.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_verify_chromedriver.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_window_switching.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_xfail.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/test_xkcd.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/time_limit_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/bootstrap_google_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/bootstrap_xkcd_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/driverjs_maps_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/google_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/hopscotch_google_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/introjs_google_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/maps_introjs_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/octocat_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/recordings/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/recordings/shepherd_google_tour_rec.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/shepherd_google_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/tour_examples/xkcd_tour.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/chinese_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/dutch_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/english_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/french_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/italian_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/japanese_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/korean_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/portuguese_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/russian_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/translations/spanish_test_1.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/uc_cdp_events.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/unit_tests/verify_framework.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/upgrade_chromedriver.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/upload_file_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/user_agent_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/verify_undetected.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/visual_testing/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/visual_testing/layout_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/visual_testing/python_home_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/visual_testing/test_layout_fail.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/visual_testing/xkcd_visual_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/wordle_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/xpath_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/examples/youtube_search_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/install.sh +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/behave/features/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/behave/features/environment.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/behave/features/steps/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/behave/features/steps/calculator.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/behave/features/steps/fail_page.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/behave/features/steps/real_world.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/behave/features/steps/swag_labs.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/brython/index.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/node_js/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/node_js/my_first_test.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/integrations/node_js/test_demo_site.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/mkdocs_build/prepare.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/pyproject.toml +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/pytest.ini +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/requirements.txt +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/sbase/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/sbase/__main__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/sbase/steps.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase.egg-info/requires.txt +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/setup.cfg +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/setup.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/site/prepare.py +0 -0
- {seleniumbase-4.33.6 → seleniumbase-4.33.8}/virtualenv_install.sh +0 -0
@@ -1,7 +1,7 @@
|
|
1
1
|
from seleniumbase import SB
|
2
2
|
|
3
3
|
with SB(uc=True, incognito=True, test=True) as sb:
|
4
|
-
sb.driver.uc_open_with_reconnect("https://pixelscan.net/",
|
4
|
+
sb.driver.uc_open_with_reconnect("https://pixelscan.net/", 7)
|
5
5
|
sb.remove_elements("div.banner") # Remove the banner
|
6
6
|
sb.remove_elements("jdiv") # Remove chat widgets
|
7
7
|
no_automation_detected = "No automation framework detected"
|
@@ -1,16 +1,18 @@
|
|
1
1
|
from seleniumbase import SB
|
2
2
|
|
3
|
-
with SB(uc=True, test=True) as sb:
|
3
|
+
with SB(uc=True, test=True, incognito=True) as sb:
|
4
4
|
url = "https://seleniumbase.io/apps/recaptcha"
|
5
5
|
sb.activate_cdp_mode(url)
|
6
|
+
sb.sleep(1)
|
6
7
|
sb.uc_gui_handle_captcha() # Try with TAB + SPACEBAR
|
7
8
|
sb.assert_element("img#captcha-success", timeout=3)
|
8
9
|
sb.set_messenger_theme(location="top_left")
|
9
10
|
sb.post_message("SeleniumBase wasn't detected", duration=3)
|
10
11
|
|
11
|
-
with SB(uc=True, test=True) as sb:
|
12
|
+
with SB(uc=True, test=True, incognito=True) as sb:
|
12
13
|
url = "https://seleniumbase.io/apps/recaptcha"
|
13
14
|
sb.activate_cdp_mode(url)
|
15
|
+
sb.sleep(1)
|
14
16
|
sb.uc_gui_click_captcha('iframe[src*="/recaptcha/"]')
|
15
17
|
sb.assert_element("img#captcha-success", timeout=3)
|
16
18
|
sb.set_messenger_theme(location="top_left")
|
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.33.
|
2
|
+
__version__ = "4.33.8"
|
@@ -658,6 +658,7 @@ def uc_open_with_cdp_mode(driver, url=None):
|
|
658
658
|
cdp.get_window = CDPM.get_window
|
659
659
|
cdp.get_element_attributes = CDPM.get_element_attributes
|
660
660
|
cdp.get_element_attribute = CDPM.get_element_attribute
|
661
|
+
cdp.get_attribute = CDPM.get_attribute
|
661
662
|
cdp.get_element_html = CDPM.get_element_html
|
662
663
|
cdp.get_element_rect = CDPM.get_element_rect
|
663
664
|
cdp.get_element_size = CDPM.get_element_size
|
@@ -1413,7 +1414,7 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1413
1414
|
ctype = "cf_t"
|
1414
1415
|
else:
|
1415
1416
|
return
|
1416
|
-
if not driver.is_connected():
|
1417
|
+
if not driver.is_connected() and not __is_cdp_swap_needed(driver):
|
1417
1418
|
driver.connect()
|
1418
1419
|
time.sleep(2)
|
1419
1420
|
install_pyautogui_if_missing(driver)
|
@@ -1425,7 +1426,10 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1425
1426
|
)
|
1426
1427
|
with gui_lock: # Prevent issues with multiple processes
|
1427
1428
|
needs_switch = False
|
1428
|
-
|
1429
|
+
if not __is_cdp_swap_needed(driver):
|
1430
|
+
is_in_frame = js_utils.is_in_frame(driver)
|
1431
|
+
else:
|
1432
|
+
is_in_frame = False
|
1429
1433
|
selector = "#challenge-stage"
|
1430
1434
|
if ctype == "g_rc":
|
1431
1435
|
selector = "#recaptcha-token"
|
@@ -1433,7 +1437,7 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1433
1437
|
driver.switch_to.parent_frame()
|
1434
1438
|
needs_switch = True
|
1435
1439
|
is_in_frame = js_utils.is_in_frame(driver)
|
1436
|
-
if not is_in_frame:
|
1440
|
+
if not is_in_frame and not __is_cdp_swap_needed(driver):
|
1437
1441
|
# Make sure the window is on top
|
1438
1442
|
page_actions.switch_to_window(
|
1439
1443
|
driver, driver.current_window_handle, 2, uc_lock=False
|
@@ -1500,17 +1504,18 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1500
1504
|
and frame == "iframe"
|
1501
1505
|
):
|
1502
1506
|
frame = 'iframe[title="reCAPTCHA"]'
|
1503
|
-
if not
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1507
|
-
|
1508
|
-
|
1509
|
-
|
1510
|
-
if
|
1511
|
-
driver.
|
1512
|
-
|
1513
|
-
|
1507
|
+
if not __is_cdp_swap_needed(driver):
|
1508
|
+
if not is_in_frame or needs_switch:
|
1509
|
+
# Currently not in frame (or nested frame outside CF one)
|
1510
|
+
try:
|
1511
|
+
if visible_iframe or ctype == "g_rc":
|
1512
|
+
driver.switch_to_frame(frame)
|
1513
|
+
except Exception:
|
1514
|
+
if visible_iframe or ctype == "g_rc":
|
1515
|
+
if driver.is_element_present("iframe"):
|
1516
|
+
driver.switch_to_frame("iframe")
|
1517
|
+
else:
|
1518
|
+
return
|
1514
1519
|
try:
|
1515
1520
|
selector = "div.cf-turnstile"
|
1516
1521
|
if ctype == "g_rc":
|
@@ -1526,11 +1531,11 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1526
1531
|
tab_count += 1
|
1527
1532
|
time.sleep(0.027)
|
1528
1533
|
active_element_css = js_utils.get_active_element_css(driver)
|
1529
|
-
print(active_element_css)
|
1530
1534
|
if (
|
1531
1535
|
active_element_css.startswith(selector)
|
1532
1536
|
or active_element_css.endswith(" > div" * 2)
|
1533
1537
|
or (special_form and active_element_css.endswith(" div"))
|
1538
|
+
or (ctype == "g_rc" and "frame[name" in active_element_css)
|
1534
1539
|
):
|
1535
1540
|
found_checkbox = True
|
1536
1541
|
sb_config._saved_cf_tab_count = tab_count
|
@@ -1550,6 +1555,7 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1550
1555
|
)
|
1551
1556
|
and hasattr(sb_config, "_saved_cf_tab_count")
|
1552
1557
|
and sb_config._saved_cf_tab_count
|
1558
|
+
and not __is_cdp_swap_needed(driver)
|
1553
1559
|
):
|
1554
1560
|
driver.uc_open_with_disconnect(driver.current_url, 3.8)
|
1555
1561
|
with suppress(Exception):
|
@@ -1764,17 +1770,27 @@ def _add_chrome_proxy_extension(
|
|
1764
1770
|
):
|
1765
1771
|
# Single-threaded
|
1766
1772
|
if zip_it:
|
1767
|
-
|
1768
|
-
|
1769
|
-
|
1770
|
-
|
1771
|
-
|
1773
|
+
proxy_zip_lock = fasteners.InterProcessLock(PROXY_ZIP_LOCK)
|
1774
|
+
with proxy_zip_lock:
|
1775
|
+
proxy_helper.create_proxy_ext(
|
1776
|
+
proxy_string, proxy_user, proxy_pass, bypass_list
|
1777
|
+
)
|
1778
|
+
proxy_zip = proxy_helper.PROXY_ZIP_PATH
|
1779
|
+
chrome_options.add_extension(proxy_zip)
|
1772
1780
|
else:
|
1773
|
-
|
1774
|
-
|
1775
|
-
|
1776
|
-
|
1777
|
-
|
1781
|
+
proxy_dir_lock = fasteners.InterProcessLock(PROXY_DIR_LOCK)
|
1782
|
+
with proxy_dir_lock:
|
1783
|
+
proxy_helper.create_proxy_ext(
|
1784
|
+
proxy_string,
|
1785
|
+
proxy_user,
|
1786
|
+
proxy_pass,
|
1787
|
+
bypass_list,
|
1788
|
+
zip_it=False,
|
1789
|
+
)
|
1790
|
+
proxy_dir_path = proxy_helper.PROXY_DIR_PATH
|
1791
|
+
chrome_options = add_chrome_ext_dir(
|
1792
|
+
chrome_options, proxy_dir_path
|
1793
|
+
)
|
1778
1794
|
else:
|
1779
1795
|
# Multi-threaded
|
1780
1796
|
if zip_it:
|
@@ -1803,7 +1819,7 @@ def _add_chrome_proxy_extension(
|
|
1803
1819
|
proxy_user,
|
1804
1820
|
proxy_pass,
|
1805
1821
|
bypass_list,
|
1806
|
-
False,
|
1822
|
+
zip_it=False,
|
1807
1823
|
)
|
1808
1824
|
chrome_options = add_chrome_ext_dir(
|
1809
1825
|
chrome_options, proxy_helper.PROXY_DIR_PATH
|
@@ -2306,7 +2322,6 @@ def _set_chrome_options(
|
|
2306
2322
|
chrome_options.add_argument("--disable-ipc-flooding-protection")
|
2307
2323
|
chrome_options.add_argument("--disable-password-generation")
|
2308
2324
|
chrome_options.add_argument("--disable-domain-reliability")
|
2309
|
-
chrome_options.add_argument("--disable-component-update")
|
2310
2325
|
chrome_options.add_argument("--disable-breakpad")
|
2311
2326
|
included_disabled_features = []
|
2312
2327
|
included_disabled_features.append("OptimizationHints")
|
@@ -4056,7 +4071,6 @@ def get_local_driver(
|
|
4056
4071
|
edge_options.add_argument("--disable-ipc-flooding-protection")
|
4057
4072
|
edge_options.add_argument("--disable-password-generation")
|
4058
4073
|
edge_options.add_argument("--disable-domain-reliability")
|
4059
|
-
edge_options.add_argument("--disable-component-update")
|
4060
4074
|
edge_options.add_argument("--disable-breakpad")
|
4061
4075
|
included_disabled_features = []
|
4062
4076
|
included_disabled_features.append("OptimizationHints")
|
@@ -4845,7 +4859,12 @@ def get_local_driver(
|
|
4845
4859
|
)
|
4846
4860
|
uc_activated = True
|
4847
4861
|
except URLError as e:
|
4848
|
-
if
|
4862
|
+
if (
|
4863
|
+
IS_MAC
|
4864
|
+
and hasattr(e, "args")
|
4865
|
+
and isinstance(e.args, (list, tuple))
|
4866
|
+
and cert in e.args[0]
|
4867
|
+
):
|
4849
4868
|
mac_certificate_error = True
|
4850
4869
|
else:
|
4851
4870
|
raise
|
@@ -7,6 +7,7 @@ from contextlib import suppress
|
|
7
7
|
from seleniumbase import config as sb_config
|
8
8
|
from seleniumbase.config import settings
|
9
9
|
from seleniumbase.fixtures import constants
|
10
|
+
from seleniumbase.fixtures import shared_utils
|
10
11
|
|
11
12
|
python3_11_or_newer = False
|
12
13
|
if sys.version_info >= (3, 11):
|
@@ -33,6 +34,8 @@ def log_screenshot(test_logpath, driver, screenshot=None, get=False):
|
|
33
34
|
if screenshot != screenshot_warning:
|
34
35
|
with open(screenshot_path, "wb") as file:
|
35
36
|
file.write(screenshot)
|
37
|
+
with suppress(Exception):
|
38
|
+
shared_utils.make_writable(screenshot_path)
|
36
39
|
else:
|
37
40
|
print("WARNING: %s" % screenshot_warning)
|
38
41
|
if get:
|
@@ -282,13 +285,14 @@ def log_test_failure_data(test, test_logpath, driver, browser, url=None):
|
|
282
285
|
sb_config._report_time = the_time
|
283
286
|
sb_config._report_traceback = traceback_message
|
284
287
|
sb_config._report_exception = exc_message
|
285
|
-
|
286
|
-
|
288
|
+
if not os.path.exists(test_logpath):
|
289
|
+
with suppress(Exception):
|
287
290
|
os.makedirs(test_logpath)
|
288
291
|
with suppress(Exception):
|
289
292
|
log_file = codecs.open(basic_file_path, "w+", encoding="utf-8")
|
290
293
|
log_file.writelines("\r\n".join(data_to_save))
|
291
294
|
log_file.close()
|
295
|
+
shared_utils.make_writable(basic_file_path)
|
292
296
|
|
293
297
|
|
294
298
|
def log_skipped_test_data(test, test_logpath, driver, browser, reason):
|
@@ -343,6 +347,7 @@ def log_skipped_test_data(test, test_logpath, driver, browser, reason):
|
|
343
347
|
log_file = codecs.open(file_path, "w+", encoding="utf-8")
|
344
348
|
log_file.writelines("\r\n".join(data_to_save))
|
345
349
|
log_file.close()
|
350
|
+
shared_utils.make_writable(file_path)
|
346
351
|
|
347
352
|
|
348
353
|
def log_page_source(test_logpath, driver, source=None):
|
@@ -365,14 +370,15 @@ def log_page_source(test_logpath, driver, source=None):
|
|
365
370
|
"unresponsive, or closed prematurely!</h4>"
|
366
371
|
)
|
367
372
|
)
|
368
|
-
|
369
|
-
|
373
|
+
if not os.path.exists(test_logpath):
|
374
|
+
with suppress(Exception):
|
370
375
|
os.makedirs(test_logpath)
|
371
376
|
html_file_path = os.path.join(test_logpath, html_file_name)
|
372
377
|
with suppress(Exception):
|
373
378
|
html_file = codecs.open(html_file_path, "w+", encoding="utf-8")
|
374
379
|
html_file.write(page_source)
|
375
380
|
html_file.close()
|
381
|
+
shared_utils.make_writable(html_file_path)
|
376
382
|
|
377
383
|
|
378
384
|
def get_test_id(test):
|
@@ -2,10 +2,12 @@ import os
|
|
2
2
|
import re
|
3
3
|
import warnings
|
4
4
|
import zipfile
|
5
|
+
from contextlib import suppress
|
5
6
|
from seleniumbase.config import proxy_list
|
6
7
|
from seleniumbase.config import settings
|
7
8
|
from seleniumbase.fixtures import constants
|
8
9
|
from seleniumbase.fixtures import page_utils
|
10
|
+
from seleniumbase.fixtures import shared_utils
|
9
11
|
|
10
12
|
DOWNLOADS_DIR = constants.Files.DOWNLOADS_FOLDER
|
11
13
|
PROXY_ZIP_PATH = os.path.join(DOWNLOADS_DIR, "proxy.zip")
|
@@ -109,31 +111,35 @@ def create_proxy_ext(
|
|
109
111
|
""""minimum_chrome_version":"22.0.0"\n"""
|
110
112
|
"""}"""
|
111
113
|
)
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
proxy_ext_dir
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
114
|
+
abs_path = os.path.abspath(".")
|
115
|
+
downloads_path = os.path.join(abs_path, DOWNLOADS_DIR)
|
116
|
+
if not os.path.exists(downloads_path):
|
117
|
+
os.mkdir(downloads_path)
|
118
|
+
if zip_it:
|
119
|
+
zf = zipfile.ZipFile(PROXY_ZIP_PATH, mode="w")
|
120
|
+
zf.writestr("background.js", background_js)
|
121
|
+
zf.writestr("manifest.json", manifest_json)
|
122
|
+
zf.close()
|
123
|
+
with suppress(Exception):
|
124
|
+
shared_utils.make_writable(PROXY_ZIP_PATH)
|
125
|
+
else:
|
126
|
+
proxy_ext_dir = PROXY_DIR_PATH
|
127
|
+
if not os.path.exists(proxy_ext_dir):
|
128
|
+
os.mkdir(proxy_ext_dir)
|
129
|
+
with suppress(Exception):
|
130
|
+
shared_utils.make_writable(proxy_ext_dir)
|
131
|
+
manifest_file = os.path.join(proxy_ext_dir, "manifest.json")
|
132
|
+
with open(manifest_file, mode="w") as f:
|
133
|
+
f.write(manifest_json)
|
134
|
+
with suppress(Exception):
|
135
|
+
shared_utils.make_writable(manifest_json)
|
136
|
+
proxy_host = proxy_string.split(":")[0]
|
137
|
+
proxy_port = proxy_string.split(":")[1]
|
138
|
+
background_file = os.path.join(proxy_ext_dir, "background.js")
|
139
|
+
with open(background_file, mode="w") as f:
|
140
|
+
f.write(background_js)
|
141
|
+
with suppress(Exception):
|
142
|
+
shared_utils.make_writable(background_js)
|
137
143
|
|
138
144
|
|
139
145
|
def remove_proxy_zip_if_present():
|
@@ -141,13 +147,12 @@ def remove_proxy_zip_if_present():
|
|
141
147
|
Used in the implementation of https://stackoverflow.com/a/35293284
|
142
148
|
for https://stackoverflow.com/questions/12848327/
|
143
149
|
"""
|
144
|
-
|
145
|
-
|
150
|
+
if os.path.exists(PROXY_ZIP_PATH):
|
151
|
+
with suppress(Exception):
|
146
152
|
os.remove(PROXY_ZIP_PATH)
|
147
|
-
|
153
|
+
if os.path.exists(PROXY_ZIP_LOCK):
|
154
|
+
with suppress(Exception):
|
148
155
|
os.remove(PROXY_ZIP_LOCK)
|
149
|
-
except Exception:
|
150
|
-
pass
|
151
156
|
|
152
157
|
|
153
158
|
def validate_proxy_string(proxy_string):
|
@@ -83,6 +83,9 @@ class CDPMethods():
|
|
83
83
|
element.get_position = lambda: self.__get_position(element)
|
84
84
|
element.get_html = lambda: self.__get_html(element)
|
85
85
|
element.get_js_attributes = lambda: self.__get_js_attributes(element)
|
86
|
+
element.get_attribute = (
|
87
|
+
lambda attribute: self.__get_attribute(element, attribute)
|
88
|
+
)
|
86
89
|
return element
|
87
90
|
|
88
91
|
def get(self, url):
|
@@ -268,6 +271,7 @@ class CDPMethods():
|
|
268
271
|
if number < 0:
|
269
272
|
number = 0
|
270
273
|
element = elements[number]
|
274
|
+
element.scroll_into_view()
|
271
275
|
element.click()
|
272
276
|
|
273
277
|
def click_nth_visible_element(self, selector, number):
|
@@ -284,6 +288,7 @@ class CDPMethods():
|
|
284
288
|
if number < 0:
|
285
289
|
number = 0
|
286
290
|
element = elements[number]
|
291
|
+
element.scroll_into_view()
|
287
292
|
element.click()
|
288
293
|
|
289
294
|
def click_link(self, link_text):
|
@@ -311,6 +316,13 @@ class CDPMethods():
|
|
311
316
|
return result
|
312
317
|
|
313
318
|
def __flash(self, element, *args, **kwargs):
|
319
|
+
element.scroll_into_view()
|
320
|
+
if len(args) < 3 and "x_offset" not in kwargs:
|
321
|
+
x_offset = self.__get_x_scroll_offset()
|
322
|
+
kwargs["x_offset"] = x_offset
|
323
|
+
if len(args) < 3 and "y_offset" not in kwargs:
|
324
|
+
y_offset = self.__get_y_scroll_offset()
|
325
|
+
kwargs["y_offset"] = y_offset
|
314
326
|
return (
|
315
327
|
self.loop.run_until_complete(
|
316
328
|
element.flash_async(*args, **kwargs)
|
@@ -382,9 +394,9 @@ class CDPMethods():
|
|
382
394
|
)
|
383
395
|
|
384
396
|
def __scroll_into_view(self, element):
|
385
|
-
|
386
|
-
|
387
|
-
|
397
|
+
self.loop.run_until_complete(element.scroll_into_view_async())
|
398
|
+
self.__add_light_pause()
|
399
|
+
return None
|
388
400
|
|
389
401
|
def __select_option(self, element):
|
390
402
|
return (
|
@@ -431,6 +443,24 @@ class CDPMethods():
|
|
431
443
|
self.loop.run_until_complete(element.get_js_attributes_async())
|
432
444
|
)
|
433
445
|
|
446
|
+
def __get_attribute(self, element, attribute):
|
447
|
+
try:
|
448
|
+
return element.get_js_attributes()[attribute]
|
449
|
+
except Exception:
|
450
|
+
return None
|
451
|
+
|
452
|
+
def __get_x_scroll_offset(self):
|
453
|
+
x_scroll_offset = self.loop.run_until_complete(
|
454
|
+
self.page.evaluate("window.pageXOffset")
|
455
|
+
)
|
456
|
+
return x_scroll_offset or 0
|
457
|
+
|
458
|
+
def __get_y_scroll_offset(self):
|
459
|
+
y_scroll_offset = self.loop.run_until_complete(
|
460
|
+
self.page.evaluate("window.pageYOffset")
|
461
|
+
)
|
462
|
+
return y_scroll_offset or 0
|
463
|
+
|
434
464
|
def tile_windows(self, windows=None, max_columns=0):
|
435
465
|
"""Tile windows and return the grid of tiled windows."""
|
436
466
|
driver = self.driver
|
@@ -504,7 +534,7 @@ class CDPMethods():
|
|
504
534
|
def click(self, selector, timeout=settings.SMALL_TIMEOUT):
|
505
535
|
self.__slow_mode_pause_if_set()
|
506
536
|
element = self.find_element(selector, timeout=timeout)
|
507
|
-
|
537
|
+
element.scroll_into_view()
|
508
538
|
element.click()
|
509
539
|
self.__slow_mode_pause_if_set()
|
510
540
|
self.loop.run_until_complete(self.page.wait())
|
@@ -518,7 +548,9 @@ class CDPMethods():
|
|
518
548
|
|
519
549
|
def click_if_visible(self, selector):
|
520
550
|
if self.is_element_visible(selector):
|
521
|
-
self.find_element(selector)
|
551
|
+
element = self.find_element(selector)
|
552
|
+
element.scroll_into_view()
|
553
|
+
element.click()
|
522
554
|
self.__slow_mode_pause_if_set()
|
523
555
|
self.loop.run_until_complete(self.page.wait())
|
524
556
|
|
@@ -545,9 +577,10 @@ class CDPMethods():
|
|
545
577
|
except Exception:
|
546
578
|
continue
|
547
579
|
if (width != 0 or height != 0):
|
580
|
+
element.scroll_into_view()
|
548
581
|
element.click()
|
549
582
|
click_count += 1
|
550
|
-
time.sleep(0.
|
583
|
+
time.sleep(0.042)
|
551
584
|
self.__slow_mode_pause_if_set()
|
552
585
|
self.loop.run_until_complete(self.page.wait())
|
553
586
|
except Exception:
|
@@ -557,7 +590,7 @@ class CDPMethods():
|
|
557
590
|
"""(Attempt simulating a mouse click)"""
|
558
591
|
self.__slow_mode_pause_if_set()
|
559
592
|
element = self.find_element(selector, timeout=timeout)
|
560
|
-
|
593
|
+
element.scroll_into_view()
|
561
594
|
element.mouse_click()
|
562
595
|
self.__slow_mode_pause_if_set()
|
563
596
|
self.loop.run_until_complete(self.page.wait())
|
@@ -579,6 +612,7 @@ class CDPMethods():
|
|
579
612
|
|
580
613
|
def select_option_by_text(self, dropdown_selector, option):
|
581
614
|
element = self.find_element(dropdown_selector)
|
615
|
+
element.scroll_into_view()
|
582
616
|
options = element.query_selector_all("option")
|
583
617
|
for found_option in options:
|
584
618
|
if found_option.text.strip() == option.strip():
|
@@ -599,7 +633,10 @@ class CDPMethods():
|
|
599
633
|
"""Paint a quickly-vanishing dot over an element."""
|
600
634
|
selector = self.__convert_to_css_if_xpath(selector)
|
601
635
|
element = self.find_element(selector)
|
602
|
-
element.
|
636
|
+
element.scroll_into_view()
|
637
|
+
x_offset = self.__get_x_scroll_offset()
|
638
|
+
y_offset = self.__get_y_scroll_offset()
|
639
|
+
element.flash(duration, color, x_offset, y_offset)
|
603
640
|
if pause and isinstance(pause, (int, float)):
|
604
641
|
time.sleep(pause)
|
605
642
|
|
@@ -607,17 +644,22 @@ class CDPMethods():
|
|
607
644
|
"""Highlight an element with multi-colors."""
|
608
645
|
selector = self.__convert_to_css_if_xpath(selector)
|
609
646
|
element = self.find_element(selector)
|
610
|
-
element.
|
647
|
+
element.scroll_into_view()
|
648
|
+
x_offset = self.__get_x_scroll_offset()
|
649
|
+
y_offset = self.__get_y_scroll_offset()
|
650
|
+
element.flash(0.46, "44CC88", x_offset, y_offset)
|
611
651
|
time.sleep(0.15)
|
612
|
-
element.flash(0.42, "8844CC")
|
652
|
+
element.flash(0.42, "8844CC", x_offset, y_offset)
|
613
653
|
time.sleep(0.15)
|
614
|
-
element.flash(0.38, "CC8844")
|
654
|
+
element.flash(0.38, "CC8844", x_offset, y_offset)
|
615
655
|
time.sleep(0.15)
|
616
|
-
element.flash(0.30, "44CC88")
|
656
|
+
element.flash(0.30, "44CC88", x_offset, y_offset)
|
617
657
|
time.sleep(0.30)
|
618
658
|
|
619
659
|
def focus(self, selector):
|
620
|
-
self.find_element(selector)
|
660
|
+
element = self.find_element(selector)
|
661
|
+
element.scroll_into_view()
|
662
|
+
element.focus()
|
621
663
|
|
622
664
|
def highlight_overlay(self, selector):
|
623
665
|
self.find_element(selector).highlight_overlay()
|
@@ -646,7 +688,7 @@ class CDPMethods():
|
|
646
688
|
def send_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
|
647
689
|
self.__slow_mode_pause_if_set()
|
648
690
|
element = self.select(selector, timeout=timeout)
|
649
|
-
|
691
|
+
element.scroll_into_view()
|
650
692
|
if text.endswith("\n") or text.endswith("\r"):
|
651
693
|
text = text[:-1] + "\r\n"
|
652
694
|
element.send_keys(text)
|
@@ -657,7 +699,7 @@ class CDPMethods():
|
|
657
699
|
"""Similar to send_keys(), but presses keys at human speed."""
|
658
700
|
self.__slow_mode_pause_if_set()
|
659
701
|
element = self.select(selector, timeout=timeout)
|
660
|
-
|
702
|
+
element.scroll_into_view()
|
661
703
|
submit = False
|
662
704
|
if text.endswith("\n") or text.endswith("\r"):
|
663
705
|
submit = True
|
@@ -675,7 +717,7 @@ class CDPMethods():
|
|
675
717
|
"""Similar to send_keys(), but clears the text field first."""
|
676
718
|
self.__slow_mode_pause_if_set()
|
677
719
|
element = self.select(selector, timeout=timeout)
|
678
|
-
|
720
|
+
element.scroll_into_view()
|
679
721
|
with suppress(Exception):
|
680
722
|
element.clear_input()
|
681
723
|
if text.endswith("\n") or text.endswith("\r"):
|
@@ -688,8 +730,8 @@ class CDPMethods():
|
|
688
730
|
"""Similar to send_keys(), but clears the text field first."""
|
689
731
|
self.__slow_mode_pause_if_set()
|
690
732
|
selector = self.__convert_to_css_if_xpath(selector)
|
691
|
-
self.select(selector, timeout=timeout)
|
692
|
-
|
733
|
+
element = self.select(selector, timeout=timeout)
|
734
|
+
element.scroll_into_view()
|
693
735
|
press_enter = False
|
694
736
|
if text.endswith("\n"):
|
695
737
|
text = text[:-1]
|
@@ -980,8 +1022,10 @@ class CDPMethods():
|
|
980
1022
|
)
|
981
1023
|
|
982
1024
|
def get_element_attribute(self, selector, attribute):
|
983
|
-
|
984
|
-
|
1025
|
+
return self.get_element_attributes(selector)[attribute]
|
1026
|
+
|
1027
|
+
def get_attribute(self, selector, attribute):
|
1028
|
+
return self.find_element(selector).get_attribute(attribute)
|
985
1029
|
|
986
1030
|
def get_element_html(self, selector):
|
987
1031
|
selector = self.__convert_to_css_if_xpath(selector)
|
@@ -1655,17 +1699,24 @@ class CDPMethods():
|
|
1655
1699
|
raise Exception(error % (expected, actual))
|
1656
1700
|
|
1657
1701
|
def assert_text(
|
1658
|
-
self, text, selector="
|
1702
|
+
self, text, selector="body", timeout=settings.SMALL_TIMEOUT
|
1659
1703
|
):
|
1704
|
+
start_ms = time.time() * 1000.0
|
1705
|
+
stop_ms = start_ms + (timeout * 1000.0)
|
1660
1706
|
text = text.strip()
|
1661
1707
|
element = None
|
1662
1708
|
try:
|
1663
1709
|
element = self.find_element(selector, timeout=timeout)
|
1664
1710
|
except Exception:
|
1665
1711
|
raise Exception("Element {%s} not found!" % selector)
|
1666
|
-
for i in range(
|
1712
|
+
for i in range(int(timeout * 10)):
|
1713
|
+
with suppress(Exception):
|
1714
|
+
element = self.find_element(selector, timeout=0.1)
|
1667
1715
|
if text in element.text_all:
|
1668
1716
|
return True
|
1717
|
+
now_ms = time.time() * 1000.0
|
1718
|
+
if now_ms >= stop_ms:
|
1719
|
+
break
|
1669
1720
|
time.sleep(0.1)
|
1670
1721
|
raise Exception(
|
1671
1722
|
"Text {%s} not found in {%s}! Actual text: {%s}"
|
@@ -1673,20 +1724,27 @@ class CDPMethods():
|
|
1673
1724
|
)
|
1674
1725
|
|
1675
1726
|
def assert_exact_text(
|
1676
|
-
self, text, selector="
|
1727
|
+
self, text, selector="body", timeout=settings.SMALL_TIMEOUT
|
1677
1728
|
):
|
1729
|
+
start_ms = time.time() * 1000.0
|
1730
|
+
stop_ms = start_ms + (timeout * 1000.0)
|
1678
1731
|
text = text.strip()
|
1679
1732
|
element = None
|
1680
1733
|
try:
|
1681
1734
|
element = self.select(selector, timeout=timeout)
|
1682
1735
|
except Exception:
|
1683
1736
|
raise Exception("Element {%s} not found!" % selector)
|
1684
|
-
for i in range(
|
1737
|
+
for i in range(int(timeout * 10)):
|
1738
|
+
with suppress(Exception):
|
1739
|
+
element = self.select(selector, timeout=0.1)
|
1685
1740
|
if (
|
1686
1741
|
self.is_element_visible(selector)
|
1687
1742
|
and text.strip() == element.text_all.strip()
|
1688
1743
|
):
|
1689
1744
|
return True
|
1745
|
+
now_ms = time.time() * 1000.0
|
1746
|
+
if now_ms >= stop_ms:
|
1747
|
+
break
|
1690
1748
|
time.sleep(0.1)
|
1691
1749
|
raise Exception(
|
1692
1750
|
"Expected Text {%s}, is not equal to {%s} in {%s}!"
|
@@ -71,6 +71,8 @@ def set_settings(settings_file):
|
|
71
71
|
settings.LARGE_TIMEOUT = override_settings[key]
|
72
72
|
elif key == "EXTREME_TIMEOUT":
|
73
73
|
settings.EXTREME_TIMEOUT = override_settings[key]
|
74
|
+
elif key == "PAGE_LOAD_TIMEOUT":
|
75
|
+
settings.PAGE_LOAD_TIMEOUT = override_settings[key]
|
74
76
|
elif key == "ARCHIVE_EXISTING_LOGS":
|
75
77
|
settings.ARCHIVE_EXISTING_LOGS = override_settings[key]
|
76
78
|
elif key == "ARCHIVE_EXISTING_DOWNLOADS":
|