Skip to content

Commit 2706528

Browse files
committed
Update CDP Mode
1 parent 186e472 commit 2706528

File tree

2 files changed

+93
-36
lines changed

2 files changed

+93
-36
lines changed

seleniumbase/core/browser_launcher.py

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
835835
cdp.wait_for_text = CDPM.wait_for_text
836836
cdp.wait_for_text_not_visible = CDPM.wait_for_text_not_visible
837837
cdp.wait_for_element_visible = CDPM.wait_for_element_visible
838+
cdp.wait_for_element = CDPM.wait_for_element
838839
cdp.wait_for_element_not_visible = CDPM.wait_for_element_not_visible
839840
cdp.wait_for_element_absent = CDPM.wait_for_element_absent
840841
cdp.wait_for_any_of_elements_visible = (
@@ -1365,14 +1366,16 @@ def _uc_gui_click_captcha(
13651366
frame = '[style="display: grid;"] div div'
13661367
elif (
13671368
driver.is_element_present('[name*="cf-turnstile-"]')
1368-
and driver.is_element_present("[class*=spacer] + div div")
1369+
and driver.is_element_present(
1370+
".spacer + div div:not([class])"
1371+
)
13691372
):
1370-
frame = '[class*=spacer] + div div'
1373+
frame = '.spacer + div div:not([class])'
13711374
elif (
13721375
driver.is_element_present('[name*="cf-turnstile-"]')
1373-
and driver.is_element_present("div.spacer div")
1376+
and driver.is_element_present(".spacer div:not([class])")
13741377
):
1375-
frame = "div.spacer div"
1378+
frame = ".spacer div:not([class])"
13761379
elif (
13771380
driver.is_element_present('script[src*="challenges.c"]')
13781381
and driver.is_element_present(
@@ -1384,6 +1387,10 @@ def _uc_gui_click_captcha(
13841387
"div#turnstile-widget div:not([class])"
13851388
):
13861389
frame = "div#turnstile-widget div:not([class])"
1390+
elif driver.is_element_present(
1391+
"ngx-turnstile div:not([class])"
1392+
):
1393+
frame = "ngx-turnstile div:not([class])"
13871394
elif driver.is_element_present(
13881395
'form div:not([class]):has(input[name*="cf-turn"])'
13891396
):
@@ -1404,6 +1411,14 @@ def _uc_gui_click_captcha(
14041411
frame = ".cf-turnstile-wrapper"
14051412
elif driver.is_element_present('[class="cf-turnstile"]'):
14061413
frame = '[class="cf-turnstile"]'
1414+
elif driver.is_element_present(
1415+
'[id*="turnstile"] div:not([class])'
1416+
):
1417+
frame = '[id*="turnstile"] div:not([class])'
1418+
elif driver.is_element_present(
1419+
'[class*="turnstile"] div:not([class])'
1420+
):
1421+
frame = '[class*="turnstile"] div:not([class])'
14071422
elif driver.is_element_present(
14081423
'[data-callback="onCaptchaSuccess"]'
14091424
):
@@ -1455,22 +1470,47 @@ def _uc_gui_click_captcha(
14551470
else:
14561471
driver.execute_script(script)
14571472
elif (
1458-
driver.is_element_present("form")
1459-
and driver.is_element_present(
1460-
'form [id*="turnstile"] > div:not([class])'
1473+
driver.is_element_present(
1474+
'form [id*="turnstile"] div:not([class])'
1475+
)
1476+
or driver.is_element_present(
1477+
'form [class*="turnstile"] div:not([class])'
14611478
)
14621479
):
14631480
script = (
14641481
"""var $elements = document.querySelectorAll(
14651482
'form [id*="turnstile"]');
14661483
var index = 0, length = $elements.length;
14671484
for(; index < length; index++){
1485+
$elements[index].setAttribute('align', 'left');}
1486+
var $elements = document.querySelectorAll(
1487+
'form [class*="turnstile"]');
1488+
var index = 0, length = $elements.length;
1489+
for(; index < length; index++){
14681490
$elements[index].setAttribute('align', 'left');}"""
14691491
)
14701492
if __is_cdp_swap_needed(driver):
14711493
driver.cdp.evaluate(script)
14721494
else:
14731495
driver.execute_script(script)
1496+
elif (
1497+
driver.is_element_present(
1498+
'[style*="text-align: center;"] div:not([class])'
1499+
)
1500+
):
1501+
script = (
1502+
"""var $elements = document.querySelectorAll(
1503+
'[style*="text-align: center;"]');
1504+
var index = 0, length = $elements.length;
1505+
for(; index < length; index++){
1506+
the_style = $elements[index].getAttribute('style');
1507+
new_style = the_style.replaceAll('center', 'left');
1508+
$elements[index].setAttribute('style', new_style);}"""
1509+
)
1510+
if __is_cdp_swap_needed(driver):
1511+
driver.cdp.evaluate(script)
1512+
else:
1513+
driver.execute_script(script)
14741514
if not is_in_frame or needs_switch:
14751515
# Currently not in frame (or nested frame outside CF one)
14761516
try:
@@ -1690,9 +1730,9 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
16901730
frame = '[data-callback="onCaptchaSuccess"]'
16911731
elif (
16921732
driver.is_element_present('[name*="cf-turnstile-"]')
1693-
and driver.is_element_present("div.spacer div")
1733+
and driver.is_element_present(".spacer div:not([class])")
16941734
):
1695-
frame = "div.spacer div"
1735+
frame = ".spacer div:not([class])"
16961736
elif (
16971737
driver.is_element_present('script[src*="challenges.c"]')
16981738
and driver.is_element_present(

seleniumbase/core/sb_cdp.py

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -301,28 +301,7 @@ def select(self, selector, timeout=None):
301301
self.__add_light_pause()
302302
selector = self.__convert_to_css_if_xpath(selector)
303303
if (":contains(" in selector):
304-
tag_name = selector.split(":contains(")[0].split(" ")[-1]
305-
text = selector.split(":contains(")[1].split(")")[0][1:-1]
306-
with suppress(Exception):
307-
new_timeout = timeout
308-
if new_timeout < 1:
309-
new_timeout = 1
310-
self.loop.run_until_complete(
311-
self.page.select(tag_name, timeout=new_timeout)
312-
)
313-
self.loop.run_until_complete(
314-
self.page.find(text, timeout=new_timeout)
315-
)
316-
elements = self.find_elements_by_text(text, tag_name=tag_name)
317-
if not elements:
318-
plural = "s"
319-
if timeout == 1:
320-
plural = ""
321-
msg = "\n Element {%s} was not found after %s second%s!"
322-
message = msg % (selector, timeout, plural)
323-
raise Exception(message)
324-
element = self.__add_sync_methods(elements[0])
325-
return element
304+
return self.find_element(selector, timeout=timeout)
326305
failure = False
327306
try:
328307
element = self.loop.run_until_complete(
@@ -1708,9 +1687,9 @@ def gui_click_captcha(self):
17081687
selector = '[class*=spacer] + div div'
17091688
elif (
17101689
self.is_element_present('[name*="cf-turnstile-"]')
1711-
and self.is_element_present("div.spacer div")
1690+
and self.is_element_present(".spacer div:not([class])")
17121691
):
1713-
selector = "div.spacer div"
1692+
selector = ".spacer div:not([class])"
17141693
elif (
17151694
self.is_element_present('script[src*="challenges.c"]')
17161695
and self.is_element_present(
@@ -1722,6 +1701,8 @@ def gui_click_captcha(self):
17221701
"div#turnstile-widget div:not([class])"
17231702
):
17241703
selector = "div#turnstile-widget div:not([class])"
1704+
elif self.is_element_present("ngx-turnstile div:not([class])"):
1705+
selector = "ngx-turnstile div:not([class])"
17251706
elif self.is_element_present(
17261707
'form div:not([class]):has(input[name*="cf-turn"])'
17271708
):
@@ -1742,6 +1723,14 @@ def gui_click_captcha(self):
17421723
selector = ".cf-turnstile-wrapper"
17431724
elif self.is_element_present('[class="cf-turnstile"]'):
17441725
selector = '[class="cf-turnstile"]'
1726+
elif self.is_element_present(
1727+
'[id*="turnstile"] div:not([class])'
1728+
):
1729+
selector = '[id*="turnstile"] div:not([class])'
1730+
elif self.is_element_present(
1731+
'[class*="turnstile"] div:not([class])'
1732+
):
1733+
selector = '[class*="turnstile"] div:not([class])'
17451734
elif self.is_element_present(
17461735
'[data-callback="onCaptchaSuccess"]'
17471736
):
@@ -1793,21 +1782,45 @@ def gui_click_captcha(self):
17931782
self.loop.run_until_complete(self.page.evaluate(script))
17941783
self.loop.run_until_complete(self.page.wait())
17951784
elif (
1796-
self.is_element_present("form")
1797-
and self.is_element_present(
1798-
'form [id*="turnstile"] > div:not([class])'
1785+
self.is_element_present(
1786+
'form [id*="turnstile"] div:not([class])'
1787+
)
1788+
or self.is_element_present(
1789+
'form [class*="turnstile"] div:not([class])'
17991790
)
18001791
):
18011792
script = (
18021793
"""var $elements = document.querySelectorAll(
18031794
'form [id*="turnstile"]');
18041795
var index = 0, length = $elements.length;
18051796
for(; index < length; index++){
1797+
$elements[index].setAttribute('align', 'left');}
1798+
var $elements = document.querySelectorAll(
1799+
'form [class*="turnstile"]');
1800+
var index = 0, length = $elements.length;
1801+
for(; index < length; index++){
18061802
$elements[index].setAttribute('align', 'left');}"""
18071803
)
18081804
with suppress(Exception):
18091805
self.loop.run_until_complete(self.page.evaluate(script))
18101806
self.loop.run_until_complete(self.page.wait())
1807+
elif (
1808+
self.is_element_present(
1809+
'[style*="text-align: center;"] div:not([class])'
1810+
)
1811+
):
1812+
script = (
1813+
"""var $elements = document.querySelectorAll(
1814+
'[style*="text-align: center;"]');
1815+
var index = 0, length = $elements.length;
1816+
for(; index < length; index++){
1817+
the_style = $elements[index].getAttribute('style');
1818+
new_style = the_style.replaceAll('center', 'left');
1819+
$elements[index].setAttribute('style', new_style);}"""
1820+
)
1821+
with suppress(Exception):
1822+
self.loop.run_until_complete(self.page.evaluate(script))
1823+
self.loop.run_until_complete(self.page.wait())
18111824
with suppress(Exception):
18121825
time.sleep(0.08)
18131826
element_rect = self.get_gui_element_rect(selector, timeout=1)
@@ -2163,6 +2176,10 @@ def wait_for_element_visible(self, selector, timeout=None):
21632176
time.sleep(0.1)
21642177
raise Exception("Element {%s} was not visible!" % selector)
21652178

2179+
def wait_for_element(self, selector, **kwargs):
2180+
"""Same as wait_for_element_visible()"""
2181+
return self.wait_for_element_visible(selector, **kwargs)
2182+
21662183
def wait_for_element_not_visible(self, selector, timeout=None):
21672184
"""Wait for element to not be visible on page. (May still be in DOM)"""
21682185
if not timeout:

0 commit comments

Comments
 (0)