diff --git a/examples/cdp_mode/ReadMe.md b/examples/cdp_mode/ReadMe.md index c312970e78e..81eae40ddea 100644 --- a/examples/cdp_mode/ReadMe.md +++ b/examples/cdp_mode/ReadMe.md @@ -37,11 +37,11 @@ ### 🐙 CDP Mode Usage (when used as a subset of UC Mode): -* **`sb.activate_cdp_mode(url)`** +* **`sb.activate_cdp_mode()` or `sb.activate_cdp_mode(url)`** -That disconnects WebDriver from Chrome (which prevents detection), and gives you access to `sb.cdp` methods (which don't trigger anti-bot checks). +That disconnects WebDriver from Chrome (which prevents detection), and gives you access to CDP Mode methods (which don't trigger anti-bot checks). -> (**New:** Calling **`sb.goto(url)`** from UC Mode also activates CDP Mode now.) +> (Calling **`sb.goto(url)`** from UC Mode also activates CDP Mode now.) Simple example from [SeleniumBase/examples/cdp_mode/raw_gitlab.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py): @@ -49,8 +49,8 @@ Simple example from [SeleniumBase/examples/cdp_mode/raw_gitlab.py](https://githu from seleniumbase import SB with SB(uc=True, test=True, locale="en") as sb: - url = "https://gitlab.com/users/sign_in" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://gitlab.com/users/sign_in") sb.sleep(2) sb.solve_captcha() sb.sleep(2) @@ -58,7 +58,7 @@ with SB(uc=True, test=True, locale="en") as sb: -(If the CAPTCHA wasn't bypassed automatically when going to the URL, then `sb.solve_captcha()` gets the job done.) +(If the CAPTCHA wasn't bypassed automatically, then `sb.solve_captcha()` gets the job done.) ---- @@ -69,9 +69,9 @@ Here's another example that calls `sb.solve_captcha()`: from seleniumbase import SB with SB(uc=True, test=True, guest=True) as sb: - url = "www.planetminecraft.com/account/sign_in/" - sb.activate_cdp_mode(url) - sb.sleep(2) + sb.activate_cdp_mode() + sb.goto("www.planetminecraft.com/account/sign_in/") + sb.sleep(3) sb.solve_captcha() sb.wait_for_element_absent("input[disabled]") sb.sleep(2) @@ -83,26 +83,24 @@ In many cases, the CAPTCHA will be solved automatically without needing to call ---- -You can also use `PyAutoGUI` to click on elements with the mouse by calling `sb.cdp.gui_click_element(selector)`. +You can also use `PyAutoGUI` to click on elements with the mouse by calling `sb.gui_click_element(selector)`. (The `PyAutoGUI` methods start with `gui`.) -â„šī¸ Note that `PyAutoGUI` is an optional dependency. If calling a method that uses it when not already installed, then `SeleniumBase` installs `PyAutoGUI` at runtime. +â„šī¸ Note that `PyAutoGUI` is an optional dependency. If calling a method that needs it when not already installed, then `SeleniumBase` installs `PyAutoGUI` at runtime. ---- -### 🐙 Here are a few common `sb.cdp` methods: - -* `sb.cdp.click(selector)` (Uses the CDP API to click) -* `sb.cdp.click_if_visible(selector)` (Click if visible) -* `sb.cdp.solve_captcha()` (Uses CDP to click a CAPTCHA) -* `sb.cdp.gui_click_element(selector)` (Uses `PyAutoGUI`) -* `sb.cdp.type(selector, text)` (Type text into a selector) -* `sb.cdp.press_keys(selector, text)` (Human-speed `type`) -* `sb.cdp.select_all(selector)` (Returns matching elements) -* `sb.cdp.get_text(selector)` (Returns the element's text) +### 🐙 Here are a few common CDP Mode methods: -Methods that start with `sb.cdp.gui` use `PyAutoGUI` for interaction. +* `goto(url)` (Navigate to the given URL) +* `click(selector)` (Uses the CDP API to click) +* `click_if_visible(selector)` (Click if visible) +* `solve_captcha()` (Uses CDP to click a CAPTCHA) +* `type(selector, text)` (Type text into a selector) +* `press_keys(selector, text)` (Human-speed `type`) +* `select_all(selector)` (Returns matching elements) +* `get_text(selector)` (Returns the element's text) -To use WebDriver methods again, call: +To use WebDriver-only methods again, call: * **`sb.reconnect()`** or **`sb.connect()`** @@ -112,13 +110,13 @@ To disconnect again, call: * **`sb.disconnect()`** -While disconnected, if you call a WebDriver method, then SeleniumBase will attempt to use the CDP Mode version of that method (if available). For example, if you call `sb.click(selector)` instead of `sb.cdp.click(selector)`, then your WebDriver call will automatically be redirected to the CDP Mode version. Not all WebDriver methods have a matching CDP Mode method. In that scenario, calling a WebDriver method while disconnected could raise an error, or make WebDriver automatically reconnect first. +While disconnected, if you call a WebDriver method, then SeleniumBase will attempt to use the CDP Mode version of that method (if available). For example, if you call `sb.click(selector)` instead of `sb.cdp.click(selector)`, then your WebDriver call will automatically redirect to the CDP Mode version. Not all WebDriver methods have a matching CDP Mode method. In that scenario, calling a WebDriver method while disconnected could raise an error, or make WebDriver automatically reconnect first. To find out if WebDriver is connected or disconnected, call: * **`sb.is_connected()`** -Note: When CDP Mode is initialized from UC Mode, the WebDriver is disconnected from the browser. (The stealthy CDP-Driver takes over.) +Note: When CDP Mode is initialized from UC Mode, the WebDriver is disconnected from the browser. (The stealthy CDP Mode takes over.) ---- @@ -134,8 +132,8 @@ To find out if WebDriver is connected or disconnected, call: from seleniumbase import SB with SB(uc=True, test=True, locale="en", ad_block=True) as sb: - url = "https://www.pokemon.com/us" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.pokemon.com/us") sb.sleep(1.5) sb.click_if_visible("button#onetrust-accept-btn-handler") sb.sleep(1.2) @@ -187,9 +185,9 @@ with SB(uc=True, test=True, locale="en", ad_block=True) as sb: from seleniumbase import SB with SB(uc=True, test=True, locale="en", guest=True) as sb: - url = "https://www.hyatt.com/" - sb.activate_cdp_mode(url) - sb.sleep(3.4) + sb.activate_cdp_mode() + sb.goto("https://www.hyatt.com/") + sb.sleep(3.6) sb.click_if_visible('button[aria-label="Close"]') sb.sleep(0.1) sb.click_if_visible("#onetrust-reject-all-handler") @@ -235,8 +233,8 @@ with SB(uc=True, test=True, locale="en", guest=True) as sb: from seleniumbase import SB with SB(uc=True, test=True, locale="en", guest=True) as sb: - url = "https://www.bestwestern.com/en_US.html" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.bestwestern.com/en_US.html") sb.sleep(3) sb.click_if_visible(".onetrust-close-btn-handler") sb.sleep(1) @@ -280,9 +278,9 @@ with SB(uc=True, test=True, locale="en", guest=True) as sb: from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://www.walmart.com/" - sb.activate_cdp_mode(url) - sb.sleep(1.8) + sb.activate_cdp_mode() + sb.goto("https://www.walmart.com/") + sb.sleep(2.2) continue_button = 'button:contains("Continue shopping")' if sb.is_element_visible(continue_button): sb.gui_click_element(continue_button) @@ -339,8 +337,8 @@ with SB(uc=True, test=True, ad_block=True) as sb: from seleniumbase import SB with SB(uc=True, test=True, locale="en", pls="none") as sb: - url = "https://www.nike.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.nike.com/") sb.sleep(2.5) sb.click('[data-testid="user-tools-container"] search') sb.sleep(1.5) @@ -371,209 +369,210 @@ with SB(uc=True, test=True, locale="en", pls="none") as sb: ### 🐙 CDP Mode API / Methods ```python -sb.cdp.get(url, **kwargs) -sb.cdp.goto(url, **kwargs) # Same as sb.cdp.get(url, **kwargs) -sb.cdp.open(url, **kwargs) # Same as sb.cdp.get(url, **kwargs) -sb.cdp.reload(ignore_cache=True, script_to_evaluate_on_load=None) -sb.cdp.refresh(*args, **kwargs) -sb.cdp.get_event_loop() -sb.cdp.get_rd_host() # Returns the remote-debugging host -sb.cdp.get_rd_port() # Returns the remote-debugging port -sb.cdp.get_rd_url() # Returns the remote-debugging URL -sb.cdp.get_endpoint_url() # Same as sb.cdp.get_rd_url() -sb.cdp.get_port() # Same as sb.cdp.get_rd_port() -sb.cdp.get_websocket_url() # Returns the websocket URL -sb.cdp.add_handler(event, handler) -sb.cdp.find_element(selector, best_match=False, timeout=None) -sb.cdp.find(selector, best_match=False, timeout=None) -sb.cdp.locator(selector, best_match=False, timeout=None) -sb.cdp.find_element_by_text(text, tag_name=None, timeout=None) -sb.cdp.find_all(selector, timeout=None) -sb.cdp.find_elements_by_text(text, tag_name=None) -sb.cdp.select(selector, timeout=None) -sb.cdp.select_all(selector, timeout=None) -sb.cdp.find_elements(selector, timeout=None) -sb.cdp.find_visible_elements(selector, timeout=None) -sb.cdp.click(selector, timeout=None, scroll=True) -sb.cdp.click_if_visible(selector, timeout=0, scroll=True) -sb.cdp.click_visible_elements(selector, limit=0, scroll=True) -sb.cdp.click_nth_element(selector, number, scroll=True) -sb.cdp.click_nth_visible_element(selector, number, scroll=True) -sb.cdp.click_with_offset(selector, x, y, center=False, scroll=True) -sb.cdp.click_link(link_text) -sb.cdp.go_back() -sb.cdp.go_forward() -sb.cdp.get_navigation_history() -sb.cdp.tile_windows(windows=None, max_columns=0) -sb.cdp.grant_permissions(permissions, origin=None) -sb.cdp.grant_all_permissions() -sb.cdp.reset_permissions() -sb.cdp.get_all_urls(absolute=True) -sb.cdp.get_all_cookies(*args, **kwargs) -sb.cdp.set_all_cookies(*args, **kwargs) -sb.cdp.save_cookies(*args, **kwargs) -sb.cdp.load_cookies(*args, **kwargs) -sb.cdp.clear_cookies() -sb.cdp.sleep(seconds) -sb.cdp.bring_active_window_to_front() -sb.cdp.bring_to_front() -sb.cdp.get_active_element() -sb.cdp.get_active_element_css() -sb.cdp.click_active_element() -sb.cdp.mouse_click(selector, timeout=None, scroll=True) -sb.cdp.nested_click(parent_selector, selector) -sb.cdp.get_nested_element(parent_selector, selector) -sb.cdp.select_option_by_text(dropdown_selector, option) -sb.cdp.select_option_by_index(dropdown_selector, option) -sb.cdp.select_option_by_value(dropdown_selector, option) -sb.cdp.flash(selector, duration=1, color="44CC88", pause=0) -sb.cdp.highlight(selector) -sb.cdp.focus(selector) -sb.cdp.highlight_overlay(selector) -sb.cdp.get_parent(element) -sb.cdp.remove_element(selector) -sb.cdp.remove_from_dom(selector) -sb.cdp.remove_elements(selector) -sb.cdp.send_keys(selector, text, timeout=None) -sb.cdp.press_keys(selector, text, timeout=None) -sb.cdp.type(selector, text, timeout=None) -sb.cdp.set_value(selector, text, timeout=None) -sb.cdp.clear_input(selector, timeout=None) -sb.cdp.clear(selector, timeout=None) -sb.cdp.submit(selector) -sb.cdp.evaluate(expression) -sb.cdp.execute_script(expression) -sb.cdp.js_dumps(obj_name) -sb.cdp.maximize() -sb.cdp.minimize() -sb.cdp.medimize() -sb.cdp.set_window_rect(x, y, width, height) -sb.cdp.reset_window_size() -sb.cdp.open_new_window(url=None, switch_to=True) -sb.cdp.switch_to_window(window) -sb.cdp.switch_to_newest_window() -sb.cdp.open_new_tab(url=None, switch_to=True) -sb.cdp.switch_to_tab(tab) -sb.cdp.switch_to_newest_tab() -sb.cdp.close_active_tab() -sb.cdp.get_active_tab() -sb.cdp.get_tabs() -sb.cdp.get_window() -sb.cdp.get_text(selector="body") -sb.cdp.get_title() -sb.cdp.get_current_url() -sb.cdp.get_origin() -sb.cdp.get_html(include_shadow_dom=True) -sb.cdp.get_page_source(include_shadow_dom=True) -sb.cdp.get_beautiful_soup(source=None) -sb.cdp.get_user_agent() -sb.cdp.get_cookie_string() -sb.cdp.get_locale_code() -sb.cdp.get_local_storage_item(key) -sb.cdp.get_session_storage_item(key) -sb.cdp.get_screen_rect() -sb.cdp.get_window_rect() -sb.cdp.get_window_size() -sb.cdp.get_window_position() -sb.cdp.get_element_rect(selector, timeout=None) -sb.cdp.get_element_size(selector, timeout=None) -sb.cdp.get_element_position(selector, timeout=None) -sb.cdp.get_gui_element_rect(selector, timeout=None) -sb.cdp.get_gui_element_center(selector, timeout=None) -sb.cdp.get_document() -sb.cdp.get_flattened_document() -sb.cdp.get_element_attributes(selector) -sb.cdp.get_element_attribute(selector, attribute) -sb.cdp.get_attribute(selector, attribute) -sb.cdp.get_element_html(selector) -sb.cdp.get_mfa_code(totp_key=None) -sb.cdp.enter_mfa_code(selector, totp_key=None, timeout=None) -sb.cdp.activate_messenger() -sb.cdp.set_messenger_theme(theme="default", location="default") -sb.cdp.post_message(message, duration=None, pause=True, style="info") -sb.cdp.download_file(file_url) -sb.cdp.save_file_as(file_url, new_file_name) -sb.cdp.assert_downloaded_file(file, timeout=None) -sb.cdp.get_path_of_downloaded_file(file) -sb.cdp.set_download_path(path) -sb.cdp.set_locale(locale) -sb.cdp.set_local_storage_item(key, value) -sb.cdp.set_session_storage_item(key, value) -sb.cdp.set_attributes(selector, attribute, value) -sb.cdp.is_attribute_present(selector, attribute, value=None) -sb.cdp.is_online() -sb.cdp.solve_captcha() -sb.cdp.click_captcha() -sb.cdp.gui_press_key(key) -sb.cdp.gui_press_keys(keys) -sb.cdp.gui_write(text) -sb.cdp.gui_click_x_y(x, y, timeframe=0.25) -sb.cdp.gui_click_element(selector, timeframe=0.25) -sb.cdp.gui_click_with_offset(selector, x, y, timeframe=0.25, center=False) -sb.cdp.gui_click_captcha() -sb.cdp.gui_drag_drop_points(x1, y1, x2, y2, timeframe=0.35) -sb.cdp.gui_drag_and_drop(drag_selector, drop_selector, timeframe=0.35) -sb.cdp.gui_click_and_hold(selector, timeframe=0.35) -sb.cdp.gui_hover_x_y(x, y) -sb.cdp.gui_hover_element(selector) -sb.cdp.gui_hover_and_click(hover_selector, click_selector) -sb.cdp.hover_element(selector) -sb.cdp.hover_and_click(hover_selector, click_selector) -sb.cdp.internalize_links() -sb.cdp.is_checked(selector) -sb.cdp.is_selected(selector) -sb.cdp.check_if_unchecked(selector) -sb.cdp.select_if_unselected(selector) -sb.cdp.uncheck_if_checked(selector) -sb.cdp.unselect_if_selected(selector) -sb.cdp.is_element_present(selector) -sb.cdp.is_element_visible(selector) -sb.cdp.is_text_visible(text, selector="body") -sb.cdp.is_exact_text_visible(text, selector="body") -sb.cdp.wait_for_text(text, selector="body", timeout=None) -sb.cdp.wait_for_text_not_visible(text, selector="body", timeout=None) -sb.cdp.wait_for_element_visible(selector, timeout=None) -sb.cdp.wait_for_element(selector, timeout=None) -sb.cdp.wait_for_element_not_visible(selector, timeout=None) -sb.cdp.wait_for_element_absent(selector, timeout=None) -sb.cdp.wait_for_any_of_elements_visible(*args, **kwargs) -sb.cdp.wait_for_any_of_elements_present(*args, **kwargs) -sb.cdp.assert_any_of_elements_visible(*args, **kwargs) -sb.cdp.assert_any_of_elements_present(*args, **kwargs) -sb.cdp.assert_element(selector, timeout=None) -sb.cdp.assert_element_visible(selector, timeout=None) -sb.cdp.assert_element_present(selector, timeout=None) -sb.cdp.assert_element_absent(selector, timeout=None) -sb.cdp.assert_element_not_visible(selector, timeout=None) -sb.cdp.assert_element_attribute(selector, attribute, value=None) -sb.cdp.assert_title(title) -sb.cdp.assert_title_contains(substring) -sb.cdp.assert_url(url) -sb.cdp.assert_url_contains(substring) -sb.cdp.assert_text(text, selector="html", timeout=None) -sb.cdp.assert_exact_text(text, selector="html", timeout=None) -sb.cdp.assert_text_not_visible(text, selector="body", timeout=None) -sb.cdp.assert_true(expression, msg=None) -sb.cdp.assert_false(expression, msg=None) -sb.cdp.assert_equal(first, second) -sb.cdp.assert_not_equal(first, second) -sb.cdp.assert_in(first, second) -sb.cdp.assert_not_in(first, second) -sb.cdp.js_scroll_into_view(selector) -sb.cdp.scroll_into_view(selector) -sb.cdp.scroll_to_y(y) -sb.cdp.scroll_to_top() -sb.cdp.scroll_to_bottom() -sb.cdp.scroll_up(amount=25) -sb.cdp.scroll_down(amount=25) -sb.cdp.save_page_source(name, folder=None) -sb.cdp.save_as_html(name, folder=None) -sb.cdp.save_screenshot(name, folder=None, selector=None) -sb.cdp.print_to_pdf(name, folder=None) -sb.cdp.save_as_pdf(name, folder=None) +sb.get(url, **kwargs) +sb.open(url, **kwargs) # Same as sb.get(url, **kwargs) in CDP Mode +sb.goto(url, **kwargs) # Same as sb.get(url, **kwargs) in CDP Mode +sb.reload(ignore_cache=True, script_to_evaluate_on_load=None) +sb.refresh(*args, **kwargs) +sb.get_event_loop() +sb.get_rd_host() # Returns the remote-debugging host +sb.get_rd_port() # Returns the remote-debugging port +sb.get_rd_url() # Returns the remote-debugging URL +sb.get_endpoint_url() # Same as sb.get_rd_url() +sb.get_port() # Same as sb.get_rd_port() +sb.get_websocket_url() # Returns the websocket URL +sb.add_handler(event, handler) +sb.find_element(selector, best_match=False, timeout=None) +sb.find(selector, best_match=False, timeout=None) +sb.locator(selector, best_match=False, timeout=None) +sb.find_element_by_text(text, tag_name=None, timeout=None) +sb.find_all(selector, timeout=None) +sb.find_elements_by_text(text, tag_name=None) +sb.select(selector, timeout=None) +sb.select_all(selector, timeout=None) +sb.find_elements(selector, timeout=None) +sb.find_visible_elements(selector, timeout=None) +sb.click(selector, timeout=None, scroll=True) +sb.click_if_visible(selector, timeout=0, scroll=True) +sb.click_visible_elements(selector, limit=0, scroll=True) +sb.click_nth_element(selector, number, scroll=True) +sb.click_nth_visible_element(selector, number, scroll=True) +sb.click_with_offset(selector, x, y, center=False, scroll=True) +sb.click_link(link_text) +sb.go_back() +sb.go_forward() +sb.get_navigation_history() +sb.tile_windows(windows=None, max_columns=0) +sb.grant_permissions(permissions, origin=None) +sb.grant_all_permissions() +sb.reset_permissions() +sb.get_all_urls(absolute=True) +sb.get_all_cookies(*args, **kwargs) +sb.set_all_cookies(*args, **kwargs) +sb.save_cookies(*args, **kwargs) +sb.load_cookies(*args, **kwargs) +sb.clear_cookies() +sb.sleep(seconds) +sb.bring_active_window_to_front() +sb.bring_to_front() +sb.get_active_element() +sb.get_active_element_css() +sb.click_active_element() +sb.mouse_click(selector, timeout=None, scroll=True) +sb.nested_click(parent_selector, selector) +sb.get_nested_element(parent_selector, selector) +sb.select_option_by_text(dropdown_selector, option) +sb.select_option_by_index(dropdown_selector, option) +sb.select_option_by_value(dropdown_selector, option) +sb.flash(selector, duration=1, color="44CC88", pause=0) +sb.highlight(selector) +sb.focus(selector) +sb.highlight_overlay(selector) +sb.get_parent(element) +sb.remove_element(selector) +sb.remove_from_dom(selector) +sb.remove_elements(selector) +sb.send_keys(selector, text, timeout=None) +sb.press_keys(selector, text, timeout=None) +sb.type(selector, text, timeout=None) +sb.set_value(selector, text, timeout=None) +sb.clear_input(selector, timeout=None) +sb.clear(selector, timeout=None) +sb.submit(selector) +sb.evaluate(expression) +sb.execute_script(expression) +sb.js_dumps(obj_name) +sb.maximize() +sb.minimize() +sb.medimize() +sb.set_window_rect(x, y, width, height) +sb.reset_window_size() +sb.open_new_window(url=None, switch_to=True) +sb.switch_to_window(window) +sb.switch_to_newest_window() +sb.open_new_tab(url=None, switch_to=True) +sb.switch_to_tab(tab) +sb.switch_to_newest_tab() +sb.close_active_tab() +sb.get_active_tab() +sb.get_tabs() +sb.get_window() +sb.get_text(selector="body") +sb.get_title() +sb.get_current_url() +sb.get_origin() +sb.get_html(include_shadow_dom=True) +sb.get_page_source(include_shadow_dom=True) +sb.get_beautiful_soup(source=None) +sb.get_user_agent() +sb.get_cookie_string() +sb.get_locale_code() +sb.get_local_storage_item(key) +sb.get_session_storage_item(key) +sb.get_screen_rect() +sb.get_window_rect() +sb.get_window_size() +sb.get_window_position() +sb.get_element_rect(selector, timeout=None) +sb.get_element_size(selector, timeout=None) +sb.get_element_position(selector, timeout=None) +sb.get_gui_element_rect(selector, timeout=None) +sb.get_gui_element_center(selector, timeout=None) +sb.get_document() +sb.get_flattened_document() +sb.get_element_attributes(selector) +sb.get_element_attribute(selector, attribute) +sb.get_attribute(selector, attribute) +sb.get_element_html(selector) +sb.get_mfa_code(totp_key=None) +sb.enter_mfa_code(selector, totp_key=None, timeout=None) +sb.activate_messenger() +sb.set_messenger_theme(theme="default", location="default") +sb.post_message(message, duration=None, pause=True, style="info") +sb.download_file(file_url) +sb.save_file_as(file_url, new_file_name) +sb.assert_downloaded_file(file, timeout=None) +sb.get_path_of_downloaded_file(file) +sb.set_download_path(path) +sb.set_locale(locale) +sb.set_local_storage_item(key, value) +sb.set_session_storage_item(key, value) +sb.set_attributes(selector, attribute, value) +sb.is_attribute_present(selector, attribute, value=None) +sb.is_online() +sb.solve_captcha() +sb.click_captcha() +sb.gui_press_key(key) +sb.gui_press_keys(keys) +sb.gui_write(text) +sb.gui_click_x_y(x, y, timeframe=0.25) +sb.gui_click_element(selector, timeframe=0.25) +sb.gui_click_with_offset(selector, x, y, timeframe=0.25, center=False) +sb.gui_click_captcha() +sb.gui_drag_drop_points(x1, y1, x2, y2, timeframe=0.35) +sb.gui_drag_and_drop(drag_selector, drop_selector, timeframe=0.35) +sb.gui_click_and_hold(selector, timeframe=0.35) +sb.gui_hover_x_y(x, y) +sb.gui_hover_element(selector) +sb.gui_hover_and_click(hover_selector, click_selector) +sb.hover_element(selector) +sb.hover_and_click(hover_selector, click_selector) +sb.internalize_links() +sb.is_checked(selector) +sb.is_selected(selector) +sb.check_if_unchecked(selector) +sb.select_if_unselected(selector) +sb.uncheck_if_checked(selector) +sb.unselect_if_selected(selector) +sb.is_element_present(selector) +sb.is_element_visible(selector) +sb.is_text_visible(text, selector="body") +sb.is_exact_text_visible(text, selector="body") +sb.wait_for_text(text, selector="body", timeout=None) +sb.wait_for_text_not_visible(text, selector="body", timeout=None) +sb.wait_for_element_visible(selector, timeout=None) +sb.wait_for_element(selector, timeout=None) +sb.wait_for_element_not_visible(selector, timeout=None) +sb.wait_for_element_absent(selector, timeout=None) +sb.wait_for_any_of_elements_visible(*args, **kwargs) +sb.wait_for_any_of_elements_present(*args, **kwargs) +sb.assert_any_of_elements_visible(*args, **kwargs) +sb.assert_any_of_elements_present(*args, **kwargs) +sb.assert_element(selector, timeout=None) +sb.assert_element_visible(selector, timeout=None) +sb.assert_element_present(selector, timeout=None) +sb.assert_element_absent(selector, timeout=None) +sb.assert_element_not_visible(selector, timeout=None) +sb.assert_element_attribute(selector, attribute, value=None) +sb.assert_title(title) +sb.assert_title_contains(substring) +sb.assert_url(url) +sb.assert_url_contains(substring) +sb.assert_text(text, selector="html", timeout=None) +sb.assert_exact_text(text, selector="html", timeout=None) +sb.assert_text_not_visible(text, selector="body", timeout=None) +sb.assert_true(expression, msg=None) +sb.assert_false(expression, msg=None) +sb.assert_equal(first, second) +sb.assert_not_equal(first, second) +sb.assert_in(first, second) +sb.assert_not_in(first, second) +sb.js_scroll_into_view(selector) +sb.scroll_into_view(selector) +sb.scroll_to_y(y) +sb.scroll_to_top() +sb.scroll_to_bottom() +sb.scroll_up(amount=25) +sb.scroll_down(amount=25) +sb.save_page_source(name, folder=None) +sb.save_as_html(name, folder=None) +sb.save_screenshot(name, folder=None, selector=None) +sb.print_to_pdf(name, folder=None) +sb.save_as_pdf(name, folder=None) +sb.quit() # (Pure CDP Mode only: `sb_cdp`) ``` -â„šī¸ When available, calling `sb.METHOD()` redirects to `sb.cdp.METHOD()` when CDP Mode is active. From Pure CDP Mode, always call these methods with `sb.METHOD()` instead of `sb.cdp.METHOD()`. +â„šī¸ When available, calling `sb.METHOD()` redirects to `sb.cdp.METHOD()` from UC + CDP Mode. ---- @@ -581,23 +580,34 @@ sb.cdp.save_as_pdf(name, folder=None) ### 🐙 Pure CDP Mode (sb_cdp) -In Pure CDP Mode, the browser is launched using CDP, and browser actions are performed using CDP. WebDriver isn't available at all, but SeleniumBase can still call PyAutoGUI methods when CDP isn't enough. Here's how to initialize Pure CDP Mode: +In Pure CDP Mode, the browser is launched using CDP, and all browser actions are performed using CDP. WebDriver isn't available at all, but SeleniumBase can still call PyAutoGUI methods when CDP isn't enough. + +🐙 Here's how to initialize Pure CDP Mode with a starting URL: + +```python +from seleniumbase import sb_cdp + +sb = sb_cdp.Chrome(URL) +``` + +🐙 You can also initialize Pure CDP Mode and set the URL later: ```python from seleniumbase import sb_cdp -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto(URL) ``` -Pure CDP Mode includes all methods from regular CDP Mode, except that they're called directly from sb instead of sb.cdp. Eg: sb.gui_click_captcha(). To quit a CDP-launched browser, use `sb.quit()`. +Pure CDP Mode includes all methods from regular CDP Mode. To quit a Pure CDP Mode browser before Python goes out-of-scope, use `sb.quit()`. Basic example from [SeleniumBase/examples/cdp_mode/raw_cdp_turnstile.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_turnstile.py): ```python from seleniumbase import sb_cdp -url = "https://seleniumbase.io/apps/turnstile" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://seleniumbase.io/apps/turnstile") sb.solve_captcha() sb.assert_element("img#captcha-success") sb.set_messenger_theme(location="top_left") @@ -610,8 +620,8 @@ Another example: ([SeleniumBase/examples/cdp_mode/raw_cdp_methods.py](https://gi ```python from seleniumbase import sb_cdp -url = "https://seleniumbase.io/demo_page" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://seleniumbase.io/demo_page") sb.press_keys("input", "Text") sb.highlight("button") sb.type("textarea", "Here are some words") @@ -639,78 +649,78 @@ Initialization: from seleniumbase import cdp_driver driver = await cdp_driver.start_async() -tab = await driver.get(url, **kwargs) +page = await driver.get(url, **kwargs) ``` -Methods: (Sometimes `tab` is named `page` in examples) +Methods: (Sometimes `page` is named `tab` in examples where `page` is already taken.) ```python -await tab.get(url="about:blank") -await tab.goto(url="about:blank") # Same as await tab.get(url) -await tab.open(url="about:blank") # Same as await tab.get(url) -await tab.find(text, best_match=False, timeout=10) # text can be selector -await tab.find_all(text, timeout=10) # text can be selector -await tab.select(selector, timeout=10) -await tab.select_all(selector, timeout=10, include_frames=False) -await tab.query_selector(selector) -await tab.query_selector_all(selector) -await tab.find_element_by_text(text, best_match=False) -await tab.find_elements_by_text(text) -await tab.reload(ignore_cache=True, script_to_evaluate_on_load=None) -await tab.evaluate(expression) -await tab.js_dumps(obj_name) -await tab.back() -await tab.forward() -await tab.get_window() -await tab.get_content() -await tab.maximize() -await tab.minimize() -await tab.fullscreen() -await tab.medimize() -await tab.set_window_size(left=0, top=0, width=1280, height=1024) -await tab.set_window_rect(left=0, top=0, width=1280, height=1024) -await tab.activate() -await tab.bring_to_front() -await tab.set_window_state(left=0, top=0, width=1280, height=720, state="normal") -await tab.get_navigation_history() -await tab.get_user_agent() -await tab.get_cookie_string() -await tab.get_locale_code() -await tab.is_online() -await tab.open_external_inspector() # Open separate browser for debugging -await tab.close() -await tab.scroll_down(amount=25) -await tab.scroll_up(amount=25) -await tab.wait_for(selector="", text="", timeout=10) -await tab.set_attributes(selector, attribute, value) -await tab.internalize_links() -await tab.download_file(url, filename=None) -await tab.save_screenshot(filename="auto", format="png", full_page=False) -await tab.print_to_pdf(filename="auto") -await tab.set_download_path(path) -await tab.get_all_linked_sources() -await tab.get_all_urls(absolute=True) -await tab.get_html() -await tab.get_page_source() -await tab.is_element_present(selector) -await tab.is_element_visible(selector) -await tab.get_element_rect(selector, timeout=5) # (window-based) -await tab.get_window_rect() -await tab.get_gui_element_rect(selector, timeout=5) # (screen-based) -await tab.get_title() -await tab.get_current_url() -await tab.get_origin() -await tab.send_keys(selector, text, timeout=5) -await tab.type(selector, text, timeout=5) -await tab.click(selector, timeout=5) -await tab.click_if_visible(selector, timeout=0) -await tab.click_with_offset(selector, x, y, center=False, timeout=5) -await tab.solve_captcha() -await tab.click_captcha() # Same as solve_captcha() -await tab.get_document() -await tab.get_flattened_document() -await tab.get_local_storage() -await tab.set_local_storage(items) +await page.get(url="about:blank") +await page.open(url="about:blank") # Same as await page.get(url) in CDP Mode +await page.goto(url="about:blank") # Same as await page.get(url) in CDP Mode +await page.find(text, best_match=False, timeout=10) # text can be selector +await page.find_all(text, timeout=10) # text can be selector +await page.select(selector, timeout=10) +await page.select_all(selector, timeout=10, include_frames=False) +await page.query_selector(selector) +await page.query_selector_all(selector) +await page.find_element_by_text(text, best_match=False) +await page.find_elements_by_text(text) +await page.send_keys(selector, text, timeout=5) +await page.type(selector, text, timeout=5) +await page.click(selector, timeout=5) +await page.click_if_visible(selector, timeout=0) +await page.click_with_offset(selector, x, y, center=False, timeout=5) +await page.solve_captcha() +await page.click_captcha() # Same as solve_captcha() +await page.reload(ignore_cache=True, script_to_evaluate_on_load=None) +await page.evaluate(expression) +await page.js_dumps(obj_name) +await page.back() +await page.forward() +await page.get_window() +await page.get_content() +await page.maximize() +await page.minimize() +await page.fullscreen() +await page.medimize() +await page.set_window_size(left=0, top=0, width=1280, height=1024) +await page.set_window_rect(left=0, top=0, width=1280, height=1024) +await page.activate() +await page.bring_to_front() +await page.set_window_state(left=0, top=0, width=1280, height=720, state="normal") +await page.get_navigation_history() +await page.get_user_agent() +await page.get_cookie_string() +await page.get_locale_code() +await page.is_element_present(selector) +await page.is_element_visible(selector) +await page.is_online() +await page.open_external_inspector() # Open separate browser for debugging +await page.close() +await page.scroll_down(amount=25) +await page.scroll_up(amount=25) +await page.wait_for(selector="", text="", timeout=10) +await page.set_attributes(selector, attribute, value) +await page.internalize_links() +await page.download_file(url, filename=None) +await page.save_screenshot(filename="auto", format="png", full_page=False) +await page.print_to_pdf(filename="auto") +await page.set_download_path(path) +await page.get_all_linked_sources() +await page.get_all_urls(absolute=True) +await page.get_html() +await page.get_page_source() +await page.get_element_rect(selector, timeout=5) # (window-based) +await page.get_window_rect() +await page.get_gui_element_rect(selector, timeout=5) # (screen-based) +await page.get_title() +await page.get_current_url() +await page.get_origin() +await page.get_document() +await page.get_flattened_document() +await page.get_local_storage() +await page.set_local_storage(items) ``` ---- diff --git a/examples/cdp_mode/raw_ahrefs.py b/examples/cdp_mode/raw_ahrefs.py index d722e7aaece..3e61418e879 100644 --- a/examples/cdp_mode/raw_ahrefs.py +++ b/examples/cdp_mode/raw_ahrefs.py @@ -1,13 +1,12 @@ from seleniumbase import SB with SB(uc=True, test=True, incognito=True, locale="en") as sb: - url = "https://ahrefs.com/website-authority-checker" - input_field = 'input[placeholder="Enter domain"]' - submit_button = 'span:contains("Check Authority")' - sb.activate_cdp_mode(url) # The bot-check is later - sb.type(input_field, "github.com/seleniumbase/SeleniumBase") + sb.activate_cdp_mode() + sb.goto("https://ahrefs.com/website-authority-checker") + search_term = "github.com/seleniumbase/SeleniumBase" + sb.type('input[placeholder="Enter domain"]', search_term) sb.scroll_down(36) - sb.click(submit_button) + sb.click('span:contains("Check Authority")') sb.sleep(2) sb.solve_captcha() sb.sleep(3) diff --git a/examples/cdp_mode/raw_albertsons.py b/examples/cdp_mode/raw_albertsons.py index c11bd4493f5..f3ff09223a3 100644 --- a/examples/cdp_mode/raw_albertsons.py +++ b/examples/cdp_mode/raw_albertsons.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en") as sb: - url = "https://www.albertsons.com/recipes/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.albertsons.com/recipes/") sb.sleep(2.5) sb.remove_element("div > div > article") sb.scroll_into_view('input[type="search"]') diff --git a/examples/cdp_mode/raw_amazon.py b/examples/cdp_mode/raw_amazon.py index cc8b6f30a66..8281f2fe9ab 100644 --- a/examples/cdp_mode/raw_amazon.py +++ b/examples/cdp_mode/raw_amazon.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://www.amazon.com" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.amazon.com") sb.sleep(2) sb.click_if_visible('button[alt="Continue shopping"]') sb.sleep(2) diff --git a/examples/cdp_mode/raw_antibot.py b/examples/cdp_mode/raw_antibot.py index 0c999265d03..788d1e53517 100644 --- a/examples/cdp_mode/raw_antibot.py +++ b/examples/cdp_mode/raw_antibot.py @@ -3,8 +3,8 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://seleniumbase.io/antibot/login" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io/antibot/login") sb.press_keys("input#username", "demo_user") sb.type("input#password", "secret_pass") sb.click("button#myButton") diff --git a/examples/cdp_mode/raw_async.py b/examples/cdp_mode/raw_async.py index c5040b30ce0..58ecb833099 100644 --- a/examples/cdp_mode/raw_async.py +++ b/examples/cdp_mode/raw_async.py @@ -68,4 +68,4 @@ async def main(): cards = sb.select_all('span[data-automation*="product-list-card"]') for card in cards: print("* %s" % card.text) - sb.driver.stop() + sb.quit() diff --git a/examples/cdp_mode/raw_basic_mobile.py b/examples/cdp_mode/raw_basic_mobile.py index 476732ee6f0..559f1882e01 100644 --- a/examples/cdp_mode/raw_basic_mobile.py +++ b/examples/cdp_mode/raw_basic_mobile.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, mobile=True) as sb: - url = "https://gitlab.com/users/sign_in" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://gitlab.com/users/sign_in") sb.sleep(2) sb.solve_captcha() # (The rest is for testing and demo purposes) diff --git a/examples/cdp_mode/raw_bestwestern.py b/examples/cdp_mode/raw_bestwestern.py index 9c0c58dac4c..3e460c3872c 100644 --- a/examples/cdp_mode/raw_bestwestern.py +++ b/examples/cdp_mode/raw_bestwestern.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", guest=True) as sb: - url = "https://www.bestwestern.com/en_US.html" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.bestwestern.com/en_US.html") sb.sleep(3) sb.click_if_visible(".onetrust-close-btn-handler") sb.sleep(1) diff --git a/examples/cdp_mode/raw_canvas.py b/examples/cdp_mode/raw_canvas.py index 9cd23f7854e..69fe7d0dcc5 100644 --- a/examples/cdp_mode/raw_canvas.py +++ b/examples/cdp_mode/raw_canvas.py @@ -13,8 +13,8 @@ def get_canvas_pixel_colors_at_top_left(sb): with SB(uc=True, test=True) as sb: # Testing click_with_offset() - url = "https://seleniumbase.io/canvas/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io/canvas/") sb.assert_title_contains("Canvas") sb.highlight("canvas") rgb = get_canvas_pixel_colors_at_top_left(sb) @@ -26,8 +26,8 @@ def get_canvas_pixel_colors_at_top_left(sb): with SB(uc=True, test=True) as sb: # Testing gui_click_with_offset() - url = "https://seleniumbase.io/other/canvas" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io/other/canvas") sb.assert_title_contains("Canvas") sb.click_with_offset("canvas", 0, 0, center=True) sb.sleep(1) diff --git a/examples/cdp_mode/raw_cdp.py b/examples/cdp_mode/raw_cdp.py index 62619f80690..19772f48293 100644 --- a/examples/cdp_mode/raw_cdp.py +++ b/examples/cdp_mode/raw_cdp.py @@ -5,8 +5,8 @@ @decorators.print_runtime("CDP Priceline Example") def main(): - url = "https://www.priceline.com/" - sb = sb_cdp.Chrome(url, lang="en") + sb = sb_cdp.Chrome(lang="en") + sb.goto("https://www.priceline.com/") sb.sleep(2) sb.internalize_links() # Don't open links in a new tab sb.click("#link_header_nav_experiences") @@ -32,7 +32,7 @@ def main(): cards = sb.select_all('span[data-automation*="product-list-card"]') for card in cards: print("* %s" % card.text) - sb.driver.stop() + sb.quit() if __name__ == "__main__": diff --git a/examples/cdp_mode/raw_cdp_copilot.py b/examples/cdp_mode/raw_cdp_copilot.py index 06096b26020..79732685a89 100644 --- a/examples/cdp_mode/raw_cdp_copilot.py +++ b/examples/cdp_mode/raw_cdp_copilot.py @@ -1,23 +1,20 @@ +from contextlib import suppress from seleniumbase import sb_cdp -url = "https://copilot.microsoft.com/" -sb = sb_cdp.Chrome(url, locale="en", guest=True) +sb = sb_cdp.Chrome(locale="en", incognito=True) +sb.goto("https://copilot.microsoft.com/") textarea = "textarea#userInput" sb.wait_for_element(textarea) sb.sleep(1.3) sb.click_if_visible('[aria-label="Dismiss"]') -sb.sleep(0.5) -sb.click('button[data-testid*="chat-mode-"]') -sb.sleep(1.1) -sb.click_if_visible('button[title^="Think"]') -sb.sleep(1.1) +sb.sleep(1.2) query = "How to start automating with SeleniumBase?" sb.press_keys(textarea, query) sb.sleep(1.1) seen_text = sb.get_text(textarea) if seen_text != query and seen_text in query: # When CAPTCHA appears while typing text - sb.sleep(1.1) + sb.sleep(1.2) sb.solve_captcha() sb.sleep(2.2) sb.type(textarea, "") @@ -31,8 +28,10 @@ sb.sleep(2.5) stop_button = '[data-testid="stop-button"]' thumbs_up = 'button[data-testid*="-thumbs-up-"]' -sb.wait_for_element_absent(stop_button, timeout=50) -sb.wait_for_element(thumbs_up, timeout=20) +with suppress(Exception): + sb.wait_for_element_absent(stop_button, timeout=45) +with suppress(Exception): + sb.wait_for_element(thumbs_up, timeout=15) sb.sleep(0.6) scroll = 'button[data-testid*="scroll-to-bottom"]' sb.click_if_visible(scroll) diff --git a/examples/cdp_mode/raw_cdp_gitlab.py b/examples/cdp_mode/raw_cdp_gitlab.py index 1df993e619c..8df2c581b99 100644 --- a/examples/cdp_mode/raw_cdp_gitlab.py +++ b/examples/cdp_mode/raw_cdp_gitlab.py @@ -1,7 +1,7 @@ from seleniumbase import sb_cdp -url = "https://gitlab.com/users/sign_in" -sb = sb_cdp.Chrome(url, incognito=True) +sb = sb_cdp.Chrome(incognito=True) +sb.goto("https://gitlab.com/users/sign_in") sb.sleep(2) sb.solve_captcha() sb.highlight('h1:contains("GitLab")') diff --git a/examples/cdp_mode/raw_cdp_hyatt.py b/examples/cdp_mode/raw_cdp_hyatt.py index 085d4050e8b..1607ad29dfa 100644 --- a/examples/cdp_mode/raw_cdp_hyatt.py +++ b/examples/cdp_mode/raw_cdp_hyatt.py @@ -1,7 +1,7 @@ from seleniumbase import sb_cdp -url = "https://www.hyatt.com/" -sb = sb_cdp.Chrome(url, locale="en", guest=True) +sb = sb_cdp.Chrome(locale="en", guest=True) +sb.goto("https://www.hyatt.com/") sb.sleep(3.6) sb.click_if_visible('button[aria-label="Close"]') sb.sleep(0.1) diff --git a/examples/cdp_mode/raw_cdp_login.py b/examples/cdp_mode/raw_cdp_login.py index 793eb64afb1..6a9a68aceb7 100644 --- a/examples/cdp_mode/raw_cdp_login.py +++ b/examples/cdp_mode/raw_cdp_login.py @@ -3,8 +3,8 @@ def main(): - url = "https://seleniumbase.io/simple/login" - sb = sb_cdp.Chrome(url) + sb = sb_cdp.Chrome() + sb.goto("https://seleniumbase.io/simple/login") sb.type("#username", "demo_user") sb.type("#password", "secret_pass") sb.click('a:contains("Sign in")') diff --git a/examples/cdp_mode/raw_cdp_methods.py b/examples/cdp_mode/raw_cdp_methods.py index 34872606b7a..53e0c99aea8 100644 --- a/examples/cdp_mode/raw_cdp_methods.py +++ b/examples/cdp_mode/raw_cdp_methods.py @@ -1,7 +1,7 @@ from seleniumbase import sb_cdp -url = "https://seleniumbase.io/demo_page" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://seleniumbase.io/demo_page") sb.press_keys("input", "Text") sb.highlight("button") sb.type("textarea", "Here are some words") diff --git a/examples/cdp_mode/raw_cdp_mobile.py b/examples/cdp_mode/raw_cdp_mobile.py index 55dd2ff49c5..5660965569a 100644 --- a/examples/cdp_mode/raw_cdp_mobile.py +++ b/examples/cdp_mode/raw_cdp_mobile.py @@ -11,8 +11,7 @@ ) ) ) -url = "https://gitlab.com/users/sign_in" -sb.goto(url) +sb.goto("https://gitlab.com/users/sign_in") sb.sleep(2) sb.solve_captcha() # (The rest is for testing and demo purposes) diff --git a/examples/cdp_mode/raw_cdp_nike.py b/examples/cdp_mode/raw_cdp_nike.py index 3470f78b980..d9769dd5407 100644 --- a/examples/cdp_mode/raw_cdp_nike.py +++ b/examples/cdp_mode/raw_cdp_nike.py @@ -1,7 +1,7 @@ from seleniumbase import sb_cdp -url = "https://www.nike.com/" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://www.nike.com/") sb.sleep(1.2) sb.click('[data-testid="user-tools-container"] search') sb.sleep(1) diff --git a/examples/cdp_mode/raw_cdp_nordstrom.py b/examples/cdp_mode/raw_cdp_nordstrom.py index b42b7f87eed..ab7e90562af 100644 --- a/examples/cdp_mode/raw_cdp_nordstrom.py +++ b/examples/cdp_mode/raw_cdp_nordstrom.py @@ -1,7 +1,7 @@ from seleniumbase import sb_cdp -url = "https://www.nordstrom.com/" -sb = sb_cdp.Chrome(url, locale="en", guest=True) +sb = sb_cdp.Chrome(locale="en", guest=True) +sb.goto("https://www.nordstrom.com/") sb.sleep(2.2) sb.click("input#keyword-search-input") sb.sleep(0.8) diff --git a/examples/cdp_mode/raw_cdp_patent.py b/examples/cdp_mode/raw_cdp_patent.py index 0428ede42c3..34941f43310 100644 --- a/examples/cdp_mode/raw_cdp_patent.py +++ b/examples/cdp_mode/raw_cdp_patent.py @@ -1,9 +1,10 @@ from seleniumbase import sb_cdp -url = "https://www.lens.org/lens/patent/135-034-272-112-366/frontpage" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://www.lens.org/lens/patent/135-034-272-112-366/frontpage") sb.sleep(4) sb.solve_captcha() sb.flash('[ng-if*="patent.title"]', duration=3, pause=2) print("* " + sb.get_text('[ng-if*="patent.title"]') + " *") print(sb.get_text("ol.claims")) +sb.quit() diff --git a/examples/cdp_mode/raw_cdp_reddit.py b/examples/cdp_mode/raw_cdp_reddit.py index 3cca3bb2502..afcfaec0e30 100644 --- a/examples/cdp_mode/raw_cdp_reddit.py +++ b/examples/cdp_mode/raw_cdp_reddit.py @@ -3,7 +3,8 @@ search = "reddit+scraper" url = f"https://www.reddit.com/r/webscraping/search/?q={search}" -sb = sb_cdp.Chrome(url, use_chromium=True) +sb = sb_cdp.Chrome(use_chromium=True) +sb.goto(url) sb.solve_captcha() # Might not be needed post_title = '[data-testid="post-title"]' sb.wait_for_element(post_title) diff --git a/examples/cdp_mode/raw_cdp_shadow.py b/examples/cdp_mode/raw_cdp_shadow.py index 60a581c19ff..f83fdfc7862 100644 --- a/examples/cdp_mode/raw_cdp_shadow.py +++ b/examples/cdp_mode/raw_cdp_shadow.py @@ -1,8 +1,8 @@ """An example of displaying Shadow DOM inside HTML""" from seleniumbase import sb_cdp -url = "https://seleniumbase.io/apps/turnstile" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://seleniumbase.io/apps/turnstile") element = sb.find_element("div.cf-turnstile div") html_with_shadow_dom = element.get_html() print(html_with_shadow_dom) diff --git a/examples/cdp_mode/raw_cdp_turnstile.py b/examples/cdp_mode/raw_cdp_turnstile.py index e46e23df26e..a8366eebdf3 100644 --- a/examples/cdp_mode/raw_cdp_turnstile.py +++ b/examples/cdp_mode/raw_cdp_turnstile.py @@ -1,7 +1,7 @@ from seleniumbase import sb_cdp -url = "https://seleniumbase.io/apps/turnstile" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://seleniumbase.io/apps/turnstile") sb.solve_captcha() sb.assert_element("img#captcha-success") sb.set_messenger_theme(location="top_left") diff --git a/examples/cdp_mode/raw_cdp_walmart.py b/examples/cdp_mode/raw_cdp_walmart.py index 6d8018d3fb3..3bb233083b0 100644 --- a/examples/cdp_mode/raw_cdp_walmart.py +++ b/examples/cdp_mode/raw_cdp_walmart.py @@ -1,7 +1,7 @@ from seleniumbase import sb_cdp -url = "https://www.walmart.com/" -sb = sb_cdp.Chrome(url, locale="en", guest=True) +sb = sb_cdp.Chrome(locale="en", guest=True) +sb.goto("https://www.walmart.com/") sb.sleep(3) continue_button = 'button:contains("Continue shopping")' if sb.is_element_visible(continue_button): diff --git a/examples/cdp_mode/raw_cdp_with_sb.py b/examples/cdp_mode/raw_cdp_with_sb.py index a9b3c782af6..f43e741d792 100644 --- a/examples/cdp_mode/raw_cdp_with_sb.py +++ b/examples/cdp_mode/raw_cdp_with_sb.py @@ -3,8 +3,8 @@ with SB(uc=True, test=True, locale="en") as sb: - url = "https://www.priceline.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.priceline.com/") sb.sleep(2.5) sb.internalize_links() # Don't open links in a new tab sb.click_if_visible('[aria-label="Close Modal"]') diff --git a/examples/cdp_mode/raw_cdp_xpath.py b/examples/cdp_mode/raw_cdp_xpath.py new file mode 100644 index 00000000000..f71ad401a53 --- /dev/null +++ b/examples/cdp_mode/raw_cdp_xpath.py @@ -0,0 +1,15 @@ +"""Test that CDP Mode can use XPath selectors.""" +from seleniumbase import sb_cdp + +sb = sb_cdp.Chrome() +sb.goto("https://seleniumbase.io/demo_page") +sb.highlight('//input[@id="myTextInput"]') +sb.type('//*[@id="myTextInput"]', "XPath Test!") +sb.sleep(0.5) +sb.highlight('//button[contains(text(),"(Green)")]') +sb.click('//button[starts-with(text(),"Click Me")]') +sb.assert_element('//button[contains(., "Purple")]') +sb.sleep(0.5) +sb.highlight("//table/tbody/tr/td/h3") +sb.highlight("//table/tbody/tr[1]/td[2]/h2") +sb.assert_text("SeleniumBase", "//table//h2") diff --git a/examples/cdp_mode/raw_cdp_yc_news.py b/examples/cdp_mode/raw_cdp_yc_news.py index 55cb6ed0282..49747c80162 100644 --- a/examples/cdp_mode/raw_cdp_yc_news.py +++ b/examples/cdp_mode/raw_cdp_yc_news.py @@ -1,7 +1,7 @@ from seleniumbase import sb_cdp -url = "https://news.ycombinator.com/submitted?id=seleniumbase" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://news.ycombinator.com/submitted?id=seleniumbase") elements = sb.find_elements("span.titleline > a") for element in elements: print("* " + element.text) diff --git a/examples/cdp_mode/raw_cf_captcha.py b/examples/cdp_mode/raw_cf_captcha.py index be2c0b48351..37ad86027c7 100644 --- a/examples/cdp_mode/raw_cf_captcha.py +++ b/examples/cdp_mode/raw_cf_captcha.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, incognito=True) as sb: - url = "https://www.cloudflare.com/login" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.cloudflare.com/login") sb.wait_for_element('div[data-testid*="challenge-widget"]') sb.sleep(2.5) sb.solve_captcha() diff --git a/examples/cdp_mode/raw_cf_clearance.py b/examples/cdp_mode/raw_cf_clearance.py index cc77ff672d0..6cf2eed7760 100644 --- a/examples/cdp_mode/raw_cf_clearance.py +++ b/examples/cdp_mode/raw_cf_clearance.py @@ -9,8 +9,8 @@ def get_cf_clearance_cookie(sb): return None -url = "https://gitlab.com/users/sign_in" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://gitlab.com/users/sign_in") sb.sleep(3) # Wait for CAPTCHA to load sb.solve_captcha() # (Only if found) sb.sleep(2) # Wait for CAPTCHA success diff --git a/examples/cdp_mode/raw_chatgpt.py b/examples/cdp_mode/raw_chatgpt.py index cace8953506..c31776422d3 100644 --- a/examples/cdp_mode/raw_chatgpt.py +++ b/examples/cdp_mode/raw_chatgpt.py @@ -2,8 +2,8 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://chatgpt.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.open("https://chatgpt.com/") sb.sleep(1) sb.click_if_visible('button[aria-label="Close dialog"]') sb.click_if_visible('button[data-testid="close-button"]') diff --git a/examples/cdp_mode/raw_copilot.py b/examples/cdp_mode/raw_copilot.py index 51858c5f4fa..8a66f3d3739 100644 --- a/examples/cdp_mode/raw_copilot.py +++ b/examples/cdp_mode/raw_copilot.py @@ -1,17 +1,14 @@ +from contextlib import suppress from seleniumbase import SB -with SB(uc=True, test=True, locale="en") as sb: - url = "https://copilot.microsoft.com/" - sb.activate_cdp_mode(url) +with SB(uc=True, test=True, locale="en", incognito=True) as sb: + sb.activate_cdp_mode() + sb.goto("https://copilot.microsoft.com/") textarea = "textarea#userInput" sb.wait_for_element(textarea) sb.sleep(1.3) sb.click_if_visible('[aria-label="Dismiss"]') - sb.sleep(0.5) - sb.click('button[data-testid*="chat-mode-"]') - sb.sleep(1.1) - sb.click_if_visible('button[title^="Think"]') - sb.sleep(1.1) + sb.sleep(1.2) query = "How to start automating with SeleniumBase?" sb.press_keys(textarea, query) sb.sleep(1.1) @@ -32,8 +29,10 @@ sb.sleep(2.5) stop_button = '[data-testid="stop-button"]' thumbs_up = 'button[data-testid*="-thumbs-up-"]' - sb.wait_for_element_absent(stop_button, timeout=50) - sb.wait_for_element(thumbs_up, timeout=20) + with suppress(Exception): + sb.wait_for_element_absent(stop_button, timeout=45) + with suppress(Exception): + sb.wait_for_element(thumbs_up, timeout=15) sb.sleep(0.6) scroll = 'button[data-testid*="scroll-to-bottom"]' sb.click_if_visible(scroll) diff --git a/examples/cdp_mode/raw_drag_and_drop.py b/examples/cdp_mode/raw_drag_and_drop.py index e5057f32da7..373dc602224 100644 --- a/examples/cdp_mode/raw_drag_and_drop.py +++ b/examples/cdp_mode/raw_drag_and_drop.py @@ -1,16 +1,16 @@ from seleniumbase import SB with SB(uc=True, test=True, incognito=True) as sb: - url = "https://seleniumbase.io/other/drag_and_drop" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io/other/drag_and_drop") sb.assert_element_not_visible("#div1 img#drag1") sb.gui_drag_and_drop("#drag1", "#div1") sb.assert_element("#div1 img#drag1") sb.sleep(1) with SB(uc=True, test=True, incognito=True) as sb: - url = "https://jqueryui.com/draggable/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://jqueryui.com/draggable/") sb.switch_to_frame("iframe") x, y = sb.get_gui_element_center("#draggable") sb.switch_to_default_content() diff --git a/examples/cdp_mode/raw_easyjet.py b/examples/cdp_mode/raw_easyjet.py index ea3e61e38a0..d747dfa37cd 100644 --- a/examples/cdp_mode/raw_easyjet.py +++ b/examples/cdp_mode/raw_easyjet.py @@ -1,9 +1,9 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", ad_block=True) as sb: - url = "https://www.easyjet.com/en/" - sb.activate_cdp_mode(url) - sb.sleep(1.5) + sb.activate_cdp_mode() + sb.goto("https://www.easyjet.com/en/") + sb.sleep(1.8) sb.click_if_visible("button#ensRejectAds", timeout=2) sb.sleep(1) sb.click('input[name="from"]') diff --git a/examples/cdp_mode/raw_elal.py b/examples/cdp_mode/raw_elal.py index c76a07b0587..3274920e2d5 100644 --- a/examples/cdp_mode/raw_elal.py +++ b/examples/cdp_mode/raw_elal.py @@ -2,8 +2,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", incognito=True) as sb: - url = "www.elal.com/flight-deals/en-us/flights-from-boston-to-tel-aviv" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("www.elal.com/flight-deals/en-us/flights-from-boston-to-tel-aviv") sb.sleep(5) sb.click('button[data-att="search"]') sb.sleep(5) diff --git a/examples/cdp_mode/raw_facebook.py b/examples/cdp_mode/raw_facebook.py index 641010d246a..c860afbeddc 100644 --- a/examples/cdp_mode/raw_facebook.py +++ b/examples/cdp_mode/raw_facebook.py @@ -1,10 +1,10 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://www.facebook.com/SeleniumBase" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.facebook.com/SeleniumBase") sb.sleep(1) - sb.click_if_visible('[aria-label="Close"] i') + sb.click_if_visible('[aria-label="Close"] i', timeout=2) sb.sleep(1) for i in range(18): sb.scroll_down(14) diff --git a/examples/cdp_mode/raw_footlocker.py b/examples/cdp_mode/raw_footlocker.py index 110b22e917d..46ae030e3b9 100644 --- a/examples/cdp_mode/raw_footlocker.py +++ b/examples/cdp_mode/raw_footlocker.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", ad_block=True) as sb: - url = "https://www.footlocker.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.footlocker.com/") sb.sleep(2.5) sb.click_if_visible('button[id*="Agree"]') sb.sleep(1.5) diff --git a/examples/cdp_mode/raw_form_turnstile.py b/examples/cdp_mode/raw_form_turnstile.py index f5eaa3ff1fb..471d53261cf 100644 --- a/examples/cdp_mode/raw_form_turnstile.py +++ b/examples/cdp_mode/raw_form_turnstile.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "seleniumbase.io/apps/form_turnstile" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("seleniumbase.io/apps/form_turnstile") sb.press_keys("#name", "SeleniumBase") sb.press_keys("#email", "test@test.test") sb.press_keys("#phone", "1-555-555-5555") diff --git a/examples/cdp_mode/raw_geolocation.py b/examples/cdp_mode/raw_geolocation.py index f4b11d42f35..9dce857352a 100644 --- a/examples/cdp_mode/raw_geolocation.py +++ b/examples/cdp_mode/raw_geolocation.py @@ -5,9 +5,9 @@ @decorators.print_runtime("Geolocation CDP Example") def main(): - url = "https://www.openstreetmap.org/" location = (48.87645, 2.26340) - sb = sb_cdp.Chrome(url, geoloc=location, use_chromium=True) + sb = sb_cdp.Chrome(geoloc=location) + sb.goto("https://www.openstreetmap.org/") sb.sleep(2) sb.click('a[aria-label="Show My Location"]') sb.assert_url_contains("48.876450/2.263400") diff --git a/examples/cdp_mode/raw_geolocation_sb.py b/examples/cdp_mode/raw_geolocation_sb.py index 71a1deccc61..e6d51f37630 100644 --- a/examples/cdp_mode/raw_geolocation_sb.py +++ b/examples/cdp_mode/raw_geolocation_sb.py @@ -1,10 +1,10 @@ """Geolocation example with CDP Mode""" from seleniumbase import SB -with SB(uc=True, test=True, use_chromium=True) as sb: - url = "https://www.openstreetmap.org/" +with SB(uc=True, test=True) as sb: location = (31.774390, 35.222450) - sb.activate_cdp_mode(url, geoloc=location) + sb.activate_cdp_mode(geoloc=location) + sb.goto("https://www.openstreetmap.org/") sb.click('a[aria-label="Show My Location"]') sb.assert_url_contains("31.774390/35.222450") sb.sleep(5) diff --git a/examples/cdp_mode/raw_gitlab.py b/examples/cdp_mode/raw_gitlab.py index ddc8cd8f92d..b677548cd23 100644 --- a/examples/cdp_mode/raw_gitlab.py +++ b/examples/cdp_mode/raw_gitlab.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en") as sb: - url = "https://gitlab.com/users/sign_in" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://gitlab.com/users/sign_in") sb.sleep(2) sb.solve_captcha() # (The rest is for testing and demo purposes) diff --git a/examples/cdp_mode/raw_glassdoor.py b/examples/cdp_mode/raw_glassdoor.py index 43edfff5516..5dcfe23dbde 100644 --- a/examples/cdp_mode/raw_glassdoor.py +++ b/examples/cdp_mode/raw_glassdoor.py @@ -1,9 +1,9 @@ from seleniumbase import SB with SB(uc=True, test=True, incognito=True) as sb: - url = "https://www.glassdoor.com/Reviews/index.htm" - sb.activate_cdp_mode(url) - sb.sleep(2.1) + sb.activate_cdp_mode() + sb.goto("https://www.glassdoor.com/Reviews/index.htm") + sb.sleep(2.2) sb.solve_captcha() sb.sleep(0.6) sb.highlight('[data-test="global-nav-glassdoor-logo"]') diff --git a/examples/cdp_mode/raw_hacker_news.py b/examples/cdp_mode/raw_hacker_news.py index e2c16ba6f63..7f49f1117ef 100644 --- a/examples/cdp_mode/raw_hacker_news.py +++ b/examples/cdp_mode/raw_hacker_news.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True) as sb: - url = "https://news.ycombinator.com/submitted?id=seleniumbase" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://news.ycombinator.com/submitted?id=seleniumbase") elements = sb.find_elements("span.titleline > a") for element in elements: print("* " + element.text) diff --git a/examples/cdp_mode/raw_handle_alerts.py b/examples/cdp_mode/raw_handle_alerts.py index eefd6fa52b9..e769def556f 100644 --- a/examples/cdp_mode/raw_handle_alerts.py +++ b/examples/cdp_mode/raw_handle_alerts.py @@ -2,8 +2,8 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://the-internet.herokuapp.com/javascript_alerts" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://the-internet.herokuapp.com/javascript_alerts") sb.click('button[onclick="jsAlert()"]') sb.sleep(1) sb.uc_gui_press_key("\n") # Accept Alert diff --git a/examples/cdp_mode/raw_hilton.py b/examples/cdp_mode/raw_hilton.py index a30793966e9..73bdcdaa81e 100644 --- a/examples/cdp_mode/raw_hilton.py +++ b/examples/cdp_mode/raw_hilton.py @@ -1,8 +1,8 @@ from seleniumbase import SB -with SB(uc=True, test=True, locale="en") as sb: - url = "https://www.hilton.com/en/" - sb.activate_cdp_mode(url) +with SB(uc=True, test=True, locale="en", use_chromium=True) as sb: + sb.activate_cdp_mode() + sb.goto("https://www.hilton.com/en/") sb.sleep(4.5) location = "Sunnyvale, CA, USA" location_input = "input#location-input" @@ -16,7 +16,7 @@ sb.sleep(1.2) sb.click('button[aria-current="date"]') sb.sleep(1.2) - sb.click('[role="dialog"] button.btn--solid') + sb.click_if_visible('[role="dialog"] button.btn--solid') sb.sleep(1.5) sb.click('button[data-testid="search-submit-button"]') sb.sleep(6.5) diff --git a/examples/cdp_mode/raw_homedepot.py b/examples/cdp_mode/raw_homedepot.py index 83c5e1cfd7c..244a3dc7575 100644 --- a/examples/cdp_mode/raw_homedepot.py +++ b/examples/cdp_mode/raw_homedepot.py @@ -1,9 +1,9 @@ from seleniumbase import SB with SB(uc=True, test=True, incognito=True) as sb: - url = "https://www.homedepot.com/" - sb.activate_cdp_mode(url) - sb.sleep(1.4) + sb.activate_cdp_mode() + sb.goto("https://www.homedepot.com/") + sb.sleep(1.5) sb.click_if_visible('[data-testid="CloseIcon"]', timeout=3) sb.sleep(1.2) search_box = "input#typeahead-search-field-input" diff --git a/examples/cdp_mode/raw_hyatt.py b/examples/cdp_mode/raw_hyatt.py index 72990eb8687..cc90bf45c9d 100644 --- a/examples/cdp_mode/raw_hyatt.py +++ b/examples/cdp_mode/raw_hyatt.py @@ -1,9 +1,9 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", guest=True) as sb: - url = "https://www.hyatt.com/" - sb.activate_cdp_mode(url) - sb.sleep(3.4) + sb.activate_cdp_mode() + sb.goto("https://www.hyatt.com/") + sb.sleep(3.6) sb.click_if_visible('button[aria-label="Close"]') sb.sleep(0.1) sb.click_if_visible("#onetrust-reject-all-handler") diff --git a/examples/cdp_mode/raw_idealista.py b/examples/cdp_mode/raw_idealista.py index 9aeb13e78a7..671e64e04b7 100644 --- a/examples/cdp_mode/raw_idealista.py +++ b/examples/cdp_mode/raw_idealista.py @@ -2,14 +2,15 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="es") as sb: - url = "https://www.idealista.com/venta-viviendas/barcelona-provincia/" - sb.activate_cdp_mode(url) - sb.sleep(1) + sb.activate_cdp_mode() + sb.goto("https://www.idealista.com/venta-viviendas/barcelona-provincia/") + sb.sleep(1.5) sb.solve_captcha() sb.sleep(2) sb.click("button#didomi-notice-agree-button") print("*** " + sb.get_text("h1")) items = sb.find_elements("div.item-info-container") for item in items: + item.flash(color="44CC88") print(item.querySelector("a.item-link").text) print(item.querySelector("span.item-price").text) diff --git a/examples/cdp_mode/raw_indeed.py b/examples/cdp_mode/raw_indeed.py index 3afae7e6e7c..44c4d800553 100644 --- a/examples/cdp_mode/raw_indeed.py +++ b/examples/cdp_mode/raw_indeed.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://www.indeed.com/companies/search" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.indeed.com/companies/search") sb.sleep(2) sb.solve_captcha() sb.sleep(1) diff --git a/examples/cdp_mode/raw_indeed_login.py b/examples/cdp_mode/raw_indeed_login.py index 7570afc382a..68198d55991 100644 --- a/examples/cdp_mode/raw_indeed_login.py +++ b/examples/cdp_mode/raw_indeed_login.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, incognito=True) as sb: - url = "https://secure.indeed.com/auth" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://secure.indeed.com/auth") sb.sleep(2.2) if not sb.is_element_visible('input[type="email"]'): sb.solve_captcha() diff --git a/examples/cdp_mode/raw_kohls.py b/examples/cdp_mode/raw_kohls.py index c7c451800fb..f4836b3bab1 100644 --- a/examples/cdp_mode/raw_kohls.py +++ b/examples/cdp_mode/raw_kohls.py @@ -7,7 +7,8 @@ s2 = "+".join(search.split(" ")) q = "?submit-search=web-regular&search=%s" % s2 url = "https://www.kohls.com/search.jsp%s" % q - sb.activate_cdp_mode(url, ad_block=True) + sb.activate_cdp_mode(ad_block=True) + sb.goto(url) sb.sleep(5) item_selector = 'div[data-testid*="wallet-wrapper"]' if not sb.is_element_present(item_selector): diff --git a/examples/cdp_mode/raw_linkedin.py b/examples/cdp_mode/raw_linkedin.py index 642e5402dcf..f900da94da7 100644 --- a/examples/cdp_mode/raw_linkedin.py +++ b/examples/cdp_mode/raw_linkedin.py @@ -1,10 +1,10 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://www.linkedin.com/company/selenium" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.linkedin.com/company/selenium") sb.sleep(1) - sb.click_if_visible('button[aria-label="Dismiss"]') + sb.click_if_visible('button[aria-label="Dismiss"]', timeout=2) sb.sleep(0.5) for i in range(14): sb.scroll_down(48) diff --git a/examples/cdp_mode/raw_mouser.py b/examples/cdp_mode/raw_mouser.py index 99c4c013dc4..79cc4afa0b9 100644 --- a/examples/cdp_mode/raw_mouser.py +++ b/examples/cdp_mode/raw_mouser.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en") as sb: - url = "https://www.mouser.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.mouser.com/") sb.sleep(5) sb.press_keys('input[name="keyword"]', "FLUKE-TC01B 25HZ") sb.click('button[type="submit"]') diff --git a/examples/cdp_mode/raw_multi_captcha.py b/examples/cdp_mode/raw_multi_captcha.py index 8bea3b8b226..c3d005f515e 100644 --- a/examples/cdp_mode/raw_multi_captcha.py +++ b/examples/cdp_mode/raw_multi_captcha.py @@ -6,7 +6,8 @@ def main(url): - sb = sb_cdp.Chrome(url, lang="en", incognito=True) + sb = sb_cdp.Chrome(lang="en", incognito=True) + sb.goto(url) sb.set_window_rect(randint(4, 680), randint(8, 380), 840, 520) sb.sleep(2.6) sb.gui_click_captcha() diff --git a/examples/cdp_mode/raw_multi_cdp.py b/examples/cdp_mode/raw_multi_cdp.py index 56ea75ea9c6..20c464d2781 100644 --- a/examples/cdp_mode/raw_multi_cdp.py +++ b/examples/cdp_mode/raw_multi_cdp.py @@ -6,7 +6,8 @@ def main(url): - sb = sb_cdp.Chrome(url, lang="en") + sb = sb_cdp.Chrome(lang="en") + sb.goto(url) sb.set_window_rect(randint(4, 680), randint(8, 380), 840, 520) sb.press_keys("input", "Text") sb.highlight("button") diff --git a/examples/cdp_mode/raw_muse.py b/examples/cdp_mode/raw_muse.py index e182b6baa5a..aea0c83e1a9 100644 --- a/examples/cdp_mode/raw_muse.py +++ b/examples/cdp_mode/raw_muse.py @@ -2,9 +2,9 @@ from seleniumbase import SB with SB(uc=True, test=True, guest=True) as sb: - url = "https://muse.jhu.edu/verify" - sb.activate_cdp_mode(url) - sb.sleep(1.5) + sb.activate_cdp_mode() + sb.goto("https://muse.jhu.edu/verify") + sb.sleep(1.6) sb.solve_captcha() sb.sleep(4) sb.assert_element('#search_input') diff --git a/examples/cdp_mode/raw_nevada_search.py b/examples/cdp_mode/raw_nevada_search.py index 635b549d2d5..fb66ebd0805 100644 --- a/examples/cdp_mode/raw_nevada_search.py +++ b/examples/cdp_mode/raw_nevada_search.py @@ -2,8 +2,8 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://www.nvsilverflume.gov/home" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.nvsilverflume.gov/home") sb.sleep(3) sb.click('a[href="/redirectToCenuity/be"]') sb.sleep(3.6) diff --git a/examples/cdp_mode/raw_nike.py b/examples/cdp_mode/raw_nike.py index 770a13424c2..2a8ebc77cbc 100644 --- a/examples/cdp_mode/raw_nike.py +++ b/examples/cdp_mode/raw_nike.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", pls="none") as sb: - url = "https://www.nike.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.nike.com/") sb.sleep(2.5) sb.click('[data-testid="user-tools-container"] search') sb.sleep(1.5) diff --git a/examples/cdp_mode/raw_nordstrom.py b/examples/cdp_mode/raw_nordstrom.py index 96f7ff9cfb2..354231b5073 100644 --- a/examples/cdp_mode/raw_nordstrom.py +++ b/examples/cdp_mode/raw_nordstrom.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en") as sb: - url = "https://www.nordstrom.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.nordstrom.com/") sb.sleep(2.2) sb.click("input#keyword-search-input") sb.sleep(0.8) diff --git a/examples/cdp_mode/raw_patent.py b/examples/cdp_mode/raw_patent.py index 35f95a51db3..30744663c55 100644 --- a/examples/cdp_mode/raw_patent.py +++ b/examples/cdp_mode/raw_patent.py @@ -1,9 +1,9 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://www.lens.org/lens/patent/135-034-272-112-366/frontpage" - sb.activate_cdp_mode(url) - sb.sleep(3.5) + sb.activate_cdp_mode() + sb.goto("https://www.lens.org/lens/patent/135-034-272-112-366/frontpage") + sb.sleep(4) sb.solve_captcha() sb.flash('[ng-if*="patent.title"]', duration=3, pause=2) print("* " + sb.get_text('[ng-if*="patent.title"]') + " *") diff --git a/examples/cdp_mode/raw_pixelscan.py b/examples/cdp_mode/raw_pixelscan.py index 1ceedc79a79..b1de254b657 100644 --- a/examples/cdp_mode/raw_pixelscan.py +++ b/examples/cdp_mode/raw_pixelscan.py @@ -1,13 +1,13 @@ from seleniumbase import SB -with SB(uc=True, test=True, guest=True, ad_block=True) as sb: - url = "https://pixelscan.net/fingerprint-check" - sb.activate_cdp_mode(url) - sb.sleep(1) +with SB(uc=True, test=True, guest=True) as sb: + sb.activate_cdp_mode(ad_block=True) + sb.goto("https://pixelscan.net/fingerprint-check") + sb.sleep(1.5) sb.wait_for_element("pxlscn-dynamic-ad") sb.sleep(0.5) sb.remove_elements("pxlscn-dynamic-ad") - sb.sleep(1) + sb.sleep(1.5) sb.assert_text("No automated behavior", "pxlscn-bot-detection") sb.wait_for_element("span.status-success") sb.assert_text("No masking detected", "pxlscn-fingerprint-masking") diff --git a/examples/cdp_mode/raw_pokemon.py b/examples/cdp_mode/raw_pokemon.py index da78b82b245..aa44ebe5eb4 100644 --- a/examples/cdp_mode/raw_pokemon.py +++ b/examples/cdp_mode/raw_pokemon.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", ad_block=True) as sb: - url = "https://www.pokemon.com/us" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.pokemon.com/us") sb.sleep(1.5) sb.click_if_visible("button#onetrust-accept-btn-handler") sb.sleep(1.2) diff --git a/examples/cdp_mode/raw_priceline.py b/examples/cdp_mode/raw_priceline.py index fe85ddfca93..0a147013b61 100644 --- a/examples/cdp_mode/raw_priceline.py +++ b/examples/cdp_mode/raw_priceline.py @@ -2,27 +2,32 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", guest=True, pls="none") as sb: - url = "https://www.priceline.com" - sb.activate_cdp_mode(url) - sb.sleep(2.6) - input_selector = '[name="endLocation"]' + sb.activate_cdp_mode() + sb.goto("https://www.priceline.com") + sb.sleep(3) + input_selector = 'input[name="endLocation"]' if not sb.is_element_present(input_selector): input_selector = "div.location-input input" sb.click(input_selector) sb.sleep(1.2) location = "Portland, OR" selection = "Oregon, United States" # (Dropdown option) - sb.press_keys(input_selector, location) - sb.sleep(0.6) + sb.type(input_selector, location) + sb.sleep(0.5) sb.click(selection) sb.sleep(0.4) sb.scroll_down(25) - sb.sleep(0.4) + sb.sleep(0.2) + overlay_close = '[aria-label*="Overlay"] [title="Close"]' calendar_close = 'button[aria-label="Dismiss calendar"]' if not sb.is_element_visible(calendar_close): calendar_close = '[data-mode="range"] span.px-1' + sb.click_if_visible(overlay_close) + sb.sleep(0.3) sb.click(calendar_close) - sb.sleep(0.6) + sb.sleep(0.3) + sb.click_if_visible(overlay_close) + sb.sleep(0.3) sb.click('form button[type="submit"]') sb.sleep(4.8) if len(sb.get_tabs()) > 1: @@ -33,30 +38,15 @@ for y in range(1, 9): sb.scroll_to_y(y * 200) sb.sleep(0.4) - hotel_names = sb.find_elements('h3 div[class*="TitleName"]') - if not hotel_names: - hotel_names = sb.find_elements("h3.antialiased") - price_selector = '[class*="PriceWrap"] .relative > .items-center' - if sb.is_element_visible(price_selector): - hotel_prices = sb.find_elements(price_selector) - elif sb.is_element_present( - '[font-size="12px"] + [font-size="20px"]' - ): - hotel_prices = sb.find_elements( - '[font-size="12px"] + [font-size="20px"]' - ) - else: - hotel_prices = sb.find_elements( - 'span.text-priceSuper-heading4 + div > span' - ) - print("Priceline Hotels in %s:" % location) - if len(hotel_names) == 0: - print("No availability over the selected dates!") + hotels = sb.find_elements('div[data-vis-key*="content"]') count = 0 - for i, hotel in enumerate(hotel_names): - if hotel_prices[i] and hotel_prices[i].text: - count += 1 - hotel_price = "$" + hotel_prices[i].text - if hotel_price.startswith("$$ "): - hotel_price = hotel_price.replace("$$ ", "$") - print("* %s: %s => %s" % (count, hotel.text, hotel_price)) + for hotel in hotels: + title = hotel.query_selector("h3") + if title: + price = hotel.query_selector(".text-heading4") + if price: + count += 1 + price_text = price.text.replace(" ", "") + print("* %s: %s => %s" % (count, title.text, price_text)) + if not count: + print("No availability over the selected dates!") diff --git a/examples/cdp_mode/raw_print_to_pdf.py b/examples/cdp_mode/raw_print_to_pdf.py index de1a3ffe238..e4b4e5901d2 100644 --- a/examples/cdp_mode/raw_print_to_pdf.py +++ b/examples/cdp_mode/raw_print_to_pdf.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, pls="none") as sb: - url = "https://seleniumbase.io" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io") sb.assert_title("SeleniumBase Docs") file_path = "downloaded_files/sb.pdf" sb.print_to_pdf(file_path) diff --git a/examples/cdp_mode/raw_proxy.py b/examples/cdp_mode/raw_proxy.py index c5d4233a29f..526339b082a 100644 --- a/examples/cdp_mode/raw_proxy.py +++ b/examples/cdp_mode/raw_proxy.py @@ -7,8 +7,8 @@ @decorators.print_runtime("CDP Proxy Example") def main(): - url = "https://api.ipify.org/" - sb = sb_cdp.Chrome(url, lang="en", pls="none", proxy=proxy) + sb = sb_cdp.Chrome(lang="en", pls="none", proxy=proxy) + sb.goto("https://api.ipify.org/") ip_address = sb.get_text("body") if "ERR" in ip_address: raise Exception("Failed to determine IP Address!") diff --git a/examples/cdp_mode/raw_publication.py b/examples/cdp_mode/raw_publication.py index 088798f3fc1..efcec71ec45 100644 --- a/examples/cdp_mode/raw_publication.py +++ b/examples/cdp_mode/raw_publication.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", ad_block=True) as sb: - url = "https://www.researchgate.net/search/publication" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.researchgate.net/search/publication") sb.sleep(2.2) shadow_head = "div.main-content div" if sb.is_element_present(shadow_head): diff --git a/examples/cdp_mode/raw_radwell.py b/examples/cdp_mode/raw_radwell.py index f440638be44..df329526ae5 100644 --- a/examples/cdp_mode/raw_radwell.py +++ b/examples/cdp_mode/raw_radwell.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", incognito=True) as sb: - url = "https://www.radwell.com/en-US/Search/Advanced/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.radwell.com/en-US/Search/Advanced/") sb.sleep(1) sb.press_keys("form#basicsearch input", "821C-PM-111DA-142") sb.click('[value="Search Icon"]') diff --git a/examples/cdp_mode/raw_ralphlauren.py b/examples/cdp_mode/raw_ralphlauren.py index 5ba1bdd4b1e..cdc791f970d 100644 --- a/examples/cdp_mode/raw_ralphlauren.py +++ b/examples/cdp_mode/raw_ralphlauren.py @@ -1,29 +1,21 @@ from seleniumbase import SB -with SB(uc=True, test=True, locale="en") as sb: - url = "https://www.ralphlauren.com.au/" - sb.activate_cdp_mode(url) - sb.sleep(1.6) - if not sb.is_element_present('[title="Locate Stores"]'): - sb.evaluate("window.location.reload();") - sb.sleep(1.2) - category = "women" - search = "Dresses" - sb.click('a[data-cgid="%s"]' % category) +with SB(uc=True, test=True, locale="en", guest=True) as sb: + sb.activate_cdp_mode() + sb.goto("www.ralphlauren.com.au/women/clothing/dresses-and-jumpsuits") sb.sleep(2.2) - sb.click('a:contains("%s")' % search) - sb.sleep(3.8) - for i in range(6): - sb.scroll_down(25) - sb.sleep(0.2) - print('*** Ralph Lauren Search for "%s":' % search) + if not sb.is_element_present("div.product-data"): + sb.evaluate("window.location.reload();") + sb.sleep(2.2) + print("*** Ralph Lauren Search for Dresses:") unique_item_text = [] items = sb.find_elements('div.product-data') for item in items: - description = item.querySelector("a.name-link") + description = item.query_selector("a.name-link") if description and description.text not in unique_item_text: unique_item_text.append(description.text) print("* " + description.text) - price = item.querySelector('span[title="Price"]') + price = item.query_selector('span[title="Price"]') if price: print(" (" + price.text.replace(" ", " ") + ")") + item.scroll_into_view() diff --git a/examples/cdp_mode/raw_res_nike.py b/examples/cdp_mode/raw_res_nike.py index 0aaa8edc700..987a42f1b86 100644 --- a/examples/cdp_mode/raw_res_nike.py +++ b/examples/cdp_mode/raw_res_nike.py @@ -26,8 +26,8 @@ async def receive_handler(event: mycdp.network.ResponseReceived): with SB(uc=True, test=True, locale="en", pls="none") as sb: - url = "https://www.nike.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.nike.com/") sb.add_handler(mycdp.network.RequestWillBeSent, send_handler) sb.add_handler(mycdp.network.ResponseReceived, receive_handler) sb.sleep(2.5) diff --git a/examples/cdp_mode/raw_science.py b/examples/cdp_mode/raw_science.py index dbbd4095ff3..ff59c9769e4 100644 --- a/examples/cdp_mode/raw_science.py +++ b/examples/cdp_mode/raw_science.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, incognito=True, test=True) as sb: - url = "https://earth.esa.int/eogateway/search" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://earth.esa.int/eogateway/search") sb.sleep(1) sb.click_if_visible('button:contains("Accept cookies")') for i in range(20): diff --git a/examples/cdp_mode/raw_seatgeek.py b/examples/cdp_mode/raw_seatgeek.py index 5059ab1d8da..61a976f88f3 100644 --- a/examples/cdp_mode/raw_seatgeek.py +++ b/examples/cdp_mode/raw_seatgeek.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://seatgeek.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://seatgeek.com/") input_field = 'input[name="search"]' sb.wait_for_element(input_field) sb.sleep(1.6) diff --git a/examples/cdp_mode/raw_socialblade.py b/examples/cdp_mode/raw_socialblade.py index a5ee342f308..94ddfa12438 100644 --- a/examples/cdp_mode/raw_socialblade.py +++ b/examples/cdp_mode/raw_socialblade.py @@ -2,8 +2,8 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True, pls="none") as sb: - url = "https://socialblade.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://socialblade.com/") sb.sleep(1.5) if not sb.is_element_visible('input[placeholder*="Search"]'): sb.solve_captcha() diff --git a/examples/cdp_mode/raw_softpedia.py b/examples/cdp_mode/raw_softpedia.py index 423ac820478..bc513a4735e 100644 --- a/examples/cdp_mode/raw_softpedia.py +++ b/examples/cdp_mode/raw_softpedia.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://www.softpedia.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.softpedia.com/") search_box = 'input[name="search_term"]' search = "3D Model Lab" sb.click(search_box) diff --git a/examples/cdp_mode/raw_southwest.py b/examples/cdp_mode/raw_southwest.py index ef0d99e85c2..7f17ce6a66c 100644 --- a/examples/cdp_mode/raw_southwest.py +++ b/examples/cdp_mode/raw_southwest.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", ad_block=True) as sb: - url = "https://www.southwest.com/air/booking/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.southwest.com/air/booking/") sb.sleep(2.8) origin = "BOS" destination = "MDW" diff --git a/examples/cdp_mode/raw_stopandshop.py b/examples/cdp_mode/raw_stopandshop.py index 9a976ede997..edb2b50d25d 100644 --- a/examples/cdp_mode/raw_stopandshop.py +++ b/examples/cdp_mode/raw_stopandshop.py @@ -2,9 +2,9 @@ from seleniumbase import SB with SB(uc=True, test=True, guest=True) as sb: - url = "https://stopandshop.com/" - sb.activate_cdp_mode(url) - sb.sleep(2.6) + sb.activate_cdp_mode() + sb.goto("https://stopandshop.com/") + sb.sleep(2.8) if not sb.is_element_present("#brand-logo_link"): sb.refresh() sb.sleep(2.6) diff --git a/examples/cdp_mode/raw_tiktok.py b/examples/cdp_mode/raw_tiktok.py index f941cb19077..75043de866c 100644 --- a/examples/cdp_mode/raw_tiktok.py +++ b/examples/cdp_mode/raw_tiktok.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, guest=True) as sb: - url = "https://www.tiktok.com/@startrek?lang=en" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.tiktok.com/@startrek?lang=en") sb.sleep(2.5) sb.click_if_visible('button[data-close-button="true"]') sb.sleep(0.3) diff --git a/examples/cdp_mode/raw_trails.py b/examples/cdp_mode/raw_trails.py index 8c8f87e1fd0..4dc2f180b92 100644 --- a/examples/cdp_mode/raw_trails.py +++ b/examples/cdp_mode/raw_trails.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, ad_block=True, test=True) as sb: - url = "https://www.alltrails.com/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.alltrails.com/") sb.sleep(3.5) sb.click_if_visible("button.osano-cm-close") sb.sleep(0.5) diff --git a/examples/cdp_mode/raw_turnstile.py b/examples/cdp_mode/raw_turnstile.py index 5d8e7c6be68..172c6958d6c 100644 --- a/examples/cdp_mode/raw_turnstile.py +++ b/examples/cdp_mode/raw_turnstile.py @@ -1,9 +1,9 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://seleniumbase.io/apps/turnstile" - sb.activate_cdp_mode(url) - sb.sleep(1) + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io/apps/turnstile") + sb.sleep(0.5) sb.solve_captcha() sb.assert_element("img#captcha-success", timeout=3) sb.set_messenger_theme(location="top_left") diff --git a/examples/cdp_mode/raw_united.py b/examples/cdp_mode/raw_united.py index a6441bfe616..f40336183e1 100644 --- a/examples/cdp_mode/raw_united.py +++ b/examples/cdp_mode/raw_united.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", ad_block=True) as sb: - url = "https://www.united.com/en/us" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.united.com/en/us") sb.sleep(3.5) origin_input = 'input[placeholder="Origin"]' origin = "JFK" diff --git a/examples/cdp_mode/raw_walmart.py b/examples/cdp_mode/raw_walmart.py index b39a20cbe6e..d17faacab76 100644 --- a/examples/cdp_mode/raw_walmart.py +++ b/examples/cdp_mode/raw_walmart.py @@ -1,9 +1,9 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://www.walmart.com/" - sb.activate_cdp_mode(url) - sb.sleep(1.8) + sb.activate_cdp_mode() + sb.goto("https://www.walmart.com/") + sb.sleep(2.2) continue_button = 'button:contains("Continue shopping")' if sb.is_element_visible(continue_button): sb.gui_click_element(continue_button) diff --git a/examples/cdp_mode/raw_wsform.py b/examples/cdp_mode/raw_wsform.py index 3046e40016c..387dba7f8ef 100644 --- a/examples/cdp_mode/raw_wsform.py +++ b/examples/cdp_mode/raw_wsform.py @@ -4,8 +4,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en", incognito=True) as sb: - url = "https://wsform.com/demo/" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://wsform.com/demo/") sb.sleep(2) sb.scroll_into_view("div.grid") sb.uc_gui_click_captcha() # PyAutoGUI mouse click diff --git a/examples/raw_ahrefs.py b/examples/raw_ahrefs.py index c990429afd0..3e61418e879 100644 --- a/examples/raw_ahrefs.py +++ b/examples/raw_ahrefs.py @@ -1,14 +1,15 @@ from seleniumbase import SB with SB(uc=True, test=True, incognito=True, locale="en") as sb: - url = "https://ahrefs.com/website-authority-checker" - input_field = 'input[placeholder="Enter domain"]' - submit_button = 'span:contains("Check Authority")' - sb.activate_cdp_mode(url) - sb.type(input_field, "github.com/seleniumbase/SeleniumBase") - sb.click(submit_button) + sb.activate_cdp_mode() + sb.goto("https://ahrefs.com/website-authority-checker") + search_term = "github.com/seleniumbase/SeleniumBase" + sb.type('input[placeholder="Enter domain"]', search_term) + sb.scroll_down(36) + sb.click('span:contains("Check Authority")') sb.sleep(2) sb.solve_captcha() + sb.sleep(3) sb.wait_for_text_not_visible("Checking", timeout=15) sb.click_if_visible('button[data-cky-tag="close-button"]') sb.highlight('p:contains("github.com/seleniumbase/SeleniumBase")') diff --git a/examples/raw_bing_captcha.py b/examples/raw_bing_captcha.py index 1cb47ee159b..ca235d37c76 100644 --- a/examples/raw_bing_captcha.py +++ b/examples/raw_bing_captcha.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://www.bing.com/turing/captcha/challenge" - sb.activate_cdp_mode(url) - sb.sleep(1) + sb.activate_cdp_mode() + sb.goto("https://www.bing.com/turing/captcha/challenge") + sb.sleep(2) sb.solve_captcha() sb.sleep(2) diff --git a/examples/raw_cf.py b/examples/raw_cf.py index c4ecc7993d7..5a6f42594cf 100644 --- a/examples/raw_cf.py +++ b/examples/raw_cf.py @@ -2,9 +2,9 @@ from seleniumbase import SB with SB(uc=True, test=True, guest=True) as sb: - url = "https://www.cloudflare.com/login" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.cloudflare.com/login") sb.wait_for_element('div[data-testid*="challenge-widget"]') - sb.sleep(1.5) + sb.sleep(2) sb.solve_captcha() sb.sleep(3) diff --git a/examples/raw_gitlab.py b/examples/raw_gitlab.py index f2ed1121d13..facdf4a724b 100644 --- a/examples/raw_gitlab.py +++ b/examples/raw_gitlab.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, locale="en") as sb: - url = "https://gitlab.com/users/sign_in" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://gitlab.com/users/sign_in") sb.sleep(2) sb.solve_captcha() # (The rest is for testing and demo purposes) diff --git a/examples/raw_invisible_captcha.py b/examples/raw_invisible_captcha.py index 54989667179..276b04f0675 100644 --- a/examples/raw_invisible_captcha.py +++ b/examples/raw_invisible_captcha.py @@ -1,8 +1,8 @@ from seleniumbase import SB -with SB(uc=True, test=True, incognito=True) as sb: - url = "https://seleniumbase.io/apps/invisible_recaptcha" - sb.activate_cdp_mode(url) +with SB(uc=True, test=True, guest=True) as sb: + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io/apps/invisible_recaptcha") sb.sleep(1) sb.assert_element("img#captcha-success", timeout=3) sb.set_messenger_theme(location="top_left") diff --git a/examples/raw_order_tickets.py b/examples/raw_order_tickets.py index 2e7fd568a57..4f6f6491fd2 100644 --- a/examples/raw_order_tickets.py +++ b/examples/raw_order_tickets.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True, ad_block=True) as sb: - url = "https://www.ticketmaster.com" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://www.ticketmaster.com") input_field = 'input[name="q"]' sb.wait_for_element(input_field) sb.sleep(1.6) diff --git a/examples/raw_pixelscan.py b/examples/raw_pixelscan.py index 123f2006281..b1de254b657 100644 --- a/examples/raw_pixelscan.py +++ b/examples/raw_pixelscan.py @@ -1,17 +1,17 @@ from seleniumbase import SB -with SB(uc=True, test=True, incognito=True) as sb: - url = "https://pixelscan.net/fingerprint-check" - sb.activate_cdp_mode(url) +with SB(uc=True, test=True, guest=True) as sb: + sb.activate_cdp_mode(ad_block=True) + sb.goto("https://pixelscan.net/fingerprint-check") + sb.sleep(1.5) sb.wait_for_element("pxlscn-dynamic-ad") sb.sleep(0.5) sb.remove_elements("pxlscn-dynamic-ad") - sb.sleep(2) - sb.assert_text("No masking detected", "pxlscn-fingerprint-masking") + sb.sleep(1.5) sb.assert_text("No automated behavior", "pxlscn-bot-detection") - sb.cdp.highlight('span.status-success') - sb.sleep(1) + sb.wait_for_element("span.status-success") + sb.assert_text("No masking detected", "pxlscn-fingerprint-masking") + sb.cdp.highlight("span.status-success") sb.cdp.highlight("pxlscn-fingerprint-masking p") - sb.sleep(1) sb.cdp.highlight("pxlscn-bot-detection p") - sb.sleep(2) + print("Bot Not Detected") diff --git a/examples/raw_pyautogui.py b/examples/raw_pyautogui.py index bb7e0d648b0..61949d937c9 100644 --- a/examples/raw_pyautogui.py +++ b/examples/raw_pyautogui.py @@ -1,8 +1,8 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://seleniumbase.io/apps/turnstile" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io/apps/turnstile") sb.uc_gui_handle_captcha() # Cycle with TAB, then SPACEBAR sb.assert_element("img#captcha-success", timeout=3) sb.set_messenger_theme(location="top_left") diff --git a/examples/raw_turnstile.py b/examples/raw_turnstile.py index e811c8ceb32..172c6958d6c 100644 --- a/examples/raw_turnstile.py +++ b/examples/raw_turnstile.py @@ -1,8 +1,9 @@ from seleniumbase import SB with SB(uc=True, test=True) as sb: - url = "https://seleniumbase.io/apps/turnstile" - sb.activate_cdp_mode(url) + sb.activate_cdp_mode() + sb.goto("https://seleniumbase.io/apps/turnstile") + sb.sleep(0.5) sb.solve_captcha() sb.assert_element("img#captcha-success", timeout=3) sb.set_messenger_theme(location="top_left") diff --git a/examples/test_geolocation.py b/examples/test_geolocation.py index c41e2c2f2c3..cd07fa359d0 100644 --- a/examples/test_geolocation.py +++ b/examples/test_geolocation.py @@ -40,7 +40,7 @@ def test_geolocation(self): self.goto("https://www.randymajors.org/what-time-zone-am-i-in") self.ad_block() self.assert_text("Paris, France", "#statecountrylabel") - self.assert_text("Central European Standard Time", "#currentlabel") + self.assert_text("Central European", "#currentlabel") self.save_screenshot_to_logs() if self.headed: self.sleep(4) diff --git a/help_docs/cdp_mode_methods.md b/help_docs/cdp_mode_methods.md index 5e93190afad..6c199c7b293 100644 --- a/help_docs/cdp_mode_methods.md +++ b/help_docs/cdp_mode_methods.md @@ -7,210 +7,210 @@ Here's a list of SeleniumBase CDP Mode method definitions, which are defined in ### 🐙 CDP Mode API / Methods ```python -sb.cdp.get(url, **kwargs) -sb.cdp.open(url, **kwargs) # Same as sb.cdp.get(url, **kwargs) -sb.cdp.goto(url, **kwargs) # Same as sb.cdp.get(url, **kwargs) -sb.cdp.reload(ignore_cache=True, script_to_evaluate_on_load=None) -sb.cdp.refresh(*args, **kwargs) -sb.cdp.get_event_loop() -sb.cdp.is_running() -sb.cdp.get_rd_host() # Returns the remote-debugging host -sb.cdp.get_rd_port() # Returns the remote-debugging port -sb.cdp.get_rd_url() # Returns the remote-debugging URL -sb.cdp.get_endpoint_url() # Same as sb.cdp.get_rd_url() -sb.cdp.get_port() # Same as sb.cdp.get_rd_port() -sb.cdp.get_websocket_url() # Returns the websocket URL -sb.cdp.add_handler(event, handler) -sb.cdp.find_element(selector, best_match=False, timeout=None) -sb.cdp.find(selector, best_match=False, timeout=None) -sb.cdp.locator(selector, best_match=False, timeout=None) -sb.cdp.find_element_by_text(text, tag_name=None, timeout=None) -sb.cdp.find_all(selector, timeout=None) -sb.cdp.find_elements_by_text(text, tag_name=None) -sb.cdp.select(selector, timeout=None) -sb.cdp.select_all(selector, timeout=None) -sb.cdp.find_elements(selector, timeout=None) -sb.cdp.find_visible_elements(selector, timeout=None) -sb.cdp.click(selector, timeout=None, scroll=True) -sb.cdp.click_if_visible(selector, timeout=0, scroll=True) -sb.cdp.click_visible_elements(selector, limit=0, scroll=True) -sb.cdp.click_nth_element(selector, number, scroll=True) -sb.cdp.click_nth_visible_element(selector, number, scroll=True) -sb.cdp.click_with_offset(selector, x, y, center=False, scroll=True) -sb.cdp.click_link(link_text) -sb.cdp.go_back() -sb.cdp.go_forward() -sb.cdp.get_navigation_history() -sb.cdp.tile_windows(windows=None, max_columns=0) -sb.cdp.grant_permissions(permissions, origin=None) -sb.cdp.grant_all_permissions() -sb.cdp.reset_permissions() -sb.cdp.get_all_urls(absolute=True) -sb.cdp.get_all_cookies(*args, **kwargs) -sb.cdp.set_all_cookies(*args, **kwargs) -sb.cdp.save_cookies(*args, **kwargs) -sb.cdp.load_cookies(*args, **kwargs) -sb.cdp.clear_cookies() -sb.cdp.sleep(seconds) -sb.cdp.bring_active_window_to_front() -sb.cdp.bring_to_front() -sb.cdp.get_active_element() -sb.cdp.get_active_element_css() -sb.cdp.click_active_element() -sb.cdp.mouse_click(selector, timeout=None, scroll=True) -sb.cdp.nested_click(parent_selector, selector) -sb.cdp.get_nested_element(parent_selector, selector) -sb.cdp.select_option_by_text(dropdown_selector, option) -sb.cdp.select_option_by_index(dropdown_selector, option) -sb.cdp.select_option_by_value(dropdown_selector, option) -sb.cdp.flash(selector, duration=1, color="44CC88", pause=0) -sb.cdp.highlight(selector) -sb.cdp.focus(selector) -sb.cdp.highlight_overlay(selector) -sb.cdp.get_parent(element) -sb.cdp.remove_element(selector) -sb.cdp.remove_from_dom(selector) -sb.cdp.remove_elements(selector) -sb.cdp.send_keys(selector, text, timeout=None) -sb.cdp.press_keys(selector, text, timeout=None) -sb.cdp.type(selector, text, timeout=None) -sb.cdp.set_value(selector, text, timeout=None) -sb.cdp.clear_input(selector, timeout=None) -sb.cdp.clear(selector, timeout=None) -sb.cdp.submit(selector) -sb.cdp.evaluate(expression) -sb.cdp.execute_script(expression) -sb.cdp.js_dumps(obj_name) -sb.cdp.maximize() -sb.cdp.minimize() -sb.cdp.medimize() -sb.cdp.set_window_rect(x, y, width, height) -sb.cdp.reset_window_size() -sb.cdp.open_new_window(url=None, switch_to=True) -sb.cdp.switch_to_window(window) -sb.cdp.switch_to_newest_window() -sb.cdp.open_new_tab(url=None, switch_to=True) -sb.cdp.switch_to_tab(tab) -sb.cdp.switch_to_newest_tab() -sb.cdp.close_active_tab() -sb.cdp.get_active_tab() -sb.cdp.get_tabs() -sb.cdp.get_window() -sb.cdp.get_text(selector="body") -sb.cdp.get_title() -sb.cdp.get_current_url() -sb.cdp.get_origin() -sb.cdp.get_html(include_shadow_dom=True) -sb.cdp.get_page_source(include_shadow_dom=True) -sb.cdp.get_beautiful_soup(source=None) -sb.cdp.get_user_agent() -sb.cdp.get_cookie_string() -sb.cdp.get_locale_code() -sb.cdp.get_local_storage_item(key) -sb.cdp.get_session_storage_item(key) -sb.cdp.get_screen_rect() -sb.cdp.get_window_rect() -sb.cdp.get_window_size() -sb.cdp.get_window_position() -sb.cdp.get_element_rect(selector, timeout=None) -sb.cdp.get_element_size(selector, timeout=None) -sb.cdp.get_element_position(selector, timeout=None) -sb.cdp.get_gui_element_rect(selector, timeout=None) -sb.cdp.get_gui_element_center(selector, timeout=None) -sb.cdp.get_document() -sb.cdp.get_flattened_document() -sb.cdp.get_element_attributes(selector) -sb.cdp.get_element_attribute(selector, attribute) -sb.cdp.get_attribute(selector, attribute) -sb.cdp.get_element_html(selector) -sb.cdp.get_mfa_code(totp_key=None) -sb.cdp.enter_mfa_code(selector, totp_key=None, timeout=None) -sb.cdp.activate_messenger() -sb.cdp.set_messenger_theme(theme="default", location="default") -sb.cdp.post_message(message, duration=None, pause=True, style="info") -sb.cdp.download_file(file_url) -sb.cdp.save_file_as(file_url, new_file_name) -sb.cdp.assert_downloaded_file(file, timeout=None) -sb.cdp.get_path_of_downloaded_file(file) -sb.cdp.set_download_path(path) -sb.cdp.set_locale(locale) -sb.cdp.set_local_storage_item(key, value) -sb.cdp.set_session_storage_item(key, value) -sb.cdp.set_attributes(selector, attribute, value) -sb.cdp.is_attribute_present(selector, attribute, value=None) -sb.cdp.is_online() -sb.cdp.solve_captcha() -sb.cdp.click_captcha() -sb.cdp.gui_press_key(key) -sb.cdp.gui_press_keys(keys) -sb.cdp.gui_write(text) -sb.cdp.gui_click_x_y(x, y, timeframe=0.25) -sb.cdp.gui_click_element(selector, timeframe=0.25) -sb.cdp.gui_click_with_offset(selector, x, y, timeframe=0.25, center=False) -sb.cdp.gui_click_captcha() -sb.cdp.gui_drag_drop_points(x1, y1, x2, y2, timeframe=0.35) -sb.cdp.gui_drag_and_drop(drag_selector, drop_selector, timeframe=0.35) -sb.cdp.gui_click_and_hold(selector, timeframe=0.35) -sb.cdp.gui_hover_x_y(x, y) -sb.cdp.gui_hover_element(selector) -sb.cdp.gui_hover_and_click(hover_selector, click_selector) -sb.cdp.hover_element(selector) -sb.cdp.hover_and_click(hover_selector, click_selector) -sb.cdp.internalize_links() -sb.cdp.is_checked(selector) -sb.cdp.is_selected(selector) -sb.cdp.check_if_unchecked(selector) -sb.cdp.select_if_unselected(selector) -sb.cdp.uncheck_if_checked(selector) -sb.cdp.unselect_if_selected(selector) -sb.cdp.is_element_present(selector) -sb.cdp.is_element_visible(selector) -sb.cdp.is_text_visible(text, selector="body") -sb.cdp.is_exact_text_visible(text, selector="body") -sb.cdp.wait_for_text(text, selector="body", timeout=None) -sb.cdp.wait_for_text_not_visible(text, selector="body", timeout=None) -sb.cdp.wait_for_element_visible(selector, timeout=None) -sb.cdp.wait_for_element(selector, timeout=None) -sb.cdp.wait_for_element_not_visible(selector, timeout=None) -sb.cdp.wait_for_element_absent(selector, timeout=None) -sb.cdp.wait_for_any_of_elements_visible(*args, **kwargs) -sb.cdp.wait_for_any_of_elements_present(*args, **kwargs) -sb.cdp.assert_any_of_elements_visible(*args, **kwargs) -sb.cdp.assert_any_of_elements_present(*args, **kwargs) -sb.cdp.assert_element(selector, timeout=None) -sb.cdp.assert_element_visible(selector, timeout=None) -sb.cdp.assert_element_present(selector, timeout=None) -sb.cdp.assert_element_absent(selector, timeout=None) -sb.cdp.assert_element_not_visible(selector, timeout=None) -sb.cdp.assert_element_attribute(selector, attribute, value=None) -sb.cdp.assert_title(title) -sb.cdp.assert_title_contains(substring) -sb.cdp.assert_url(url) -sb.cdp.assert_url_contains(substring) -sb.cdp.assert_text(text, selector="html", timeout=None) -sb.cdp.assert_exact_text(text, selector="html", timeout=None) -sb.cdp.assert_text_not_visible(text, selector="body", timeout=None) -sb.cdp.assert_true(expression, msg=None) -sb.cdp.assert_false(expression, msg=None) -sb.cdp.assert_equal(first, second) -sb.cdp.assert_not_equal(first, second) -sb.cdp.assert_in(first, second) -sb.cdp.assert_not_in(first, second) -sb.cdp.js_scroll_into_view(selector) -sb.cdp.scroll_into_view(selector) -sb.cdp.scroll_by_y(y) -sb.cdp.scroll_to_top() -sb.cdp.scroll_to_bottom() -sb.cdp.scroll_up(amount=25) -sb.cdp.scroll_down(amount=25) -sb.cdp.save_page_source(name, folder=None) -sb.cdp.save_as_html(name, folder=None) -sb.cdp.save_screenshot(name, folder=None, selector=None) -sb.cdp.print_to_pdf(name, folder=None) -sb.cdp.save_as_pdf(name, folder=None) +sb.get(url, **kwargs) +sb.open(url, **kwargs) # Same as sb.get(url, **kwargs) in CDP Mode +sb.goto(url, **kwargs) # Same as sb.get(url, **kwargs) in CDP Mode +sb.reload(ignore_cache=True, script_to_evaluate_on_load=None) +sb.refresh(*args, **kwargs) +sb.get_event_loop() +sb.get_rd_host() # Returns the remote-debugging host +sb.get_rd_port() # Returns the remote-debugging port +sb.get_rd_url() # Returns the remote-debugging URL +sb.get_endpoint_url() # Same as sb.get_rd_url() +sb.get_port() # Same as sb.get_rd_port() +sb.get_websocket_url() # Returns the websocket URL +sb.add_handler(event, handler) +sb.find_element(selector, best_match=False, timeout=None) +sb.find(selector, best_match=False, timeout=None) +sb.locator(selector, best_match=False, timeout=None) +sb.find_element_by_text(text, tag_name=None, timeout=None) +sb.find_all(selector, timeout=None) +sb.find_elements_by_text(text, tag_name=None) +sb.select(selector, timeout=None) +sb.select_all(selector, timeout=None) +sb.find_elements(selector, timeout=None) +sb.find_visible_elements(selector, timeout=None) +sb.click(selector, timeout=None, scroll=True) +sb.click_if_visible(selector, timeout=0, scroll=True) +sb.click_visible_elements(selector, limit=0, scroll=True) +sb.click_nth_element(selector, number, scroll=True) +sb.click_nth_visible_element(selector, number, scroll=True) +sb.click_with_offset(selector, x, y, center=False, scroll=True) +sb.click_link(link_text) +sb.go_back() +sb.go_forward() +sb.get_navigation_history() +sb.tile_windows(windows=None, max_columns=0) +sb.grant_permissions(permissions, origin=None) +sb.grant_all_permissions() +sb.reset_permissions() +sb.get_all_urls(absolute=True) +sb.get_all_cookies(*args, **kwargs) +sb.set_all_cookies(*args, **kwargs) +sb.save_cookies(*args, **kwargs) +sb.load_cookies(*args, **kwargs) +sb.clear_cookies() +sb.sleep(seconds) +sb.bring_active_window_to_front() +sb.bring_to_front() +sb.get_active_element() +sb.get_active_element_css() +sb.click_active_element() +sb.mouse_click(selector, timeout=None, scroll=True) +sb.nested_click(parent_selector, selector) +sb.get_nested_element(parent_selector, selector) +sb.select_option_by_text(dropdown_selector, option) +sb.select_option_by_index(dropdown_selector, option) +sb.select_option_by_value(dropdown_selector, option) +sb.flash(selector, duration=1, color="44CC88", pause=0) +sb.highlight(selector) +sb.focus(selector) +sb.highlight_overlay(selector) +sb.get_parent(element) +sb.remove_element(selector) +sb.remove_from_dom(selector) +sb.remove_elements(selector) +sb.send_keys(selector, text, timeout=None) +sb.press_keys(selector, text, timeout=None) +sb.type(selector, text, timeout=None) +sb.set_value(selector, text, timeout=None) +sb.clear_input(selector, timeout=None) +sb.clear(selector, timeout=None) +sb.submit(selector) +sb.evaluate(expression) +sb.execute_script(expression) +sb.js_dumps(obj_name) +sb.maximize() +sb.minimize() +sb.medimize() +sb.set_window_rect(x, y, width, height) +sb.reset_window_size() +sb.open_new_window(url=None, switch_to=True) +sb.switch_to_window(window) +sb.switch_to_newest_window() +sb.open_new_tab(url=None, switch_to=True) +sb.switch_to_tab(tab) +sb.switch_to_newest_tab() +sb.close_active_tab() +sb.get_active_tab() +sb.get_tabs() +sb.get_window() +sb.get_text(selector="body") +sb.get_title() +sb.get_current_url() +sb.get_origin() +sb.get_html(include_shadow_dom=True) +sb.get_page_source(include_shadow_dom=True) +sb.get_beautiful_soup(source=None) +sb.get_user_agent() +sb.get_cookie_string() +sb.get_locale_code() +sb.get_local_storage_item(key) +sb.get_session_storage_item(key) +sb.get_screen_rect() +sb.get_window_rect() +sb.get_window_size() +sb.get_window_position() +sb.get_element_rect(selector, timeout=None) +sb.get_element_size(selector, timeout=None) +sb.get_element_position(selector, timeout=None) +sb.get_gui_element_rect(selector, timeout=None) +sb.get_gui_element_center(selector, timeout=None) +sb.get_document() +sb.get_flattened_document() +sb.get_element_attributes(selector) +sb.get_element_attribute(selector, attribute) +sb.get_attribute(selector, attribute) +sb.get_element_html(selector) +sb.get_mfa_code(totp_key=None) +sb.enter_mfa_code(selector, totp_key=None, timeout=None) +sb.activate_messenger() +sb.set_messenger_theme(theme="default", location="default") +sb.post_message(message, duration=None, pause=True, style="info") +sb.download_file(file_url) +sb.save_file_as(file_url, new_file_name) +sb.assert_downloaded_file(file, timeout=None) +sb.get_path_of_downloaded_file(file) +sb.set_download_path(path) +sb.set_locale(locale) +sb.set_local_storage_item(key, value) +sb.set_session_storage_item(key, value) +sb.set_attributes(selector, attribute, value) +sb.is_attribute_present(selector, attribute, value=None) +sb.is_online() +sb.solve_captcha() +sb.click_captcha() +sb.gui_press_key(key) +sb.gui_press_keys(keys) +sb.gui_write(text) +sb.gui_click_x_y(x, y, timeframe=0.25) +sb.gui_click_element(selector, timeframe=0.25) +sb.gui_click_with_offset(selector, x, y, timeframe=0.25, center=False) +sb.gui_click_captcha() +sb.gui_drag_drop_points(x1, y1, x2, y2, timeframe=0.35) +sb.gui_drag_and_drop(drag_selector, drop_selector, timeframe=0.35) +sb.gui_click_and_hold(selector, timeframe=0.35) +sb.gui_hover_x_y(x, y) +sb.gui_hover_element(selector) +sb.gui_hover_and_click(hover_selector, click_selector) +sb.hover_element(selector) +sb.hover_and_click(hover_selector, click_selector) +sb.internalize_links() +sb.is_checked(selector) +sb.is_selected(selector) +sb.check_if_unchecked(selector) +sb.select_if_unselected(selector) +sb.uncheck_if_checked(selector) +sb.unselect_if_selected(selector) +sb.is_element_present(selector) +sb.is_element_visible(selector) +sb.is_text_visible(text, selector="body") +sb.is_exact_text_visible(text, selector="body") +sb.wait_for_text(text, selector="body", timeout=None) +sb.wait_for_text_not_visible(text, selector="body", timeout=None) +sb.wait_for_element_visible(selector, timeout=None) +sb.wait_for_element(selector, timeout=None) +sb.wait_for_element_not_visible(selector, timeout=None) +sb.wait_for_element_absent(selector, timeout=None) +sb.wait_for_any_of_elements_visible(*args, **kwargs) +sb.wait_for_any_of_elements_present(*args, **kwargs) +sb.assert_any_of_elements_visible(*args, **kwargs) +sb.assert_any_of_elements_present(*args, **kwargs) +sb.assert_element(selector, timeout=None) +sb.assert_element_visible(selector, timeout=None) +sb.assert_element_present(selector, timeout=None) +sb.assert_element_absent(selector, timeout=None) +sb.assert_element_not_visible(selector, timeout=None) +sb.assert_element_attribute(selector, attribute, value=None) +sb.assert_title(title) +sb.assert_title_contains(substring) +sb.assert_url(url) +sb.assert_url_contains(substring) +sb.assert_text(text, selector="html", timeout=None) +sb.assert_exact_text(text, selector="html", timeout=None) +sb.assert_text_not_visible(text, selector="body", timeout=None) +sb.assert_true(expression, msg=None) +sb.assert_false(expression, msg=None) +sb.assert_equal(first, second) +sb.assert_not_equal(first, second) +sb.assert_in(first, second) +sb.assert_not_in(first, second) +sb.js_scroll_into_view(selector) +sb.scroll_into_view(selector) +sb.scroll_to_y(y) +sb.scroll_to_top() +sb.scroll_to_bottom() +sb.scroll_up(amount=25) +sb.scroll_down(amount=25) +sb.save_page_source(name, folder=None) +sb.save_as_html(name, folder=None) +sb.save_screenshot(name, folder=None, selector=None) +sb.print_to_pdf(name, folder=None) +sb.save_as_pdf(name, folder=None) +sb.quit() # (Pure CDP Mode only: `sb_cdp`) ``` -â„šī¸ When available, calling `sb.METHOD()` redirects to `sb.cdp.METHOD()` when CDP Mode is active. From Pure CDP Mode, always call these methods with `sb.METHOD()` instead of `sb.cdp.METHOD()`. +â„šī¸ When available, calling `sb.METHOD()` redirects to `sb.cdp.METHOD()` from UC + CDP Mode. -------- @@ -218,23 +218,34 @@ sb.cdp.save_as_pdf(name, folder=None) ### 🐙 Pure CDP Mode (sb_cdp) -Pure CDP Mode doesn't use WebDriver for anything. The browser is launched using CDP, and all browser actions are performed using CDP (or PyAutoGUI). Initialization: +In Pure CDP Mode, the browser is launched using CDP, and all browser actions are performed using CDP. WebDriver isn't available at all, but SeleniumBase can still call PyAutoGUI methods when CDP isn't enough. + +🐙 Here's how to initialize Pure CDP Mode with a starting URL: + +```python +from seleniumbase import sb_cdp + +sb = sb_cdp.Chrome(URL) +``` + +🐙 You can also initialize Pure CDP Mode and set the URL later: ```python from seleniumbase import sb_cdp -sb = sb_cdp.Chrome(url=None, **kwargs) +sb = sb_cdp.Chrome() +sb.goto(URL) ``` -Pure CDP Mode includes all methods from regular CDP Mode, except that they're called directly from sb instead of sb.cdp. Eg: sb.gui_click_captcha(). To quit a CDP-launched browser, use `sb.quit()`. +Pure CDP Mode includes all methods from regular CDP Mode. To quit a Pure CDP Mode browser before Python goes out-of-scope, use `sb.quit()`. Basic example from [SeleniumBase/examples/cdp_mode/raw_cdp_turnstile.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_turnstile.py): ```python from seleniumbase import sb_cdp -url = "https://seleniumbase.io/apps/turnstile" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://seleniumbase.io/apps/turnstile") sb.solve_captcha() sb.assert_element("img#captcha-success") sb.set_messenger_theme(location="top_left") @@ -247,8 +258,8 @@ Another example: ([SeleniumBase/examples/cdp_mode/raw_cdp_methods.py](https://gi ```python from seleniumbase import sb_cdp -url = "https://seleniumbase.io/demo_page" -sb = sb_cdp.Chrome(url) +sb = sb_cdp.Chrome() +sb.goto("https://seleniumbase.io/demo_page") sb.press_keys("input", "Text") sb.highlight("button") sb.type("textarea", "Here are some words") @@ -276,78 +287,78 @@ Initialization: from seleniumbase import cdp_driver driver = await cdp_driver.start_async() -tab = await driver.get(url, **kwargs) +page = await driver.get(url, **kwargs) ``` -Methods: (Sometimes `tab` is named `page` in examples) +Methods: (Sometimes `page` is named `tab` in examples where `page` is already taken.) ```python -await tab.get(url="about:blank") -await tab.open(url="about:blank") # Same as tab.open() -await tab.goto(url="about:blank") # Same as tab.open() -await tab.find(text, best_match=False, timeout=10) # text can be selector -await tab.find_all(text, timeout=10) # text can be selector -await tab.select(selector, timeout=10) -await tab.select_all(selector, timeout=10, include_frames=False) -await tab.query_selector(selector) -await tab.query_selector_all(selector) -await tab.find_element_by_text(text, best_match=False) -await tab.find_elements_by_text(text) -await tab.reload(ignore_cache=True, script_to_evaluate_on_load=None) -await tab.evaluate(expression) -await tab.js_dumps(obj_name) -await tab.back() -await tab.forward() -await tab.get_window() -await tab.get_content() -await tab.maximize() -await tab.minimize() -await tab.fullscreen() -await tab.medimize() -await tab.set_window_size(left=0, top=0, width=1280, height=1024) -await tab.set_window_rect(left=0, top=0, width=1280, height=1024) -await tab.activate() -await tab.bring_to_front() -await tab.set_window_state(left=0, top=0, width=1280, height=720, state="normal") -await tab.get_navigation_history() -await tab.get_user_agent() -await tab.get_cookie_string() -await tab.get_locale_code() -await tab.is_online() -await tab.open_external_inspector() # Open separate browser for debugging -await tab.close() -await tab.scroll_down(amount=25) -await tab.scroll_up(amount=25) -await tab.wait_for(selector="", text="", timeout=10) -await tab.set_attributes(selector, attribute, value) -await tab.internalize_links() -await tab.download_file(url, filename=None) -await tab.save_screenshot(filename="auto", format="png", full_page=False) -await tab.print_to_pdf(filename="auto") -await tab.set_download_path(path) -await tab.get_all_linked_sources() -await tab.get_all_urls(absolute=True) -await tab.get_html() -await tab.get_page_source() -await tab.is_element_present(selector) -await tab.is_element_visible(selector) -await tab.get_element_rect(selector, timeout=5) # (window-based) -await tab.get_window_rect() -await tab.get_gui_element_rect(selector, timeout=5) # (screen-based) -await tab.get_title() -await tab.get_current_url() -await tab.get_origin() -await tab.send_keys(selector, text, timeout=5) -await tab.type(selector, text, timeout=5) -await tab.click(selector, timeout=5) -await tab.click_if_visible(selector, timeout=0) -await tab.click_with_offset(selector, x, y, center=False, timeout=5) -await tab.solve_captcha() -await tab.click_captcha() # Same as solve_captcha() -await tab.get_document() -await tab.get_flattened_document() -await tab.get_local_storage() -await tab.set_local_storage(items) +await page.get(url="about:blank") +await page.open(url="about:blank") # Same as await page.get(url) in CDP Mode +await page.goto(url="about:blank") # Same as await page.get(url) in CDP Mode +await page.find(text, best_match=False, timeout=10) # text can be selector +await page.find_all(text, timeout=10) # text can be selector +await page.select(selector, timeout=10) +await page.select_all(selector, timeout=10, include_frames=False) +await page.query_selector(selector) +await page.query_selector_all(selector) +await page.find_element_by_text(text, best_match=False) +await page.find_elements_by_text(text) +await page.send_keys(selector, text, timeout=5) +await page.type(selector, text, timeout=5) +await page.click(selector, timeout=5) +await page.click_if_visible(selector, timeout=0) +await page.click_with_offset(selector, x, y, center=False, timeout=5) +await page.solve_captcha() +await page.click_captcha() # Same as solve_captcha() +await page.reload(ignore_cache=True, script_to_evaluate_on_load=None) +await page.evaluate(expression) +await page.js_dumps(obj_name) +await page.back() +await page.forward() +await page.get_window() +await page.get_content() +await page.maximize() +await page.minimize() +await page.fullscreen() +await page.medimize() +await page.set_window_size(left=0, top=0, width=1280, height=1024) +await page.set_window_rect(left=0, top=0, width=1280, height=1024) +await page.activate() +await page.bring_to_front() +await page.set_window_state(left=0, top=0, width=1280, height=720, state="normal") +await page.get_navigation_history() +await page.get_user_agent() +await page.get_cookie_string() +await page.get_locale_code() +await page.is_element_present(selector) +await page.is_element_visible(selector) +await page.is_online() +await page.open_external_inspector() # Open separate browser for debugging +await page.close() +await page.scroll_down(amount=25) +await page.scroll_up(amount=25) +await page.wait_for(selector="", text="", timeout=10) +await page.set_attributes(selector, attribute, value) +await page.internalize_links() +await page.download_file(url, filename=None) +await page.save_screenshot(filename="auto", format="png", full_page=False) +await page.print_to_pdf(filename="auto") +await page.set_download_path(path) +await page.get_all_linked_sources() +await page.get_all_urls(absolute=True) +await page.get_html() +await page.get_page_source() +await page.get_element_rect(selector, timeout=5) # (window-based) +await page.get_window_rect() +await page.get_gui_element_rect(selector, timeout=5) # (screen-based) +await page.get_title() +await page.get_current_url() +await page.get_origin() +await page.get_document() +await page.get_flattened_document() +await page.get_local_storage() +await page.set_local_storage(items) ``` -------- diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 91be0561083..15bb33c7fbe 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.49.9" +__version__ = "4.49.10" diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 99590ed3a67..4f779474271 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -18,11 +18,7 @@ from selenium.common.exceptions import InvalidSessionIdException from selenium.common.exceptions import SessionNotCreatedException from selenium.webdriver.chrome.service import Service as ChromeService -from selenium.webdriver.common.options import ArgOptions -from selenium.webdriver.common.service import utils as service_utils -from selenium.webdriver.edge.service import Service as EdgeService -from selenium.webdriver.firefox.service import Service as FirefoxService -from selenium.webdriver.safari.service import Service as SafariService +from selenium.webdriver.common import utils as common_utils from seleniumbase import config as sb_config from seleniumbase import decorators from seleniumbase import drivers # webdriver storage folder for SeleniumBase @@ -2674,7 +2670,7 @@ def _set_chrome_options( args = " ".join(sys.argv) debug_port = 9222 if ("-n" in sys.argv or " -n=" in args or args == "-c"): - debug_port = service_utils.free_port() + debug_port = common_utils.free_port() chrome_options.add_argument("--remote-debugging-port=%s" % debug_port) if swiftshader: chrome_options.add_argument("--use-gl=angle") @@ -3678,6 +3674,7 @@ def get_remote_driver( device_height, device_pixel_ratio, ): + from selenium.webdriver.common.options import ArgOptions # Construct the address for connecting to a Selenium Grid if servername.startswith("https://"): protocol = "https" @@ -4136,6 +4133,7 @@ def get_local_driver( b_path = binary_location use_uc = is_using_uc(undetectable, browser_name) if browser_name == constants.Browser.FIREFOX: + from selenium.webdriver.firefox.service import Service as FFService firefox_options = _set_firefox_options( downloads_path, headless, @@ -4190,7 +4188,7 @@ def get_local_driver( sys.argv = sys_args # Put back original sys args # Launch Firefox if os.path.exists(local_geckodriver): - service = FirefoxService( + service = FFService( executable_path=local_geckodriver, log_output=os.devnull, ) @@ -4235,7 +4233,7 @@ def get_local_driver( else: raise # Not an obvious fix. else: - service = FirefoxService(log_output=os.devnull) + service = FFService(log_output=os.devnull) try: driver = webdriver.Firefox( service=service, @@ -4343,6 +4341,7 @@ def get_local_driver( driver = webdriver.Ie(service=service, options=ie_options) return extend_driver(driver) elif browser_name == constants.Browser.EDGE: + from selenium.webdriver.edge.service import Service as EdgeService prefs = { "download.default_directory": downloads_path, "download.directory_upgrade": True, @@ -4762,7 +4761,7 @@ def get_local_driver( args = " ".join(sys.argv) free_port = 9222 if ("-n" in sys.argv or " -n=" in args or args == "-c"): - free_port = service_utils.free_port() + free_port = common_utils.free_port() edge_options.add_argument("--remote-debugging-port=%s" % free_port) if swiftshader: edge_options.add_argument("--use-gl=angle") @@ -4872,7 +4871,7 @@ def get_local_driver( args = " ".join(sys.argv) free_port = 9222 if ("-n" in sys.argv or " -n=" in args or args == "-c"): - free_port = service_utils.free_port() + free_port = common_utils.free_port() edge_options.add_argument( "--remote-debugging-port=%s" % free_port ) @@ -4910,6 +4909,7 @@ def get_local_driver( raise Exception("Can't run Safari tests in multithreaded mode!") warnings.simplefilter("ignore", category=DeprecationWarning) from selenium.webdriver.safari.options import Options as SafariOptions + from selenium.webdriver.safari.service import Service as SafariService service = SafariService(quiet=False) options = SafariOptions() if ( diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index 52f4ce0fc9b..92920e05df1 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -152,6 +152,17 @@ def get(self, url, **kwargs): except Exception: pass + def activate_cdp_mode(self, url=None, **kwargs): + """If calling this method from here, then it was likely done + by accident because CDP Mode is already active at this point. + If URL, then navigate there with any kwargs that were passed. + If no URL (but kwargs are included) then refresh with kwargs. + If no URL and no kwargs either, then do nothing.""" + if url: + self.get(url, **kwargs) + elif kwargs: + self.get(self.get_current_url(), **kwargs) + def open(self, url, **kwargs): self.get(url, **kwargs) @@ -1386,10 +1397,15 @@ def get_text(self, selector="body"): return self.find_element(selector).text_all def get_title(self): + """Returns the title of the current web page.""" return self.loop.run_until_complete( self.page.evaluate("document.title") ) + def get_page_title(self): + """Same as get_title(), which returns the current page title.""" + return self.get_title() + def get_current_url(self): return self.loop.run_until_complete( self.page.evaluate("window.location.href") diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index 99c52522a75..dbc0df836f7 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -5101,16 +5101,48 @@ def activate_cdp_mode(self, url=None, **kwargs): self.close_active_tab = self.cdp.close_active_tab if hasattr(self.cdp, "find_element_by_text"): self.find_element_by_text = self.cdp.find_element_by_text + if hasattr(self.cdp, "find_elements_by_text"): + self.find_elements_by_text = self.cdp.find_elements_by_text if hasattr(self.cdp, "get_active_tab"): self.get_active_tab = self.cdp.get_active_tab + if hasattr(self.cdp, "get_all_cookies"): + self.get_all_cookies = self.cdp.get_all_cookies if hasattr(self.cdp, "get_all_urls"): self.get_all_urls = self.cdp.get_all_urls + if hasattr(self.cdp, "get_document"): + self.get_document = self.cdp.get_document + if hasattr(self.cdp, "get_element_attribute"): + self.get_element_attribute = self.cdp.get_element_attribute + if hasattr(self.cdp, "get_element_attributes"): + self.get_element_attributes = self.cdp.get_element_attributes + if hasattr(self.cdp, "get_element_html"): + self.get_element_html = self.cdp.get_element_html if hasattr(self.cdp, "get_endpoint_url"): self.get_endpoint_url = self.cdp.get_endpoint_url if hasattr(self.cdp, "get_event_loop"): self.get_event_loop = self.cdp.get_event_loop + if hasattr(self.cdp, "get_flattened_document"): + self.get_flattened_document = self.cdp.get_flattened_document + if hasattr(self.cdp, "get_navigation_history"): + self.get_navigation_history = self.cdp.get_navigation_history + if hasattr(self.cdp, "get_nested_element"): + self.get_nested_element = self.cdp.get_nested_element + if hasattr(self.cdp, "get_port"): + self.get_port = self.cdp.get_port + if hasattr(self.cdp, "get_rd_host"): + self.get_rd_host = self.cdp.get_rd_host + if hasattr(self.cdp, "get_rd_port"): + self.get_rd_port = self.cdp.get_rd_port + if hasattr(self.cdp, "get_rd_url"): + self.get_rd_url = self.cdp.get_rd_url if hasattr(self.cdp, "get_tabs"): self.get_tabs = self.cdp.get_tabs + if hasattr(self.cdp, "get_websocket_url"): + self.get_websocket_url = self.cdp.get_websocket_url + if hasattr(self.cdp, "grant_all_permissions"): + self.grant_all_permissions = self.cdp.grant_all_permissions + if hasattr(self.cdp, "grant_permissions"): + self.grant_permissions = self.cdp.grant_permissions if hasattr(self.cdp, "gui_click_and_hold"): self.gui_click_and_hold = self.cdp.gui_click_and_hold if hasattr(self.cdp, "gui_click_element"): @@ -5121,6 +5153,26 @@ def activate_cdp_mode(self, url=None, **kwargs): self.gui_drag_drop_points = self.cdp.gui_drag_drop_points if hasattr(self.cdp, "highlight_overlay"): self.highlight_overlay = self.cdp.highlight_overlay + if hasattr(self.cdp, "js_dumps"): + self.js_dumps = self.cdp.js_dumps + if hasattr(self.cdp, "js_scroll_into_view"): + self.js_scroll_into_view = self.cdp.js_scroll_into_view + if hasattr(self.cdp, "medimize"): + self.medimize = self.cdp.medimize + if hasattr(self.cdp, "mouse_click"): + self.mouse_click = self.cdp.mouse_click + if hasattr(self.cdp, "nested_click"): + self.nested_click = self.cdp.nested_click + if hasattr(self.cdp, "remove_from_dom"): + self.remove_from_dom = self.cdp.remove_from_dom + if hasattr(self.cdp, "reset_permissions"): + self.reset_permissions = self.cdp.reset_permissions + if hasattr(self.cdp, "set_all_cookies"): + self.set_all_cookies = self.cdp.set_all_cookies + if hasattr(self.cdp, "tile_windows"): + self.tile_windows = self.cdp.tile_windows + if hasattr(self.cdp, "get_window"): + self.get_window = self.cdp.get_window if getattr(self.driver, "_is_using_auth", None): with suppress(Exception): self.cdp.loop.run_until_complete(self.cdp.page.wait(0.25)) diff --git a/seleniumbase/undetected/cdp_driver/element.py b/seleniumbase/undetected/cdp_driver/element.py index b25aceaf94a..04461c4da4a 100644 --- a/seleniumbase/undetected/cdp_driver/element.py +++ b/seleniumbase/undetected/cdp_driver/element.py @@ -373,7 +373,9 @@ async def click_async(self): object_id=self._remote_object.object_id )] script = 'sessionStorage.getItem("pxsid") !== null;' - using_px = await self.tab.evaluate(script) + using_px = True + with suppress(Exception): + using_px = await self.tab.evaluate(script) if not using_px: await self.flash_async(0.25) await self._tab.send( @@ -505,7 +507,9 @@ async def mouse_click_async( return logger.debug("Clicking on location: %.2f, %.2f" % center) script = 'sessionStorage.getItem("pxsid") !== null;' - using_px = await self.tab.evaluate(script) + using_px = True + with suppress(Exception): + using_px = await self.tab.evaluate(script) if not using_px: asyncio.create_task(self.flash_async(0.25)) asyncio.create_task( @@ -567,7 +571,9 @@ async def mouse_click_with_offset_async( else: logger.debug("Clicking on location: %.2f, %.2f" % (x_pos, y_pos)) script = 'sessionStorage.getItem("pxsid") !== null;' - using_px = await self.tab.evaluate(script) + using_px = True + with suppress(Exception): + using_px = await self.tab.evaluate(script) if not using_px: asyncio.create_task( self.flash_async(