iframe的切换

Selenium 多表单(frame/iframe)切换

 

frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe需要切换进去才能定位到其中的元素

比如下面这个网页,有多个frame,以及嵌套iframe,我们在操作里面元素时,需要切换进去。

登陆后,我们要切换进leftFrame进行操作

代码:

复制代码
# coding = utf-8
from selenium import webdriver
# 驱动文件路径
driverfile_path = r'D:coshipTest_FrameworkdriversIEDriverServer.exe'
# 启动浏览器
driver = webdriver.Ie(executable_path=driverfile_path)
# 打开网页
driver.get(r'http://172.21.13.83:28080/')
# 登录
driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")
driver.find_element_by_css_selector("[name='admin.password']").send_keys("111111")
driver.find_element_by_css_selector("input#imageField").click()
# 进入leftFrame
driver.switch_to.frame("leftFrame")
# 点击链接
driver.find_element_by_css_selector("a[title='媒资编辑']").click()
# 退出
driver.quit()
复制代码

switch_to.frame()默认可以直接使用表单(frame/iframe)的id或name属性。如果表单没有id和name属性,可以使用元素定位方法先找到这个表单,再切换进去

# 先定位到leftFrame
leftframe = driver.find_element_by_css_selector("frameset#switchFrame>frame")
# 切换进leftFrame
driver.switch_to.frame(leftframe)

假如在leftFrame中操作完成后,我们还需要进入mainFrame操作元素。这就就要先退出leftFrame,回到主页,再进入mainFrame

复制代码
# 进入leftFrame
driver.switch_to.frame("leftFrame")
# 点击链接
driver.find_element_by_css_selector("a[title='媒资编辑']").click()
# 跳出leftFrame,回到主页
driver.switch_to.default_content()
# 进入mainFrame
driver.switch_to.frame("mainFrame")
# 点击导入
driver.find_element_by_link_text("导入").click()
复制代码

switch_to.default_content()是跳回最外层页面。

如果进入了多层frame,我们只是想回到上一个frame,可以用

driver.switch_to.parent_frame()

----------------------------------------

 b/s架构都使用iframe,官方的定义是这样的:【iframe 元素会创建包含另外一个文档的内联框架(即行内框架)】。什么意思呢,就像是我们的某个主页,里面有好多小模块,每个小模块用这个叫做iframe的东西分开来,方便维护,也方便开发各自开发各自的部分,互不相干。

 
     那么,问题来了。要是我们元素不在同一个iframe应该怎么办呢?
     通常不在同一个iframe分为两种情况:一种是包含,一种是平级。
 
①.包含关系之父iframe中切换到子iframe中
    直接用【driver.switchTo().frame("子");】即可,其中"子"是这个iframe的id或者name属性。
②.包含关系之子iframe切换到父iframe中(或者平级间的切换都是如此)
   【driver.switchTo().frame("子");】——切换到子iframe
   【driver.switchTo().defaultContent();】——切换到切换子iframe之前的位置
   【driver.switchTo().frame("父");】——切换到父iframe
 
    切换iframe还会碰到以下几种问题:
①.iframe没有id和name
    driver.findElement(By.tagName("iframe"));
②.iframe没有name,且id是可变的,可用iframe包含的固定关键字查找
   driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'待办办理')]")));
 
原文地址:https://www.cnblogs.com/yongzhou/p/14793043.html