From f88c134fe2328296452e27cd1a0fe7336bdd72ef Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 01:18:42 -0400 Subject: [PATCH 1/9] Fix headless UC Mode (caused by missing args) --- seleniumbase/core/browser_launcher.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 862405c600f..71f8297bfc4 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -3233,6 +3233,7 @@ def get_local_driver( False, # undetectable False, # uc_cdp_events False, # uc_subprocess + False, # log_cdp_events no_sandbox, disable_gpu, False, # headless2 @@ -3448,6 +3449,7 @@ def get_local_driver( False, # undetectable False, # uc_cdp_events False, # uc_subprocess + False, # log_cdp_events no_sandbox, disable_gpu, False, # headless2 From dea2450314be89091476ca07ecfe6a212e6ac2f1 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 01:20:31 -0400 Subject: [PATCH 2/9] Update "omnibox" preferences --- seleniumbase/core/browser_launcher.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 71f8297bfc4..969f81933d7 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -756,6 +756,16 @@ def _set_chrome_options( prefs["download.prompt_for_download"] = False prefs["download.directory_upgrade"] = True prefs["safebrowsing.enabled"] = False + prefs["omnibox-max-zero-suggest-matches"] = 0 + prefs["omnibox-use-existing-autocomplete-client"] = 0 + prefs["omnibox-trending-zero-prefix-suggestions-on-ntp"] = 0 + prefs["omnibox-local-history-zero-suggest-beyond-ntp"] = 0 + prefs["omnibox-on-focus-suggestions-contextual-web"] = 0 + prefs["omnibox-on-focus-suggestions-srp"] = 0 + prefs["omnibox-zero-suggest-prefetching"] = 0 + prefs["omnibox-zero-suggest-prefetching-on-srp"] = 0 + prefs["omnibox-zero-suggest-prefetching-on-web"] = 0 + prefs["omnibox-zero-suggest-in-memory-caching"] = 0 prefs["default_content_setting_values.notifications"] = 0 prefs["content_settings.exceptions.automatic_downloads.*.setting"] = 1 prefs["safebrowsing.disable_download_protection"] = True @@ -2236,6 +2246,16 @@ def get_local_driver( "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": False, + "omnibox-max-zero-suggest-matches": 0, + "omnibox-use-existing-autocomplete-client": 0, + "omnibox-trending-zero-prefix-suggestions-on-ntp": 0, + "omnibox-local-history-zero-suggest-beyond-ntp": 0, + "omnibox-on-focus-suggestions-contextual-web": 0, + "omnibox-on-focus-suggestions-srp": 0, + "omnibox-zero-suggest-prefetching": 0, + "omnibox-zero-suggest-prefetching-on-srp": 0, + "omnibox-zero-suggest-prefetching-on-web": 0, + "omnibox-zero-suggest-in-memory-caching": 0, "safebrowsing.disable_download_protection": True, "default_content_setting_values.notifications": 0, "default_content_settings.popups": 0, From c2f4dad04f78cdd2019de89cba078f285c6db1b6 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 01:28:26 -0400 Subject: [PATCH 3/9] Update the directory-generator examples --- seleniumbase/console_scripts/sb_mkdir.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/seleniumbase/console_scripts/sb_mkdir.py b/seleniumbase/console_scripts/sb_mkdir.py index bc1531d0511..be1797d4259 100644 --- a/seleniumbase/console_scripts/sb_mkdir.py +++ b/seleniumbase/console_scripts/sb_mkdir.py @@ -624,9 +624,15 @@ def main(): data.append("class GoogleTests(BaseCase):") data.append(" def test_google_dot_com(self):") data.append(' self.open("https://google.com/ncr")') - data.append(" self.sleep(0.4)") + data.append(' self.assert_title_contains("Google")') + data.append(" self.sleep(0.05)") + data.append(" self.save_screenshot_to_logs()") + data.append( + " self.wait_for_element('iframe[role=\"presentation\"]')" + ) + data.append(" self.hide_elements('iframe')") + data.append(" self.sleep(0.05)") data.append(" self.save_screenshot_to_logs()") - data.append(" self.sleep(0.2)") data.append(' self.type(HomePage.search_box, "github.com")') data.append(" self.assert_element(HomePage.search_button)") data.append(" self.assert_element(HomePage.feeling_lucky_button)") From 5fccb54dbab9832089b0405f4c90c3dbb153c607 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 01:29:10 -0400 Subject: [PATCH 4/9] Refactor timing --- seleniumbase/fixtures/base_case.py | 31 ++++++++++-------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index 7965a695d26..682eb8103f6 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -221,9 +221,7 @@ def open(self, url): self.__check_scope() self._check_browser() if self.__needs_minimum_wait(): - time.sleep(0.03) - if self.undetectable: - time.sleep(0.02) + time.sleep(0.04) pre_action_url = None try: pre_action_url = self.driver.current_url @@ -320,22 +318,15 @@ def open(self, url): else: raise if ( - self.undetectable - or ( - self.driver.current_url == pre_action_url - and pre_action_url != url - ) + self.driver.current_url == pre_action_url + and pre_action_url != url ): time.sleep(0.1) # Make sure load happens if settings.WAIT_FOR_RSC_ON_PAGE_LOADS: if not self.undetectable: self.wait_for_ready_state_complete() - else: - time.sleep(0.15) if self.__needs_minimum_wait(): - time.sleep(0.07) # Force a minimum wait, even if skipping waits. - if self.undetectable: - time.sleep(0.02) + time.sleep(0.08) # Force a minimum wait, even if skipping waits. if self.undetectable: self.__uc_frame_layer = 0 if self.demo_mode: @@ -395,7 +386,7 @@ def click( self.__shadow_click(selector, timeout) return if self.__needs_minimum_wait() or self.browser == "safari": - time.sleep(0.04) + time.sleep(0.05) element = page_actions.wait_for_element_visible( self.driver, selector, @@ -632,20 +623,20 @@ def click( except Exception: pass if self.__needs_minimum_wait() or self.browser == "safari": - time.sleep(0.04) + time.sleep(0.05) try: if self.driver.current_url != pre_action_url: self.__ad_block_as_needed() self.__disable_beforeunload_as_needed() if self.__needs_minimum_wait(): - time.sleep(0.04) + time.sleep(0.05) except Exception: try: self.wait_for_ready_state_complete() except Exception: pass if self.__needs_minimum_wait(): - time.sleep(0.03) + time.sleep(0.04) else: time.sleep(0.08) if self.demo_mode: @@ -907,7 +898,7 @@ def update_text( if not self.demo_mode and not self.slow_mode: self.__scroll_to_element(element, selector, by) if self.__needs_minimum_wait(): - time.sleep(0.01) + time.sleep(0.02) try: element.clear() # May need https://stackoverflow.com/a/50691625 backspaces = Keys.BACK_SPACE * 42 # Is the answer to everything @@ -952,9 +943,7 @@ def update_text( if settings.WAIT_FOR_RSC_ON_PAGE_LOADS: self.wait_for_ready_state_complete() if self.__needs_minimum_wait(): - time.sleep(0.03) - if self.undetectable: - time.sleep(0.025) + time.sleep(0.04) except Exception: self.wait_for_ready_state_complete() time.sleep(0.14) From 80bdf3ae133883b16f4312112fa8176f842450a9 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 01:29:47 -0400 Subject: [PATCH 5/9] Refresh mkdocs dependencies --- mkdocs_build/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs_build/requirements.txt b/mkdocs_build/requirements.txt index dd8d2b128c2..b60a226a424 100644 --- a/mkdocs_build/requirements.txt +++ b/mkdocs_build/requirements.txt @@ -6,7 +6,7 @@ PyYAML>=6.0.1 pymdown-extensions>=10.3.1 pipdeptree>=2.13.0 python-dateutil>=2.8.2 -Markdown==3.5 +Markdown==3.5.1 markdown2==2.4.10 MarkupSafe==2.1.3 Jinja2==3.1.2 From 9f6e6db2157c1a91529aca0b3b7f2297cf973934 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 02:00:04 -0400 Subject: [PATCH 6/9] Update timing --- seleniumbase/fixtures/base_case.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index 682eb8103f6..ee45a560512 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -471,6 +471,8 @@ def click( self.js_click(selector, by=by) else: self.jquery_click(selector, by=by) + if self.__needs_minimum_wait(): + time.sleep(0.04) return except Exception: pass @@ -623,13 +625,13 @@ def click( except Exception: pass if self.__needs_minimum_wait() or self.browser == "safari": - time.sleep(0.05) + time.sleep(0.04) try: if self.driver.current_url != pre_action_url: self.__ad_block_as_needed() self.__disable_beforeunload_as_needed() if self.__needs_minimum_wait(): - time.sleep(0.05) + time.sleep(0.06) except Exception: try: self.wait_for_ready_state_complete() @@ -4327,12 +4329,13 @@ def wait_for_ready_state_complete(self, timeout=None): self.__ad_block_as_needed() self.__disable_beforeunload_as_needed() if ( - self.undetectable - and self.page_load_strategy == "none" + self.page_load_strategy == "none" and hasattr(settings, "SKIP_JS_WAITS") and settings.SKIP_JS_WAITS ): - time.sleep(0.05) + time.sleep(0.01) + if self.undetectable: + time.sleep(0.035) return True def wait_for_angularjs(self, timeout=None, **kwargs): From 7b221e5ac4785b0c798d48efa7692894716b66db Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 02:00:31 -0400 Subject: [PATCH 7/9] Update example tests --- examples/boilerplates/samples/google_test.py | 6 +++--- examples/boilerplates/samples/test_page_objects.py | 4 ++-- examples/coffee_cart_tests.py | 1 + examples/offline_examples/test_user_agent.py | 3 +++ examples/test_pytest_parametrize.py | 4 ++-- examples/test_todomvc.py | 1 + examples/test_url_asserts.py | 6 +++--- 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/examples/boilerplates/samples/google_test.py b/examples/boilerplates/samples/google_test.py index ba520f0b52e..bd9b1376913 100644 --- a/examples/boilerplates/samples/google_test.py +++ b/examples/boilerplates/samples/google_test.py @@ -7,11 +7,11 @@ class GoogleTests(BaseCase): def test_google_dot_com(self): self.open("https://google.com/ncr") self.assert_title_contains("Google") - self.sleep(0.25) + self.sleep(0.05) self.save_screenshot_to_logs() # ("./latest_logs" folder) - self.sleep(0.15) + self.wait_for_element('iframe[role="presentation"]') self.hide_elements('iframe') # Hide "Sign in" pop-up - self.sleep(0.15) + self.sleep(0.05) self.save_screenshot_to_logs() self.type(HomePage.search_box, "github.com") self.assert_element(HomePage.search_button) diff --git a/examples/boilerplates/samples/test_page_objects.py b/examples/boilerplates/samples/test_page_objects.py index 7215144d7f8..d4421ec32e8 100644 --- a/examples/boilerplates/samples/test_page_objects.py +++ b/examples/boilerplates/samples/test_page_objects.py @@ -11,9 +11,9 @@ def assert_google_title(self, sb): sb.assert_title_contains("Google") def hide_sign_in_pop_up(self, sb): - sb.sleep(0.25) + sb.wait_for_element('iframe[role="presentation"]') sb.hide_elements('iframe') - sb.sleep(0.15) + sb.sleep(0.05) def do_search(self, sb, search_term): sb.sleep(0.05) diff --git a/examples/coffee_cart_tests.py b/examples/coffee_cart_tests.py index e017fea839c..f0ab06016ec 100644 --- a/examples/coffee_cart_tests.py +++ b/examples/coffee_cart_tests.py @@ -29,6 +29,7 @@ def test_buy_one_cappuccino(self): @parameterized.expand([[False], [True]]) def test_coffee_promo_with_preview(self, accept_promo): self.open("https://seleniumbase.io/coffee/") + self.assert_title("Coffee Cart") self.click('div[data-test="Espresso"]') self.click('div[data-test="Americano"]') self.click('div[data-test="Cafe_Latte"]') diff --git a/examples/offline_examples/test_user_agent.py b/examples/offline_examples/test_user_agent.py index 27f4374f228..3e8065ab123 100755 --- a/examples/offline_examples/test_user_agent.py +++ b/examples/offline_examples/test_user_agent.py @@ -16,6 +16,9 @@ def test_get_user_agent(self): print(msg) self.skip(msg) print("\n--------------------------") + if not self.headless: + self.open("chrome://version/") + self.highlight("#useragent", loops=8) try: self.execute_cdp_cmd( "Network.setUserAgentOverride", diff --git a/examples/test_pytest_parametrize.py b/examples/test_pytest_parametrize.py index ef8d66f2a35..60849d6171a 100644 --- a/examples/test_pytest_parametrize.py +++ b/examples/test_pytest_parametrize.py @@ -5,7 +5,7 @@ "value", ["List of Features", "Command Line Options"] ) def test_sb_fixture_with_no_class(sb, value): - sb.open("seleniumbase.github.io/help_docs/install/") + sb.open("seleniumbase.io/help_docs/install/") sb.type('input[aria-label="Search"]', value) sb.click("nav h1 mark") sb.assert_title_contains(value) @@ -17,7 +17,7 @@ class Test_SB_Fixture: "value", ["Console Scripts", "API Reference"] ) def test_sb_fixture_inside_class(self, sb, value): - sb.open("seleniumbase.github.io/help_docs/install/") + sb.open("seleniumbase.io/help_docs/install/") sb.type('input[aria-label="Search"]', value) sb.click("nav h1 mark") sb.assert_title_contains(value) diff --git a/examples/test_todomvc.py b/examples/test_todomvc.py index 7f73e794015..4d9b118acba 100644 --- a/examples/test_todomvc.py +++ b/examples/test_todomvc.py @@ -16,6 +16,7 @@ def test_todomvc(self, framework): self.assert_in(framework, title.lower()) new_todo_input = "input.new-todo" todo_count_span = "span.todo-count" + self.wait_for_ready_state_complete() self.type(new_todo_input, "Learn Python\n") self.type(new_todo_input, "Learn JavaScript\n") self.type(new_todo_input, "Learn SeleniumBase\n") diff --git a/examples/test_url_asserts.py b/examples/test_url_asserts.py index be5710c3298..d00b88c56a6 100644 --- a/examples/test_url_asserts.py +++ b/examples/test_url_asserts.py @@ -4,9 +4,9 @@ class URLTestClass(BaseCase): def test_url_asserts(self): - self.open("https://seleniumbase.github.io/") - self.assert_url("https://seleniumbase.github.io/") - self.assert_title_contains("SeleniumBase") + self.open("https://seleniumbase.io/help_docs/how_it_works/") + self.assert_url("https://seleniumbase.io/help_docs/how_it_works/") + self.assert_title_contains("How it Works") self.js_click('nav a:contains("Coffee Cart")') self.assert_url_contains("/coffee") self.assert_title("Coffee Cart") From aa58d6b3e5dad390abc92202d659c2d6e9f52418 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 02:01:29 -0400 Subject: [PATCH 8/9] Refresh Python dependencies --- requirements.txt | 6 +++--- setup.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6d313534f18..076012bd6e9 100755 --- a/requirements.txt +++ b/requirements.txt @@ -2,18 +2,18 @@ pip>=23.3.1 packaging>=23.2 setuptools>=68.0.0;python_version<"3.8" setuptools>=68.2.2;python_version>="3.8" -wheel>=0.41.2 +wheel>=0.41.3 attrs>=23.1.0 certifi>=2023.7.22 filelock>=3.12.2;python_version<"3.8" -filelock>=3.13.0;python_version>="3.8" +filelock>=3.13.1;python_version>="3.8" platformdirs>=3.11.0 parse>=1.19.1 parse-type>=0.6.2 six==1.16.0 idna==3.4 chardet==5.2.0 -charset-normalizer==3.3.1 +charset-normalizer==3.3.2 urllib3>=1.26.18,<2;python_version<"3.10" urllib3>=1.26.18,<2.1.0;python_version>="3.10" requests==2.31.0 diff --git a/setup.py b/setup.py index 47f5a057bb6..e0802d5c170 100755 --- a/setup.py +++ b/setup.py @@ -135,18 +135,18 @@ 'packaging>=23.2', 'setuptools>=68.0.0;python_version<"3.8"', 'setuptools>=68.2.2;python_version>="3.8"', - 'wheel>=0.41.2', + 'wheel>=0.41.3', 'attrs>=23.1.0', "certifi>=2023.7.22", 'filelock>=3.12.2;python_version<"3.8"', - 'filelock>=3.13.0;python_version>="3.8"', + 'filelock>=3.13.1;python_version>="3.8"', 'platformdirs>=3.11.0', 'parse>=1.19.1', 'parse-type>=0.6.2', "six==1.16.0", "idna==3.4", 'chardet==5.2.0', - 'charset-normalizer==3.3.1', + 'charset-normalizer==3.3.2', 'urllib3>=1.26.18,<2;python_version<"3.10"', 'urllib3>=1.26.18,<2.1.0;python_version>="3.10"', 'requests==2.31.0', From df5e394c772c8d42bd7253f11df639679f53a220 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 1 Nov 2023 02:01:42 -0400 Subject: [PATCH 9/9] Version 4.20.9 --- seleniumbase/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 84960854e03..d8beb05b190 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.20.8" +__version__ = "4.20.9"