@@ -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+
10841124def 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
0 commit comments