Skip to content

Commit 2700066

Browse files
committed
Update CDP Mode / UC Mode
1 parent 32f1288 commit 2700066

File tree

9 files changed

+208
-54
lines changed

9 files changed

+208
-54
lines changed

seleniumbase/core/browser_launcher.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ def uc_open_with_cdp_mode(driver, url=None):
549549
cdp = types.SimpleNamespace()
550550
CDPM = sb_cdp.CDPMethods(loop, page, driver)
551551
cdp.get = CDPM.get
552-
cdp.open = CDPM.get
552+
cdp.open = CDPM.open
553553
cdp.reload = CDPM.reload
554554
cdp.refresh = CDPM.refresh
555555
cdp.add_handler = CDPM.add_handler
@@ -590,6 +590,7 @@ def uc_open_with_cdp_mode(driver, url=None):
590590
cdp.medimize = CDPM.medimize
591591
cdp.set_window_rect = CDPM.set_window_rect
592592
cdp.reset_window_size = CDPM.reset_window_size
593+
cdp.set_locale = CDPM.set_locale
593594
cdp.set_attributes = CDPM.set_attributes
594595
cdp.internalize_links = CDPM.internalize_links
595596
cdp.get_window = CDPM.get_window
@@ -2179,8 +2180,13 @@ def _set_chrome_options(
21792180
or IS_LINUX # switches to Xvfb (non-headless)
21802181
)
21812182
):
2183+
chrome_options.add_argument("--no-pings")
21822184
chrome_options.add_argument("--disable-popup-blocking")
2183-
chrome_options.add_argument("--homepage=chrome://new-tab-page/")
2185+
chrome_options.add_argument("--homepage=chrome://version/")
2186+
chrome_options.add_argument("--animation-duration-scale=0")
2187+
chrome_options.add_argument("--wm-window-animations-disabled")
2188+
chrome_options.add_argument("--enable-privacy-sandbox-ads-apis")
2189+
chrome_options.add_argument("--disable-background-timer-throttling")
21842190
# Skip remaining options that trigger anti-bot services
21852191
return chrome_options
21862192
chrome_options.add_argument("--test-type")
@@ -4523,6 +4529,7 @@ def get_local_driver(
45234529
and uc_chrome_version
45244530
and uc_chrome_version >= 117
45254531
and (headless or headless2)
4532+
and chromium_arg != "decoy"
45264533
):
45274534
from seleniumbase.console_scripts import (
45284535
sb_install

seleniumbase/core/sb_cdp.py

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,21 @@ def __add_sync_methods(self, element):
7676

7777
def get(self, url):
7878
url = shared_utils.fix_url_as_needed(url)
79-
self.page = self.loop.run_until_complete(self.driver.cdp_base.get(url))
79+
driver = self.driver
80+
if hasattr(driver, "cdp_base"):
81+
driver = driver.cdp_base
82+
self.page = self.loop.run_until_complete(driver.get(url))
8083
url_protocol = url.split(":")[0]
8184
safe_url = True
8285
if url_protocol not in ["about", "data", "chrome"]:
8386
safe_url = False
8487
if not safe_url:
8588
time.sleep(constants.UC.CDP_MODE_OPEN_WAIT)
89+
self.__slow_mode_pause_if_set()
90+
self.loop.run_until_complete(self.page.wait())
91+
92+
def open(self, url):
93+
self.get(url)
8694

8795
def reload(self, ignore_cache=True, script_to_evaluate_on_load=None):
8896
self.loop.run_until_complete(
@@ -111,18 +119,28 @@ def find_element(
111119
with the closest text-length to the text being searched for."""
112120
self.__add_light_pause()
113121
selector = self.__convert_to_css_if_xpath(selector)
122+
early_failure = False
114123
if (":contains(" in selector):
115124
tag_name = selector.split(":contains(")[0].split(" ")[-1]
116125
text = selector.split(":contains(")[1].split(")")[0][1:-1]
117126
with suppress(Exception):
118127
self.loop.run_until_complete(
119-
self.page.select(tag_name, timeout=3)
128+
self.page.select(tag_name, timeout=timeout)
120129
)
121-
self.loop.run_until_complete(self.page.find(text, timeout=3))
122-
element = self.find_elements_by_text(text, tag_name=tag_name)[0]
123-
return self.__add_sync_methods(element)
130+
self.loop.run_until_complete(
131+
self.page.find(text, timeout=timeout)
132+
)
133+
elements = []
134+
with suppress(Exception):
135+
elements = self.find_elements_by_text(text, tag_name=tag_name)
136+
if elements:
137+
return self.__add_sync_methods(elements[0])
138+
else:
139+
early_failure = True
124140
failure = False
125141
try:
142+
if early_failure:
143+
raise Exception("Failed!")
126144
element = self.loop.run_until_complete(
127145
self.page.find(
128146
selector, best_match=best_match, timeout=timeout
@@ -230,9 +248,11 @@ def __clear_input(self, element):
230248
)
231249

232250
def __click(self, element):
233-
return (
251+
result = (
234252
self.loop.run_until_complete(element.click_async())
235253
)
254+
self.loop.run_until_complete(self.page.wait())
255+
return result
236256

237257
def __flash(self, element):
238258
return (
@@ -250,9 +270,11 @@ def __highlight_overlay(self, element):
250270
)
251271

252272
def __mouse_click(self, element):
253-
return (
273+
result = (
254274
self.loop.run_until_complete(element.mouse_click_async())
255275
)
276+
self.loop.run_until_complete(self.page.wait())
277+
return result
256278

257279
def __mouse_drag(self, element, destination):
258280
return (
@@ -353,33 +375,51 @@ def __get_js_attributes(self, element):
353375

354376
def tile_windows(self, windows=None, max_columns=0):
355377
"""Tile windows and return the grid of tiled windows."""
378+
driver = self.driver
379+
if hasattr(driver, "cdp_base"):
380+
driver = driver.cdp_base
356381
return self.loop.run_until_complete(
357-
self.driver.cdp_base.tile_windows(windows, max_columns)
382+
driver.tile_windows(windows, max_columns)
358383
)
359384

360385
def get_all_cookies(self, *args, **kwargs):
386+
driver = self.driver
387+
if hasattr(driver, "cdp_base"):
388+
driver = driver.cdp_base
361389
return self.loop.run_until_complete(
362-
self.driver.cdp_base.cookies.get_all(*args, **kwargs)
390+
driver.cookies.get_all(*args, **kwargs)
363391
)
364392

365393
def set_all_cookies(self, *args, **kwargs):
394+
driver = self.driver
395+
if hasattr(driver, "cdp_base"):
396+
driver = driver.cdp_base
366397
return self.loop.run_until_complete(
367-
self.driver.cdp_base.cookies.set_all(*args, **kwargs)
398+
driver.cookies.set_all(*args, **kwargs)
368399
)
369400

370401
def save_cookies(self, *args, **kwargs):
402+
driver = self.driver
403+
if hasattr(driver, "cdp_base"):
404+
driver = driver.cdp_base
371405
return self.loop.run_until_complete(
372-
self.driver.cdp_base.cookies.save(*args, **kwargs)
406+
driver.cookies.save(*args, **kwargs)
373407
)
374408

375409
def load_cookies(self, *args, **kwargs):
410+
driver = self.driver
411+
if hasattr(driver, "cdp_base"):
412+
driver = driver.cdp_base
376413
return self.loop.run_until_complete(
377-
self.driver.cdp_base.cookies.load(*args, **kwargs)
414+
driver.cookies.load(*args, **kwargs)
378415
)
379416

380417
def clear_cookies(self, *args, **kwargs):
418+
driver = self.driver
419+
if hasattr(driver, "cdp_base"):
420+
driver = driver.cdp_base
381421
return self.loop.run_until_complete(
382-
self.driver.cdp_base.cookies.clear(*args, **kwargs)
422+
driver.cookies.clear(*args, **kwargs)
383423
)
384424

385425
def sleep(self, seconds):
@@ -408,17 +448,20 @@ def click(self, selector, timeout=settings.SMALL_TIMEOUT):
408448
self.__add_light_pause()
409449
element.click()
410450
self.__slow_mode_pause_if_set()
451+
self.loop.run_until_complete(self.page.wait())
411452

412453
def click_active_element(self):
413454
self.loop.run_until_complete(
414455
self.page.evaluate("document.activeElement.click()")
415456
)
416457
self.__slow_mode_pause_if_set()
458+
self.loop.run_until_complete(self.page.wait())
417459

418460
def click_if_visible(self, selector):
419461
if self.is_element_visible(selector):
420462
self.find_element(selector).click()
421463
self.__slow_mode_pause_if_set()
464+
self.loop.run_until_complete(self.page.wait())
422465

423466
def mouse_click(self, selector, timeout=settings.SMALL_TIMEOUT):
424467
"""(Attempt simulating a mouse click)"""
@@ -427,6 +470,7 @@ def mouse_click(self, selector, timeout=settings.SMALL_TIMEOUT):
427470
self.__add_light_pause()
428471
element.mouse_click()
429472
self.__slow_mode_pause_if_set()
473+
self.loop.run_until_complete(self.page.wait())
430474

431475
def nested_click(self, parent_selector, selector):
432476
"""
@@ -436,6 +480,7 @@ def nested_click(self, parent_selector, selector):
436480
element = self.find_element(parent_selector)
437481
element.query_selector(selector).mouse_click()
438482
self.__slow_mode_pause_if_set()
483+
self.loop.run_until_complete(self.page.wait())
439484

440485
def get_nested_element(self, parent_selector, selector):
441486
"""(Can be used to find an element inside an iframe)"""
@@ -483,6 +528,7 @@ def send_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
483528
text = text[:-1] + "\r\n"
484529
element.send_keys(text)
485530
self.__slow_mode_pause_if_set()
531+
self.loop.run_until_complete(self.page.wait())
486532

487533
def press_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
488534
"""Similar to send_keys(), but presses keys at human speed."""
@@ -499,6 +545,7 @@ def press_keys(self, selector, text, timeout=settings.SMALL_TIMEOUT):
499545
element.send_keys("\r\n")
500546
time.sleep(0.0375)
501547
self.__slow_mode_pause_if_set()
548+
self.loop.run_until_complete(self.page.wait())
502549

503550
def type(self, selector, text, timeout=settings.SMALL_TIMEOUT):
504551
"""Similar to send_keys(), but clears the text field first."""
@@ -510,6 +557,7 @@ def type(self, selector, text, timeout=settings.SMALL_TIMEOUT):
510557
text = text[:-1] + "\r\n"
511558
element.send_keys(text)
512559
self.__slow_mode_pause_if_set()
560+
self.loop.run_until_complete(self.page.wait())
513561

514562
def evaluate(self, expression):
515563
"""Run a JavaScript expression and return the result."""
@@ -760,6 +808,10 @@ def get_element_html(self, selector):
760808
)
761809
)
762810

811+
def set_locale(self, locale):
812+
"""(Settings will take effect on the next page load)"""
813+
self.loop.run_until_complete(self.page.set_locale(locale))
814+
763815
def set_attributes(self, selector, attribute, value):
764816
"""This method uses JavaScript to set/update a common attribute.
765817
All matching selectors from querySelectorAll() are used.

0 commit comments

Comments
 (0)