如何使用 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_name
或 find_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
解决方案
您可以使用以下 xpath 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
我用 selenium 切换到框架内的框架,我访问了该框架,但我无法使用 find_element_by_tag_name
或 find_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
解决方案
您可以使用以下 xpath 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