如何使用Selenium和Python在reCAPTCHA演示页面上找到多个框架内的多个元素并与之交互。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Selenium和Python在reCAPTCHA演示页面上找到多个框架内的多个元素并与之交互。相关的知识,希望对你有一定的参考价值。

我换到了一个框架里面的硒,我访问到了那个框架,但是我无法找到框架里面的元素,用 find_element_by_tag_namefind_element_by_xpath我确信这个元素是存在的,但我找不到它,也无法用硒来点击它。

page > frame1(elements: checkbox) > frame2(elements: imgs , buttons)

在frame2中有一些按钮,我想点击它,点击复选框后frame2显示。这是我的代码。

driver = webdriver.Firefox(r"C:\Users\[profilename]\Desktop\devloper\selenium\gecko")
driver.get(url)

sleep(10) #to make sure that everything loaded

#the first frame (success to access and clicked):
driver.switch_to.frame(0) 
click1 = driver.find_element_by_xpath("//*[@id=\"anchor\"]")
click1.click()

sleep(5) #to make sure that everything loaded

iframe = driver.find_element_by_tag_name("iframe")
driver.switch_to.frame(iframe)

sleep(3)

frame2_element = driver.find_element_by_tag_name("button")
frame2_element.click()

错误的msg:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element

我使用了 find_element_by_tag_name 在这之前,我试过XPATH,但也有同样的错误。

我努力解释一切,我不善于向人们解释事情,所以我希望你能理解我,并请告诉我该怎么做:( 。

网址是 。reCAPTCHA演示

答案

复选框 元素与 reCAPTCHA演示 页面在一个 <iframe> 以此来调用 click() 在...上 复选框 你必须。

  • 诱导 WebDriverWait 为所欲为 frame_to_be_available_and_switch_to_it().

接下来,要点击 提交 按钮。


解决办法

您可以使用以下方法 基于 定位策略:

  • 代码块。

    driver.get("https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox-explicit.php")
    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@src, 'https://www.google.com/recaptcha/api2/anchor')]")))
    WebDriverWait(driver, 20).until(EC.invisibility_of_element_located((By.XPATH, "//div[@class='recaptcha-checkbox-spinner-overlay']")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='recaptcha-checkbox-border']"))).click()
    driver.switch_to.default_content()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='form-field']"))).click()
    
  • : 你必须添加以下导入。

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

引用

你可以在以下几个相关讨论中找到。


更新

根据你最近的评论更新 我要点击的这个元素 /*[@id="recaptcha-audio-button"] 点击 重新验证码音频按钮 您可以使用以下方法 定位策略:

driver.switch_to.default_content()
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[title='recaptcha challenge']")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#recaptcha-audio-button"))).click()

你可以在以下网站找到相关的详细讨论 如何使用Selenium和Python点击iframe中的元素,通过音频启用验证码。

另一答案

由于你没有发布url,我们不知道该元素是否存在,但如果存在,你可以尝试等待它加载。它的解释是 此处

以上是关于如何使用Selenium和Python在reCAPTCHA演示页面上找到多个框架内的多个元素并与之交互。的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Selenium和Python在网站内的页面中导航?

装饰器(Decorator)模式Recap

如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]

如何使用Python和Selenium分页来抓取页面

如何使用 Selenium 和 Python 在 Python 类中调用方法

如何使用 Selenium 和 Python 在控制台中跳过调试日志