找到 reCAPTCHA 元素并点击它——Python + Selenium

Posted

技术标签:

【中文标题】找到 reCAPTCHA 元素并点击它——Python + Selenium【英文标题】:Find the reCAPTCHA element and click on it -- Python + Selenium 【发布时间】:2019-05-23 20:05:09 【问题描述】:

我需要一些帮助。 有网址:https://www.inipec.gov.it/cerca-pec/-/pecs/companies。 我需要单击复选框验证码:

我的代码是这样的:

import os, urllib.request, requests, datetime, time, random, ssl, json, codecs, csv, urllib
from urllib.request import Request, urlopen
from urllib.request import urlretrieve
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.chrome.options import Options

chromedriver = "chromedriver"
os.environ["webdriver.chrome.driver"] = chromedriver
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(executable_path=chromedriver, chrome_options=chrome_options)
driver.get("https://www.inipec.gov.it/cerca-pec/-/pecs/companies")
driver.switch_to_default_content()
element = driver.find_elements_by_css_selector('iframe')[1]
driver.switch_to_frame(element)

driver.find_elements_by_xpath('//*[@id="recaptcha-anchor"]/div[1]').click()

执行过程中出现错误:

driver.find_elements_by_xpath('//*[@id="recaptcha-anchor"]/div1').click() AttributeError: 'list' 对象没有属性 'click'

请帮忙解决一下。

【问题讨论】:

单个网页元素需要使用find_element_by_xpath 【参考方案1】:

解决方案更新(2020 年 2 月 11 日)

使用以下二进制文件集:

Selenium v​​3.141.0 ChromeDriver v80.0 Chrome 版本 80.0

您可以使用以下更新的代码块作为解决方案:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.get("https://www.inipec.gov.it/cerca-pec/-/pecs/companies")
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name^='a-'][src^='https://www.google.com/recaptcha/api2/anchor?']")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@id='recaptcha-anchor']"))).click()

原方案

在 URL https://www.inipec.gov.it/cerca-pec/-/pecs/companies 中调用 reCAPTCHA 复选框上的 click(),您需要:

诱导 WebDriverWait 使所需的框架可用并切换到它。 诱导 WebDriverWait 使所需的元素可点击

您可以使用以下解决方案:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver = webdriver.Chrome(executable_path=r'C:\WebDrivers\chromedriver.exe', chrome_options=options)
driver.get("https://www.inipec.gov.it/cerca-pec/-/pecs/companies")
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name^='a-'][src^='https://www.google.com/recaptcha/api2/anchor?']")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='recaptcha-checkbox goog-inline-block recaptcha-checkbox-unchecked rc-anchor-checkbox']/div[@class='recaptcha-checkbox-checkmark']"))).click()

【讨论】:

@MobrineHayde 查看更新后的答案并告诉我状态。 还是不行:ElementClickInterceptedException: Message: element click intercepted: Element <iframe>..</iframe> is not clickable at point (277, 36). Other element would receive the click @AbdulKarim 最后一行尝试driver.execute_script("arguments[0].click();", WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='recaptcha-checkbox goog-inline-block recaptcha-checkbox-unchecked rc-anchor-checkbox']/div[@class='recaptcha-checkbox-checkmark']")))) 单击 Selenium 复选框时,您是否获得了额外的图像识别验证码?我觉得奇怪的是,当我使用常规 Chrome 浏览器单击时不会发生这种情况,而使用 Selenium 总是会发生这种情况。 这个解决方案似乎不适用于验证码 v3。有什么出路吗?在这种情况下没有可点击的范围。

以上是关于找到 reCAPTCHA 元素并点击它——Python + Selenium的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium 和 Java 点击 reCAPTCHA

SweetAlert提示中的Google reCaptcha

Recaptcha 在页面上创建 iFrame,破坏样式

reCAPTCHA v3 - 错误:没有reCAPTCHA客户端

验证 Recaptcha 后禁用提交

未捕获(承诺中)错误:reCAPTCHA 已在此元素中呈现