Update UC Mode

This commit is contained in:
Michael Mintz 2024-08-02 18:45:13 -04:00
parent db012234fc
commit 8621dfeef6
2 changed files with 107 additions and 53 deletions

View File

@ -975,9 +975,24 @@ def uc_gui_click_cf(driver, frame="iframe", retry=False, blind=False):
) )
def uc_gui_handle_cf(driver, frame="iframe"): def _uc_gui_handle_captcha(
if not _on_a_cf_turnstile_page(driver): driver,
return frame="iframe",
ctype=None,
):
if ctype == "cf_t":
if not _on_a_cf_turnstile_page(driver):
return
elif ctype == "g_rc":
if not _on_a_g_recaptcha_page(driver):
return
else:
if _on_a_g_recaptcha_page(driver):
ctype = "g_rc"
elif _on_a_cf_turnstile_page(driver):
ctype = "cf_t"
else:
return
install_pyautogui_if_missing(driver) install_pyautogui_if_missing(driver)
import pyautogui import pyautogui
pyautogui = get_configured_pyautogui(pyautogui) pyautogui = get_configured_pyautogui(pyautogui)
@ -988,7 +1003,10 @@ def uc_gui_handle_cf(driver, frame="iframe"):
with gui_lock: # Prevent issues with multiple processes with gui_lock: # Prevent issues with multiple processes
needs_switch = False needs_switch = False
is_in_frame = js_utils.is_in_frame(driver) is_in_frame = js_utils.is_in_frame(driver)
if is_in_frame and driver.is_element_present("#challenge-stage"): selector = "#challenge-stage"
if ctype == "g_rc":
selector = "#recaptcha-token"
if is_in_frame and driver.is_element_present(selector):
driver.switch_to.parent_frame() driver.switch_to.parent_frame()
needs_switch = True needs_switch = True
is_in_frame = js_utils.is_in_frame(driver) is_in_frame = js_utils.is_in_frame(driver)
@ -997,67 +1015,77 @@ def uc_gui_handle_cf(driver, frame="iframe"):
page_actions.switch_to_window( page_actions.switch_to_window(
driver, driver.current_window_handle, 2, uc_lock=False driver, driver.current_window_handle, 2, uc_lock=False
) )
if ( if ctype == "cf_t":
driver.is_element_present(".cf-turnstile-wrapper iframe") if (
or driver.is_element_present( driver.is_element_present(".cf-turnstile-wrapper iframe")
'[data-callback="onCaptchaSuccess"] iframe' or driver.is_element_present(
) '[data-callback="onCaptchaSuccess"] iframe'
):
pass
else:
visible_iframe = False
if driver.is_element_present(".cf-turnstile-wrapper"):
frame = ".cf-turnstile-wrapper"
elif driver.is_element_present(
'[data-callback="onCaptchaSuccess"]'
):
frame = '[data-callback="onCaptchaSuccess"]'
elif (
driver.is_element_present('[name*="cf-turnstile-"]')
and driver.is_element_present("div.spacer div[style]")
):
frame = "div.spacer div[style]"
elif (
(
driver.is_element_present('[name*="cf-turnstile-"]')
or driver.is_element_present('[id*="cf-turnstile-"]')
)
and driver.is_element_present(
'form div div[style*="margin"][style*="padding"]'
) )
): ):
frame = 'form div div[style*="margin"][style*="padding"]' pass
elif (
(
driver.is_element_present('[name*="cf-turnstile-"]')
or driver.is_element_present('[id*="cf-turnstile-"]')
)
and driver.is_element_present(
'div > div > [style*="margin"][style*="padding"]'
)
):
frame = 'div > div > [style*="margin"][style*="padding"]'
else: else:
return visible_iframe = False
if driver.is_element_present(".cf-turnstile-wrapper"):
frame = ".cf-turnstile-wrapper"
elif driver.is_element_present(
'[data-callback="onCaptchaSuccess"]'
):
frame = '[data-callback="onCaptchaSuccess"]'
elif (
driver.is_element_present('[name*="cf-turnstile-"]')
and driver.is_element_present("div.spacer div[style]")
):
frame = "div.spacer div[style]"
elif (
(
driver.is_element_present('[name*="cf-turnstile-"]')
or driver.is_element_present('[id*="cf-turnstile-"]')
)
and driver.is_element_present(
'form div div[style*="margin"][style*="padding"]'
)
):
frame = 'form div div[style*="margin"][style*="padding"]'
elif (
(
driver.is_element_present('[name*="cf-turnstile-"]')
or driver.is_element_present('[id*="cf-turnstile-"]')
)
and driver.is_element_present(
'div > div > [style*="margin"][style*="padding"]'
)
):
frame = 'div > div > [style*="margin"][style*="padding"]'
else:
return
else:
if (
driver.is_element_present('iframe[title="reCAPTCHA"]')
and frame == "iframe"
):
frame = 'iframe[title="reCAPTCHA"]'
if not is_in_frame or needs_switch: if not is_in_frame or needs_switch:
# Currently not in frame (or nested frame outside CF one) # Currently not in frame (or nested frame outside CF one)
try: try:
if visible_iframe: if visible_iframe or ctype == "g_rc":
driver.switch_to_frame(frame) driver.switch_to_frame(frame)
except Exception: except Exception:
if visible_iframe: if visible_iframe or ctype == "g_rc":
if driver.is_element_present("iframe"): if driver.is_element_present("iframe"):
driver.switch_to_frame("iframe") driver.switch_to_frame("iframe")
else: else:
return return
try: try:
selector = "div.cf-turnstile"
if ctype == "g_rc":
selector = "span#recaptcha-anchor"
found_checkbox = False found_checkbox = False
for i in range(24): for i in range(24):
pyautogui.press("\t") pyautogui.press("\t")
time.sleep(0.02) time.sleep(0.02)
active_element_css = js_utils.get_active_element_css(driver) active_element_css = js_utils.get_active_element_css(driver)
if ( if (
active_element_css.startswith("div.cf-turnstile") active_element_css.startswith(selector)
or active_element_css.endswith(" > div" * 2) or active_element_css.endswith(" > div" * 2)
): ):
found_checkbox = True found_checkbox = True
@ -1081,6 +1109,18 @@ def uc_gui_handle_cf(driver, frame="iframe"):
driver.reconnect(reconnect_time) driver.reconnect(reconnect_time)
def uc_gui_handle_captcha(driver, frame="iframe"):
_uc_gui_handle_captcha(driver, frame=frame, ctype=None)
def uc_gui_handle_cf(driver, frame="iframe"):
_uc_gui_handle_captcha(driver, frame=frame, ctype="cf_t")
def uc_gui_handle_rc(driver, frame="iframe"):
_uc_gui_handle_captcha(driver, frame=frame, ctype="g_rc")
def uc_switch_to_frame(driver, frame="iframe", reconnect_time=None): def uc_switch_to_frame(driver, frame="iframe", reconnect_time=None):
from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.remote.webelement import WebElement
if isinstance(frame, WebElement): if isinstance(frame, WebElement):
@ -4421,21 +4461,31 @@ def get_local_driver(
driver, *args, **kwargs driver, *args, **kwargs
) )
) )
driver.uc_gui_click_rc = (
lambda *args, **kwargs: uc_gui_click_rc(
driver, *args, **kwargs
)
)
driver.uc_gui_click_cf = ( driver.uc_gui_click_cf = (
lambda *args, **kwargs: uc_gui_click_cf( lambda *args, **kwargs: uc_gui_click_cf(
driver, *args, **kwargs driver, *args, **kwargs
) )
) )
driver.uc_gui_click_rc = (
lambda *args, **kwargs: uc_gui_click_rc(
driver, *args, **kwargs
)
)
driver.uc_gui_handle_captcha = (
lambda *args, **kwargs: uc_gui_handle_captcha(
driver, *args, **kwargs
)
)
driver.uc_gui_handle_cf = ( driver.uc_gui_handle_cf = (
lambda *args, **kwargs: uc_gui_handle_cf( lambda *args, **kwargs: uc_gui_handle_cf(
driver, *args, **kwargs driver, *args, **kwargs
) )
) )
driver.uc_gui_handle_rc = (
lambda *args, **kwargs: uc_gui_handle_rc(
driver, *args, **kwargs
)
)
driver.uc_switch_to_frame = ( driver.uc_switch_to_frame = (
lambda *args, **kwargs: uc_switch_to_frame( lambda *args, **kwargs: uc_switch_to_frame(
driver, *args, **kwargs driver, *args, **kwargs

View File

@ -4246,12 +4246,16 @@ class BaseCase(unittest.TestCase):
self.uc_gui_click_x_y = new_driver.uc_gui_click_x_y self.uc_gui_click_x_y = new_driver.uc_gui_click_x_y
if hasattr(new_driver, "uc_gui_click_captcha"): if hasattr(new_driver, "uc_gui_click_captcha"):
self.uc_gui_click_captcha = new_driver.uc_gui_click_captcha self.uc_gui_click_captcha = new_driver.uc_gui_click_captcha
if hasattr(new_driver, "uc_gui_click_rc"):
self.uc_gui_click_rc = new_driver.uc_gui_click_rc
if hasattr(new_driver, "uc_gui_click_cf"): if hasattr(new_driver, "uc_gui_click_cf"):
self.uc_gui_click_cf = new_driver.uc_gui_click_cf self.uc_gui_click_cf = new_driver.uc_gui_click_cf
if hasattr(new_driver, "uc_gui_click_rc"):
self.uc_gui_click_rc = new_driver.uc_gui_click_rc
if hasattr(new_driver, "uc_gui_handle_captcha"):
self.uc_gui_handle_captcha = new_driver.uc_gui_handle_captcha
if hasattr(new_driver, "uc_gui_handle_cf"): if hasattr(new_driver, "uc_gui_handle_cf"):
self.uc_gui_handle_cf = new_driver.uc_gui_handle_cf self.uc_gui_handle_cf = new_driver.uc_gui_handle_cf
if hasattr(new_driver, "uc_gui_handle_rc"):
self.uc_gui_handle_rc = new_driver.uc_gui_handle_rc
if hasattr(new_driver, "uc_switch_to_frame"): if hasattr(new_driver, "uc_switch_to_frame"):
self.uc_switch_to_frame = new_driver.uc_switch_to_frame self.uc_switch_to_frame = new_driver.uc_switch_to_frame
return new_driver return new_driver