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

问题描述 投票:0回答:2

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

页面> 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,但它有相同的错误。

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

URL为:reCAPTCHA demo

python selenium iframe recaptcha webdriverwait
2个回答
0
投票

由于您尚未发布url,因此我们不知道该元素是否存在,但是如果是,则可以尝试等待其加载。解释了here


0
投票

reCAPTCHA demo页面中的checkbox元素在<iframe>内,因此要在checkbox上调用click(),您必须:

  • WebDriverWait表示为所需的frame_to_be_available_and_switch_to_it()

下一步,单击提交按钮:


解决方案

您可以使用以下基于element_to_be_clickable()

  • 代码块:

    Locator Strategies
  • :您必须添加以下导入:

    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音频按钮,您可以使用以下定位器策略

Multiple iframe tags Selenium webdriver

您可以在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() 中找到相关的详细讨论

© www.soinside.com 2019 - 2024. All rights reserved.