我切换到带有硒的框架内的帧,我访问了该帧,但我无法使用find_element_by_tag_name
或find_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,因此我们不知道该元素是否存在,但如果是,您可以尝试等待它加载。这里解释