zoukankan      html  css  js  c++  java
  • 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,'待办办理')]")));
     
  • 相关阅读:
    hdu 3790 最短路径问题
    hdu 2112 HDU Today
    最短路问题 以hdu1874为例
    hdu 1690 Bus System Floyd
    hdu 2066 一个人的旅行
    hdu 2680 Choose the best route
    hdu 1596 find the safest road
    hdu 1869 六度分离
    hdu 3339 In Action
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/yongzhou/p/14793043.html
Copyright © 2011-2022 走看看