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

How to find and interact with multiple elements within multiple frames on reCAPTCHA demo page using Selenium and Python

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

页面> frame1(元素:复选框)> frame2(元素:imgs,按钮)

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()

错误信息:

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

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

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

The url is : reCAPTCHA demo

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

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

  • 为所需的 frame_to_be_available_and_switch_to_it().
  • 引入 WebDriverWait

接下来,单击 提交 按钮:

  • 你需要
  • 为所需的 element_to_be_clickable().
  • 引入 WebDriverWait

解决方案

您可以使用以下 based :

  • 代码块:

    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"] 点击 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()

You can find a relevant detailed discussion in How to click on elements within an iframe to enable the captcha through the audio using Selenium and Python