diff --git a/examples/cdp_mode/playwright/raw_walmart_sync.py b/examples/cdp_mode/playwright/raw_walmart_sync.py index 48f82d1857e..b3af33fee36 100644 --- a/examples/cdp_mode/playwright/raw_walmart_sync.py +++ b/examples/cdp_mode/playwright/raw_walmart_sync.py @@ -26,7 +26,11 @@ item = items.nth(i) if required_text in item.inner_text(): description = item.locator('[data-automation-id="product-title"]') - if description and description.inner_text() not in unique_item: + if ( + description + and description.is_visible() + and description.inner_text() not in unique_item + ): unique_item.append(description.inner_text()) print("* " + description.inner_text()) price = item.locator('[data-automation-id="product-price"]') diff --git a/mkdocs_build/requirements.txt b/mkdocs_build/requirements.txt index 29e47d125f7..f041ea08401 100644 --- a/mkdocs_build/requirements.txt +++ b/mkdocs_build/requirements.txt @@ -10,8 +10,8 @@ click==8.3.1 ghp-import==2.1.0 watchdog==6.0.0 cairocffi==1.7.1 -pathspec==1.0.3 -Babel==2.17.0 +pathspec==1.0.4 +Babel==2.18.0 paginate==0.5.7 mkdocs==1.6.1 mkdocs-material==9.6.23 diff --git a/requirements.txt b/requirements.txt index 9f3f06646f4..4e27b61318d 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -pip>=25.3 +pip>=26.0 packaging>=26.0 setuptools~=70.2;python_version<"3.10" setuptools>=80.10.2;python_version>="3.10" @@ -45,7 +45,8 @@ wsproto~=1.3.2;python_version>="3.10" websocket-client~=1.9.0 selenium==4.32.0;python_version<"3.10" selenium==4.40.0;python_version>="3.10" -cssselect==1.3.0 +cssselect==1.3.0;python_version<"3.10" +cssselect>=1.4.0,<2;python_version>="3.10" nest-asyncio==1.6.0 sortedcontainers==2.4.0 execnet==2.1.1;python_version<"3.10" @@ -71,7 +72,7 @@ PyAutoGUI>=0.9.54;platform_system=="Linux" markdown-it-py==3.0.0;python_version<"3.10" markdown-it-py==4.0.0;python_version>="3.10" mdurl==0.1.2 -rich>=14.3.1,<15 +rich>=14.3.2,<15 # --- Testing Requirements --- # # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.) diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 8e53beee538..899bd2e1444 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.46.2" +__version__ = "4.46.3" diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index d0579a802ef..3767c7b850b 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -1974,7 +1974,10 @@ def _on_a_cf_turnstile_page(self, source=None): def _on_an_incapsula_hcaptcha_page(self, *args, **kwargs): self.loop.run_until_complete(self.page.wait()) - if self.is_element_visible('iframe[src*="_Incapsula_Resource?"]'): + if ( + self.is_element_visible('iframe[src*="_Incapsula_Resource?"]') + or self.is_element_visible("iframe[data-hcaptcha-widget-id]") + ): return True return False @@ -2052,13 +2055,16 @@ def __gui_click_recaptcha(self, use_cdp=False): return False def __cdp_click_incapsula_hcaptcha(self): - selector = None + selector = "iframe[data-hcaptcha-widget-id]" if self.is_element_visible('iframe[src*="_Incapsula_Resource?"]'): outer_selector = 'iframe[src*="_Incapsula_Resource?"]' - selector = "iframe[data-hcaptcha-widget-id]" element = self.get_nested_element(outer_selector, selector) if not element: return False + elif self.is_element_visible(selector): + element = self.select(selector, timeout=0.1) + if not element: + return False else: return False time.sleep(0.05) diff --git a/seleniumbase/undetected/cdp_driver/cdp_util.py b/seleniumbase/undetected/cdp_driver/cdp_util.py index da855f0f233..572554021f6 100644 --- a/seleniumbase/undetected/cdp_driver/cdp_util.py +++ b/seleniumbase/undetected/cdp_driver/cdp_util.py @@ -599,6 +599,18 @@ async def start( sb_config.disable_csp = True if "binary_location" in kwargs and not browser_executable_path: browser_executable_path = kwargs["binary_location"] + if not user_data_dir and "--user-data-dir" in arg_join: + udd_string = None + if "--user-data-dir=" in arg_join: + udd_string = arg_join.split("--user-data-dir=")[1].split(" ")[0] + elif "--user-data-dir " in arg_join: + udd_string = arg_join.split("--user-data-dir ")[1].split(" ")[0] + if udd_string: + if udd_string.startswith('"') and udd_string.endswith('"'): + udd_string = udd_string[1:-1] + elif udd_string.startswith("'") and udd_string.endswith("'"): + udd_string = udd_string[1:-1] + user_data_dir = udd_string if not browser_executable_path: browser = None if "browser" in kwargs: @@ -611,9 +623,9 @@ async def start( br_string = arg_join.split("--browser ")[1].split(" ")[0] if br_string: if br_string.startswith('"') and br_string.endswith('"'): - br_string = proxy_string[1:-1] + br_string = br_string[1:-1] elif br_string.startswith("'") and br_string.endswith("'"): - br_string = proxy_string[1:-1] + br_string = br_string[1:-1] browser = br_string if not browser: if "--edge" in sys_argv: diff --git a/setup.py b/setup.py index ede14029055..c3d3977e188 100755 --- a/setup.py +++ b/setup.py @@ -146,7 +146,7 @@ ], python_requires=">=3.9", install_requires=[ - 'pip>=25.3', + 'pip>=26.0', 'packaging>=26.0', 'setuptools~=70.2;python_version<"3.10"', # Newer ones had issues 'setuptools>=80.10.2;python_version>="3.10"', @@ -193,7 +193,8 @@ 'websocket-client~=1.9.0', 'selenium==4.32.0;python_version<"3.10"', 'selenium==4.40.0;python_version>="3.10"', - 'cssselect==1.3.0', + 'cssselect==1.3.0;python_version<"3.10"', + 'cssselect>=1.4.0,<2;python_version>="3.10"', 'nest-asyncio==1.6.0', 'sortedcontainers==2.4.0', 'execnet==2.1.1;python_version<"3.10"', @@ -219,7 +220,7 @@ 'markdown-it-py==3.0.0;python_version<"3.10"', 'markdown-it-py==4.0.0;python_version>="3.10"', 'mdurl==0.1.2', - 'rich>=14.3.1,<15', + 'rich>=14.3.2,<15', ], extras_require={ # pip install -e .[allure] @@ -261,7 +262,7 @@ "pdfminer": [ 'pdfminer.six==20251107;python_version<"3.10"', 'pdfminer.six==20260107;python_version>="3.10"', - 'cryptography==46.0.3', + 'cryptography==46.0.4', 'cffi==2.0.0', 'pycparser==2.23;python_version<"3.10"', 'pycparser==3.0;python_version>="3.10"', @@ -287,11 +288,11 @@ # pip install -e .[playwright] # (For the Playwright integration.) "playwright": [ - "playwright>=1.56.0", + "playwright>=1.58.0", ], # pip install -e .[psutil] "psutil": [ - "psutil>=7.1.3", + "psutil>=7.2.2", ], # pip install -e .[pyautogui] # (Already a required dependency on Linux now.)