如何使用Selenium和Python在reCAPTCHA演示页面上查找多个帧中的多个元素并与之交互



我切换到带有硒的框架内的帧,我访问了该帧,但我无法使用find_element_by_tag_namefind_element_by_xpath在帧内找到元素,我确定该元素存在,但我找不到它并用硒单击它。

页面> 框架 1(元素:复选框(> 框架 2(元素:图像、按钮(

框架 2中有按钮我想单击它,单击复选框后显示框架 2。这是我的代码:

driver = webdriver.Firefox(r"C:Users[profilename]Desktopdevloperseleniumgecko")
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()

错误消息:

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

我使用了find_element_by_tag_name,在此之前我尝试了XPATH,它有同样的错误。

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

网址是:reCAPTCHA演示

reCAPTCHA 演示页面中的复选框元素位于<iframe>内,因此要在复选框上调用click(),您必须:

  • 诱导WebDriver等待所需的frame_to_be_available_and_switch_to_it()

接下来,单击"提交">按钮:

  • 您需要切换到default_content
  • 诱导WebDriver等待所需的element_to_be_clickable()

溶液

您可以使用以下基于 xpath 的定位器策略:

  • 代码块:

    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
    

引用

您可以在以下位置找到一些相关的讨论:

  • 多个 iframe 标签 Selenium 网络驱动程序

更新

根据您最近的评论更新此元素,我想单击//*[@id="recaptcha-audio-button"] 单击reCAPTCHA 音频按钮,您可以使用以下定位器策略

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,因此我们不知道该元素是否存在,但如果是,您可以尝试等待它加载。这里解释

最新更新