显式等待被绕过而不会出错 Selenium Python

问题描述

我正在尝试制作一个登录我帐户的机器人。 插入密码和用户名后,我让我的机器人点击“我不是机器人”recaptcha 复选框。

标记 Recaptcha 复选框后,它可能会随机出现第二个 Recaptcha,这次是带有图像的。好吧,我可以通过使用音频到文本的方法解决它。问题是这个 Recaptcha 随机出现。

我使用了显式等待,但它被绕过并且没有给我任何错误

这是我的代码

#solve first recaptcha (I'm not a robot)
driver.switch_to_frame(element)                   #element = captcha frame already found
recaptcha = driver.find_element_by_xpath('//*[@id="recaptcha-anchor"]/div[1]')
driver.execute_script("arguments[0].click();",recaptcha)
_delay()

driver.switch_to_default_content()

#if an image captcha frame appears click on the audio button 

try:
    recaptcha_frame = webdriverwait(driver,10).until(
        EC.presence_of_element_located((By.XPATH,'/html/body/div/div/div[3]/div[2]/div[1]'))).find_element_by_tag_name('iframe') #locating the recaptcha image frame
        
    driver.switch_to_frame(recaptcha_frame)
    audio_button = driver.find_element_by_class_name('rc-button goog-inline-block rc-button-audio')
    driver.execute_script("arguments[0].click();",audio_button)
  
except:
    pass

如果我使用 driver.quit() 而不是 pass 它会关闭会话。我的目标是点击audio_button。想知道为什么这种显式等待不起作用吗?

解决方法

如果您已经使用隐式等待,我认为您不需要使用显式等待。这可能是第一个问题。对于 implicit wait,代码应该类似于:

try:
    recaptcha = driver.find_elements_by_xpath("Your recaptcha_frame stable xpath")
    recaptcha.click()
except NoSuchElementException:
    pass

另外,/html/body/div/div/div[3]/div[2]/div[1] 不是可靠的定位器。将其更改为稳定的。在您的代码中,如果找不到此定位器,则不会发生任何事情。使用更好的异常类型来了解原因。 如果您使用显式等待,请尝试将 presence_of_element_located 更改为 visibility_of_element_located

但是,定位器仍然是您代码中的主要问题。

另外,我怀疑您是否能够通过 recaptcha。