Skip to content

Fix headless UC Mode, and other updates #2232

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Nov 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions examples/boilerplates/samples/google_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions examples/boilerplates/samples/test_page_objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions examples/coffee_cart_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]')
Expand Down
3 changes: 3 additions & 0 deletions examples/offline_examples/test_user_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions examples/test_pytest_parametrize.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions examples/test_todomvc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
6 changes: 3 additions & 3 deletions examples/test_url_asserts.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
2 changes: 1 addition & 1 deletion mkdocs_build/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion seleniumbase/__version__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# seleniumbase package
__version__ = "4.20.8"
__version__ = "4.20.9"
10 changes: 8 additions & 2 deletions seleniumbase/console_scripts/sb_mkdir.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)")
Expand Down
22 changes: 22 additions & 0 deletions seleniumbase/core/browser_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -3233,6 +3253,7 @@ def get_local_driver(
False, # undetectable
False, # uc_cdp_events
False, # uc_subprocess
False, # log_cdp_events
no_sandbox,
disable_gpu,
False, # headless2
Expand Down Expand Up @@ -3448,6 +3469,7 @@ def get_local_driver(
False, # undetectable
False, # uc_cdp_events
False, # uc_subprocess
False, # log_cdp_events
no_sandbox,
disable_gpu,
False, # headless2
Expand Down
38 changes: 15 additions & 23 deletions seleniumbase/fixtures/base_case.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -480,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
Expand Down Expand Up @@ -638,14 +631,14 @@ def click(
self.__ad_block_as_needed()
self.__disable_beforeunload_as_needed()
if self.__needs_minimum_wait():
time.sleep(0.04)
time.sleep(0.06)
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:
Expand Down Expand Up @@ -907,7 +900,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
Expand Down Expand Up @@ -952,9 +945,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)
Expand Down Expand Up @@ -4338,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):
Expand Down
6 changes: 3 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down