Skip to content

Commit 8621dfe

Browse files
committed
Update UC Mode
1 parent db01223 commit 8621dfe

File tree

2 files changed

+103
-49
lines changed

2 files changed

+103
-49
lines changed

seleniumbase/core/browser_launcher.py

Lines changed: 97 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -975,9 +975,24 @@ def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
975975
)
976976

977977

978-
def uc_gui_handle_cf(driver, frame="iframe"):
979-
if not _on_a_cf_turnstile_page(driver):
980-
return
978+
def _uc_gui_handle_captcha(
979+
driver,
980+
frame="iframe",
981+
ctype=None,
982+
):
983+
if ctype == "cf_t":
984+
if not _on_a_cf_turnstile_page(driver):
985+
return
986+
elif ctype == "g_rc":
987+
if not _on_a_g_recaptcha_page(driver):
988+
return
989+
else:
990+
if _on_a_g_recaptcha_page(driver):
991+
ctype = "g_rc"
992+
elif _on_a_cf_turnstile_page(driver):
993+
ctype = "cf_t"
994+
else:
995+
return
981996
install_pyautogui_if_missing(driver)
982997
import pyautogui
983998
pyautogui = get_configured_pyautogui(pyautogui)
@@ -988,7 +1003,10 @@ def uc_gui_handle_cf(driver, frame="iframe"):
9881003
with gui_lock: # Prevent issues with multiple processes
9891004
needs_switch = False
9901005
is_in_frame = js_utils.is_in_frame(driver)
991-
if is_in_frame and driver.is_element_present("#challenge-stage"):
1006+
selector = "#challenge-stage"
1007+
if ctype == "g_rc":
1008+
selector = "#recaptcha-token"
1009+
if is_in_frame and driver.is_element_present(selector):
9921010
driver.switch_to.parent_frame()
9931011
needs_switch = True
9941012
is_in_frame = js_utils.is_in_frame(driver)
@@ -997,67 +1015,77 @@ def uc_gui_handle_cf(driver, frame="iframe"):
9971015
page_actions.switch_to_window(
9981016
driver, driver.current_window_handle, 2, uc_lock=False
9991017
)
1000-
if (
1001-
driver.is_element_present(".cf-turnstile-wrapper iframe")
1002-
or driver.is_element_present(
1003-
'[data-callback="onCaptchaSuccess"] iframe'
1004-
)
1005-
):
1006-
pass
1007-
else:
1008-
visible_iframe = False
1009-
if driver.is_element_present(".cf-turnstile-wrapper"):
1010-
frame = ".cf-turnstile-wrapper"
1011-
elif driver.is_element_present(
1012-
'[data-callback="onCaptchaSuccess"]'
1013-
):
1014-
frame = '[data-callback="onCaptchaSuccess"]'
1015-
elif (
1016-
driver.is_element_present('[name*="cf-turnstile-"]')
1017-
and driver.is_element_present("div.spacer div[style]")
1018-
):
1019-
frame = "div.spacer div[style]"
1020-
elif (
1021-
(
1022-
driver.is_element_present('[name*="cf-turnstile-"]')
1023-
or driver.is_element_present('[id*="cf-turnstile-"]')
1024-
)
1025-
and driver.is_element_present(
1026-
'form div div[style*="margin"][style*="padding"]'
1018+
if ctype == "cf_t":
1019+
if (
1020+
driver.is_element_present(".cf-turnstile-wrapper iframe")
1021+
or driver.is_element_present(
1022+
'[data-callback="onCaptchaSuccess"] iframe'
10271023
)
10281024
):
1029-
frame = 'form div div[style*="margin"][style*="padding"]'
1030-
elif (
1031-
(
1025+
pass
1026+
else:
1027+
visible_iframe = False
1028+
if driver.is_element_present(".cf-turnstile-wrapper"):
1029+
frame = ".cf-turnstile-wrapper"
1030+
elif driver.is_element_present(
1031+
'[data-callback="onCaptchaSuccess"]'
1032+
):
1033+
frame = '[data-callback="onCaptchaSuccess"]'
1034+
elif (
10321035
driver.is_element_present('[name*="cf-turnstile-"]')
1033-
or driver.is_element_present('[id*="cf-turnstile-"]')
1034-
)
1035-
and driver.is_element_present(
1036-
'div > div > [style*="margin"][style*="padding"]'
1037-
)
1036+
and driver.is_element_present("div.spacer div[style]")
1037+
):
1038+
frame = "div.spacer div[style]"
1039+
elif (
1040+
(
1041+
driver.is_element_present('[name*="cf-turnstile-"]')
1042+
or driver.is_element_present('[id*="cf-turnstile-"]')
1043+
)
1044+
and driver.is_element_present(
1045+
'form div div[style*="margin"][style*="padding"]'
1046+
)
1047+
):
1048+
frame = 'form div div[style*="margin"][style*="padding"]'
1049+
elif (
1050+
(
1051+
driver.is_element_present('[name*="cf-turnstile-"]')
1052+
or driver.is_element_present('[id*="cf-turnstile-"]')
1053+
)
1054+
and driver.is_element_present(
1055+
'div > div > [style*="margin"][style*="padding"]'
1056+
)
1057+
):
1058+
frame = 'div > div > [style*="margin"][style*="padding"]'
1059+
else:
1060+
return
1061+
else:
1062+
if (
1063+
driver.is_element_present('iframe[title="reCAPTCHA"]')
1064+
and frame == "iframe"
10381065
):
1039-
frame = 'div > div > [style*="margin"][style*="padding"]'
1040-
else:
1041-
return
1066+
frame = 'iframe[title="reCAPTCHA"]'
10421067
if not is_in_frame or needs_switch:
10431068
# Currently not in frame (or nested frame outside CF one)
10441069
try:
1045-
if visible_iframe:
1070+
if visible_iframe or ctype == "g_rc":
10461071
driver.switch_to_frame(frame)
10471072
except Exception:
1048-
if visible_iframe:
1073+
if visible_iframe or ctype == "g_rc":
10491074
if driver.is_element_present("iframe"):
10501075
driver.switch_to_frame("iframe")
10511076
else:
10521077
return
10531078
try:
1079+
selector = "div.cf-turnstile"
1080+
if ctype == "g_rc":
1081+
selector = "span#recaptcha-anchor"
10541082
found_checkbox = False
10551083
for i in range(24):
10561084
pyautogui.press("\t")
10571085
time.sleep(0.02)
10581086
active_element_css = js_utils.get_active_element_css(driver)
10591087
if (
1060-
active_element_css.startswith("div.cf-turnstile")
1088+
active_element_css.startswith(selector)
10611089
or active_element_css.endswith(" > div" * 2)
10621090
):
10631091
found_checkbox = True
@@ -1081,6 +1109,18 @@ def uc_gui_handle_cf(driver, frame="iframe"):
10811109
driver.reconnect(reconnect_time)
10821110

10831111

1112+
def uc_gui_handle_captcha(driver, frame="iframe"):
1113+
_uc_gui_handle_captcha(driver, frame=frame, ctype=None)
1114+
1115+
1116+
def uc_gui_handle_cf(driver, frame="iframe"):
1117+
_uc_gui_handle_captcha(driver, frame=frame, ctype="cf_t")
1118+
1119+
1120+
def uc_gui_handle_rc(driver, frame="iframe"):
1121+
_uc_gui_handle_captcha(driver, frame=frame, ctype="g_rc")
1122+
1123+
10841124
def uc_switch_to_frame(driver, frame="iframe", reconnect_time=None):
10851125
from selenium.webdriver.remote.webelement import WebElement
10861126
if isinstance(frame, WebElement):
@@ -4421,13 +4461,18 @@ def get_local_driver(
44214461
driver, *args, **kwargs
44224462
)
44234463
)
4464+
driver.uc_gui_click_cf = (
4465+
lambda *args, **kwargs: uc_gui_click_cf(
4466+
driver, *args, **kwargs
4467+
)
4468+
)
44244469
driver.uc_gui_click_rc = (
44254470
lambda *args, **kwargs: uc_gui_click_rc(
44264471
driver, *args, **kwargs
44274472
)
44284473
)
4429-
driver.uc_gui_click_cf = (
4430-
lambda *args, **kwargs: uc_gui_click_cf(
4474+
driver.uc_gui_handle_captcha = (
4475+
lambda *args, **kwargs: uc_gui_handle_captcha(
44314476
driver, *args, **kwargs
44324477
)
44334478
)
@@ -4436,6 +4481,11 @@ def get_local_driver(
44364481
driver, *args, **kwargs
44374482
)
44384483
)
4484+
driver.uc_gui_handle_rc = (
4485+
lambda *args, **kwargs: uc_gui_handle_rc(
4486+
driver, *args, **kwargs
4487+
)
4488+
)
44394489
driver.uc_switch_to_frame = (
44404490
lambda *args, **kwargs: uc_switch_to_frame(
44414491
driver, *args, **kwargs

seleniumbase/fixtures/base_case.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4246,12 +4246,16 @@ def get_new_driver(
42464246
self.uc_gui_click_x_y = new_driver.uc_gui_click_x_y
42474247
if hasattr(new_driver, "uc_gui_click_captcha"):
42484248
self.uc_gui_click_captcha = new_driver.uc_gui_click_captcha
4249-
if hasattr(new_driver, "uc_gui_click_rc"):
4250-
self.uc_gui_click_rc = new_driver.uc_gui_click_rc
42514249
if hasattr(new_driver, "uc_gui_click_cf"):
42524250
self.uc_gui_click_cf = new_driver.uc_gui_click_cf
4251+
if hasattr(new_driver, "uc_gui_click_rc"):
4252+
self.uc_gui_click_rc = new_driver.uc_gui_click_rc
4253+
if hasattr(new_driver, "uc_gui_handle_captcha"):
4254+
self.uc_gui_handle_captcha = new_driver.uc_gui_handle_captcha
42534255
if hasattr(new_driver, "uc_gui_handle_cf"):
42544256
self.uc_gui_handle_cf = new_driver.uc_gui_handle_cf
4257+
if hasattr(new_driver, "uc_gui_handle_rc"):
4258+
self.uc_gui_handle_rc = new_driver.uc_gui_handle_rc
42554259
if hasattr(new_driver, "uc_switch_to_frame"):
42564260
self.uc_switch_to_frame = new_driver.uc_switch_to_frame
42574261
return new_driver

0 commit comments

Comments
 (0)