在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
<html>
<body>
...
<iframe id="x-URS-iframe" ...>
<html>
<body>
...
<input name="email" >
126邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.126.com")
driver.switch_to.frame('x-URS-iframe')
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()
driver.quit()
switch_to.frame()
默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。
……
#先通过xpth定位到iframe
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
#再将定位对象传给switch_to.frame()方法
driver.switch_to.frame(xf)
……
driver.switch_to.parent_frame()
除此之外,在进入多级表单的情况下,还可以通过switch_to.default_content()
跳回最外层的页面。
from selenium import webdriver from time import sleep
driver = webdriver.Chrome() driver.get("http://www.126.com") sleep(3) driver.find_element_by_id("switchAccountLogin").click() # 找到密码登录按钮按下 sleep(3)
i=driver.find_element_by_id("") 由于定位的id是随机,故不可用,直接定位frame(0)即第一个frame
driver.switch_to.frame(0) sleep(3) driver.find_element_by_name("email").clear() driver.find_element_by_name("email").send_keys("username") driver.find_element_by_name("password").clear() driver.find_element_by_name("password").send_keys("password") driver.find_element_by_id("dologin").click() driver.switch_to.default_content()
在进入多级表单的情况下,可以通过switch_to.default_content()跳回最外层的页面
sleep(3) driver.quit()
jayunq 创建于 2019-06-07 00:20:02
虫师您好,非常感谢您写的这篇文章。
云天 创建于 2019-03-13 01:24:21
现在iframe会带上每次打开自动变化的ID,我用上面的方法都报错。
--这方法可以定位到-- i=driver.find_element_by_tag_name("iframe") driver.switch_to_frame(i) --这方法可以定位到--
感谢大大分享教程
richjack888 创建于 2018-12-29 15:52:45