@@ -791,10 +791,10 @@ def click_active_element(self):
791791 self .__slow_mode_pause_if_set ()
792792 self .loop .run_until_complete (self .page .wait ())
793793
794- def click_if_visible (self , selector ):
794+ def click_if_visible (self , selector , timeout = 0 ):
795795 if self .is_element_visible (selector ):
796796 with suppress (Exception ):
797- element = self .find_element (selector , timeout = 0 )
797+ element = self .find_element (selector , timeout = timeout )
798798 element .scroll_into_view ()
799799 element .click ()
800800 self .__slow_mode_pause_if_set ()
@@ -1969,6 +1969,12 @@ def _on_a_cf_turnstile_page(self, source=None):
19691969 return True
19701970 return False
19711971
1972+ def _on_an_incapsula_hcaptcha_page (self , * args , ** kwargs ):
1973+ self .loop .run_until_complete (self .page .wait ())
1974+ if self .is_element_visible ('iframe[src*="_Incapsula_Resource?"]' ):
1975+ return True
1976+ return False
1977+
19721978 def _on_a_g_recaptcha_page (self , * args , ** kwargs ):
19731979 time .sleep (0.4 ) # reCAPTCHA may need a moment to appear
19741980 self .loop .run_until_complete (self .page .wait ())
@@ -1999,20 +2005,34 @@ def __gui_click_recaptcha(self, use_cdp=False):
19992005 if self .is_element_visible ('iframe[title="reCAPTCHA"]' ):
20002006 selector = 'iframe[title="reCAPTCHA"]'
20012007 else :
2002- return
2008+ return False
20032009 time .sleep (0.25 )
20042010 self .loop .run_until_complete (self .page .wait ())
20052011 time .sleep (0.25 )
20062012 with suppress (Exception ):
2007- element_rect = self .get_gui_element_rect (selector , timeout = 1 )
2013+ element_rect = self .get_element_rect (selector , timeout = 0. 1 )
20082014 e_x = element_rect ["x" ]
20092015 e_y = element_rect ["y" ]
2016+ window_rect = self .get_window_rect ()
2017+ win_width = window_rect ["innerWidth" ]
2018+ win_height = window_rect ["innerHeight" ]
2019+ if (
2020+ e_x > 1040
2021+ and e_y > 640
2022+ and abs (win_width - e_x ) < 110
2023+ and abs (win_height - e_y ) < 110
2024+ ):
2025+ # Probably the invisible reCAPTCHA in the bottom right corner
2026+ return False
2027+ gui_element_rect = self .get_gui_element_rect (selector , timeout = 1 )
2028+ gui_e_x = gui_element_rect ["x" ]
2029+ gui_e_y = gui_element_rect ["y" ]
20102030 x_offset = 26
20112031 y_offset = 35
20122032 if shared_utils .is_windows ():
20132033 x_offset = 29
2014- x = e_x + x_offset
2015- y = e_y + y_offset
2034+ x = gui_e_x + x_offset
2035+ y = gui_e_y + y_offset
20162036 sb_config ._saved_cf_x_y = (x , y )
20172037 time .sleep (0.08 )
20182038 if use_cdp :
@@ -2025,6 +2045,33 @@ def __gui_click_recaptcha(self, use_cdp=False):
20252045 time .sleep (0.056 )
20262046 else :
20272047 self .gui_click_x_y (x , y )
2048+ return True
2049+ return False
2050+
2051+ def __cdp_click_incapsula_hcaptcha (self ):
2052+ selector = None
2053+ if self .is_element_visible ('iframe[src*="_Incapsula_Resource?"]' ):
2054+ outer_selector = 'iframe[src*="_Incapsula_Resource?"]'
2055+ selector = "iframe[data-hcaptcha-widget-id]"
2056+ element = self .get_nested_element (outer_selector , selector )
2057+ if not element :
2058+ return False
2059+ else :
2060+ return False
2061+ time .sleep (0.05 )
2062+ self .loop .run_until_complete (self .page .wait ())
2063+ time .sleep (0.05 )
2064+ x_offset = 30
2065+ y_offset = 36
2066+ gui_lock = FileLock (constants .MultiBrowser .PYAUTOGUILOCK )
2067+ with gui_lock : # Prevent issues with multiple processes
2068+ self .bring_active_window_to_front ()
2069+ time .sleep (0.05 )
2070+ with suppress (Exception ):
2071+ element .click_with_offset (x_offset , y_offset )
2072+ time .sleep (0.2 )
2073+ return True
2074+ return False
20282075
20292076 def solve_captcha (self ):
20302077 self .__click_captcha (use_cdp = True )
@@ -2046,10 +2093,13 @@ def __click_captcha(self, use_cdp=False):
20462093 if self ._on_a_cf_turnstile_page (source ):
20472094 pass
20482095 elif self ._on_a_g_recaptcha_page (source ):
2049- self .__gui_click_recaptcha (use_cdp )
2050- return
2096+ result = self .__gui_click_recaptcha (use_cdp )
2097+ return result
2098+ elif self ._on_an_incapsula_hcaptcha_page ():
2099+ result = self .__cdp_click_incapsula_hcaptcha ()
2100+ return result
20512101 else :
2052- return
2102+ return False
20532103 selector = None
20542104 if self .is_element_present ('[class="cf-turnstile"]' ):
20552105 selector = '[class="cf-turnstile"]'
@@ -2085,6 +2135,10 @@ def __click_captcha(self, use_cdp=False):
20852135 '[class*="turnstile"] div:not([class])'
20862136 ):
20872137 selector = '[class*="turnstile"] div:not([class])'
2138+ elif self .is_element_present (
2139+ "iframe[data-hcaptcha-widget-id]"
2140+ ):
2141+ selector = "iframe[data-hcaptcha-widget-id]"
20882142 elif self .is_element_present (
20892143 '[data-callback="onCaptchaSuccess"]'
20902144 ):
@@ -2094,9 +2148,9 @@ def __click_captcha(self, use_cdp=False):
20942148 ):
20952149 selector = "div:not([class]) > div:not([class])"
20962150 else :
2097- return
2151+ return False
20982152 if not selector :
2099- return
2153+ return False
21002154 if (
21012155 self .is_element_present ("form" )
21022156 and (
@@ -2204,6 +2258,8 @@ def __click_captcha(self, use_cdp=False):
22042258 time .sleep (0.05 )
22052259 else :
22062260 self .gui_click_x_y (x , y )
2261+ return True
2262+ return False
22072263
22082264 def __gui_drag_drop (self , x1 , y1 , x2 , y2 , timeframe = 0.25 , uc_lock = False ):
22092265 self .__install_pyautogui_if_missing ()
0 commit comments