@@ -975,9 +975,24 @@ def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
975
975
)
976
976
977
977
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
981
996
install_pyautogui_if_missing (driver )
982
997
import pyautogui
983
998
pyautogui = get_configured_pyautogui (pyautogui )
@@ -988,7 +1003,10 @@ def uc_gui_handle_cf(driver, frame="iframe"):
988
1003
with gui_lock : # Prevent issues with multiple processes
989
1004
needs_switch = False
990
1005
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 ):
992
1010
driver .switch_to .parent_frame ()
993
1011
needs_switch = True
994
1012
is_in_frame = js_utils .is_in_frame (driver )
@@ -997,67 +1015,77 @@ def uc_gui_handle_cf(driver, frame="iframe"):
997
1015
page_actions .switch_to_window (
998
1016
driver , driver .current_window_handle , 2 , uc_lock = False
999
1017
)
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'
1027
1023
)
1028
1024
):
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 (
1032
1035
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"
1038
1065
):
1039
- frame = 'div > div > [style*="margin"][style*="padding"]'
1040
- else :
1041
- return
1066
+ frame = 'iframe[title="reCAPTCHA"]'
1042
1067
if not is_in_frame or needs_switch :
1043
1068
# Currently not in frame (or nested frame outside CF one)
1044
1069
try :
1045
- if visible_iframe :
1070
+ if visible_iframe or ctype == "g_rc" :
1046
1071
driver .switch_to_frame (frame )
1047
1072
except Exception :
1048
- if visible_iframe :
1073
+ if visible_iframe or ctype == "g_rc" :
1049
1074
if driver .is_element_present ("iframe" ):
1050
1075
driver .switch_to_frame ("iframe" )
1051
1076
else :
1052
1077
return
1053
1078
try :
1079
+ selector = "div.cf-turnstile"
1080
+ if ctype == "g_rc" :
1081
+ selector = "span#recaptcha-anchor"
1054
1082
found_checkbox = False
1055
1083
for i in range (24 ):
1056
1084
pyautogui .press ("\t " )
1057
1085
time .sleep (0.02 )
1058
1086
active_element_css = js_utils .get_active_element_css (driver )
1059
1087
if (
1060
- active_element_css .startswith ("div.cf-turnstile" )
1088
+ active_element_css .startswith (selector )
1061
1089
or active_element_css .endswith (" > div" * 2 )
1062
1090
):
1063
1091
found_checkbox = True
@@ -1081,6 +1109,18 @@ def uc_gui_handle_cf(driver, frame="iframe"):
1081
1109
driver .reconnect (reconnect_time )
1082
1110
1083
1111
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
+
1084
1124
def uc_switch_to_frame (driver , frame = "iframe" , reconnect_time = None ):
1085
1125
from selenium .webdriver .remote .webelement import WebElement
1086
1126
if isinstance (frame , WebElement ):
@@ -4421,13 +4461,18 @@ def get_local_driver(
4421
4461
driver , * args , ** kwargs
4422
4462
)
4423
4463
)
4464
+ driver .uc_gui_click_cf = (
4465
+ lambda * args , ** kwargs : uc_gui_click_cf (
4466
+ driver , * args , ** kwargs
4467
+ )
4468
+ )
4424
4469
driver .uc_gui_click_rc = (
4425
4470
lambda * args , ** kwargs : uc_gui_click_rc (
4426
4471
driver , * args , ** kwargs
4427
4472
)
4428
4473
)
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 (
4431
4476
driver , * args , ** kwargs
4432
4477
)
4433
4478
)
@@ -4436,6 +4481,11 @@ def get_local_driver(
4436
4481
driver , * args , ** kwargs
4437
4482
)
4438
4483
)
4484
+ driver .uc_gui_handle_rc = (
4485
+ lambda * args , ** kwargs : uc_gui_handle_rc (
4486
+ driver , * args , ** kwargs
4487
+ )
4488
+ )
4439
4489
driver .uc_switch_to_frame = (
4440
4490
lambda * args , ** kwargs : uc_switch_to_frame (
4441
4491
driver , * args , ** kwargs
0 commit comments