diff --git a/examples/cdp_mode/raw_cdp_methods.py b/examples/cdp_mode/raw_cdp_methods.py new file mode 100644 index 00000000000..de69f956ccc --- /dev/null +++ b/examples/cdp_mode/raw_cdp_methods.py @@ -0,0 +1,22 @@ +import asyncio +from seleniumbase.core import sb_cdp +from seleniumbase.undetected import cdp_driver + +url = "https://seleniumbase.io/demo_page" +loop = asyncio.new_event_loop() +driver = cdp_driver.cdp_util.start_sync() +page = loop.run_until_complete(driver.get(url)) +sb = sb_cdp.CDPMethods(loop, page, driver) + +sb.press_keys("input", "Text") +sb.highlight("button") +sb.type("textarea", "Here are some words") +sb.click("button") +sb.set_value("input#mySlider", "100") +sb.click_visible_elements("input.checkBoxClassB") +sb.select_option_by_text("#mySelect", "Set to 75%") +sb.gui_hover_and_click("#myDropdown", "#dropOption2") +sb.gui_click_element("#checkBox1") +sb.gui_drag_and_drop("img#logo", "div#drop2") +sb.nested_click("iframe#myFrame3", ".fBox") +sb.sleep(2) diff --git a/examples/cdp_mode/raw_cdp_nike.py b/examples/cdp_mode/raw_cdp_nike.py new file mode 100644 index 00000000000..48d8356337e --- /dev/null +++ b/examples/cdp_mode/raw_cdp_nike.py @@ -0,0 +1,21 @@ +import asyncio +from seleniumbase.core import sb_cdp +from seleniumbase.undetected import cdp_driver + +url = "https://www.nike.com/" +loop = asyncio.new_event_loop() +driver = cdp_driver.cdp_util.start_sync() +page = loop.run_until_complete(driver.get(url)) +sb = sb_cdp.CDPMethods(loop, page, driver) + +search = "Nike Fly Shoes" +sb.click('div[data-testid="user-tools-container"]') +sb.sleep(1) +sb.press_keys('input[type="search"]', search) +sb.sleep(4) + +elements = sb.select_all('ul[data-testid*="products"] figure .details') +if elements: + print('**** Found results for "%s": ****' % search) + for element in elements: + print("* " + element.text) diff --git a/examples/cdp_mode/raw_driver.py b/examples/cdp_mode/raw_driver.py new file mode 100644 index 00000000000..2fc382f728d --- /dev/null +++ b/examples/cdp_mode/raw_driver.py @@ -0,0 +1,10 @@ +import atexit +from seleniumbase import Driver + +driver = Driver(uc=True) +atexit.register(driver.quit) +url = "www.planetminecraft.com/account" +driver.uc_activate_cdp_mode(url) +driver.sleep(1) +driver.uc_gui_click_captcha() +driver.sleep(2) diff --git a/examples/raw_games.py b/examples/raw_games.py index 27b4185e1f7..a9d5cb9b45a 100644 --- a/examples/raw_games.py +++ b/examples/raw_games.py @@ -1,14 +1,13 @@ """SB Manager using UC Mode for evading bot-detection.""" from seleniumbase import SB -with SB(uc=True, test=True, disable_csp=True) as sb: +with SB(uc=True, test=True) as sb: url = "https://steamdb.info/" sb.uc_open_with_reconnect(url, 3) sb.uc_click("a.header-login span", 3) sb.uc_gui_click_captcha() - sb.assert_text("Sign in", "button#js-sign-in", timeout=3) + sb.assert_text("Sign in", "button#js-sign-in") sb.uc_click("button#js-sign-in", 2) sb.highlight("div.page_content form") sb.highlight('button:contains("Sign in")', scroll=False) - sb.set_messenger_theme(location="top_center") - sb.post_message("SeleniumBase wasn't detected", duration=4) + sb.sleep(1) diff --git a/mkdocs_build/requirements.txt b/mkdocs_build/requirements.txt index 007c6725b8e..b8b8dc07c39 100644 --- a/mkdocs_build/requirements.txt +++ b/mkdocs_build/requirements.txt @@ -14,7 +14,7 @@ pathspec==0.12.1 Babel==2.17.0 paginate==0.5.7 mkdocs==1.6.1 -mkdocs-material==9.6.2 +mkdocs-material==9.6.3 mkdocs-exclude-search==0.6.6 mkdocs-simple-hooks==0.1.5 mkdocs-material-extensions==1.3.1 diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 7cfecb2463f..a52a178673e 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.34.8" +__version__ = "4.34.9" diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 0b1a840f642..10610fed832 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -1251,6 +1251,10 @@ def _uc_gui_click_captcha( ) ): frame = '[data-testid*="challenge-"] div' + elif driver.is_element_present( + "form.turnstile div#turnstile-widget div:not([class])" + ): + frame = "form.turnstile #turnstile-widget div:not([class])" elif driver.is_element_present( 'form div:not([class]):has(input[name*="cf-turn"])' ): @@ -1291,6 +1295,23 @@ def _uc_gui_click_captcha( driver.cdp.evaluate(script) else: driver.execute_script(script) + elif ( + driver.is_element_present("form") + and driver.is_element_present( + "form.turnstile #turnstile-widget > div:not([class])" + ) + ): + script = ( + """var $elements = document.querySelectorAll( + 'form.turnstile #turnstile-widget'); + var index = 0, length = $elements.length; + for(; index < length; index++){ + $elements[index].setAttribute('align', 'left');}""" + ) + if __is_cdp_swap_needed(driver): + driver.cdp.evaluate(script) + else: + driver.execute_script(script) if not is_in_frame or needs_switch: # Currently not in frame (or nested frame outside CF one) try: diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index 8856ba57be4..be4207bfdfd 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -3256,7 +3256,7 @@ def load_html_string(self, html_string, new_page=True): html_string = "\n".join(new_lines) soup = self.get_beautiful_soup(html_string) found_base = False - links = soup.findAll("link") + links = soup.find_all("link") href = None for link in links: if link.get("rel") == ["canonical"] and link.get("href"): @@ -3272,7 +3272,7 @@ def load_html_string(self, html_string, new_page=True): "
", '