51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 7834|回复: 0
打印 上一主题 下一主题

[原创] Selenium关于Frame跳转问题的解决方法

[复制链接]
  • TA的每日心情
    擦汗
    7 天前
  • 签到天数: 1027 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-3-25 11:20:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1测试积点
    当谈到Web端自动化测试时,首先想到的是什么?毋庸置疑是Selenium。毫不夸张地说,Selenium引领着界面测试自动化领域。使用过Selenium的人都了解,当一个元素嵌套在多层Frame中时,需从主页面一层一层切到元素所在的Frame,才能查找到该元素。而一般的录制工具在采集元素的定位信息时,只能采集到它的父级Frame,甚至采集不到Frame信息。如果让测试人员手动从源码中寻找所有父级Frame信息,可能他以后再也不想做界面自动化测试了。
      假设元素只有自身的定位信息,如何准确找到该元素?笔者反复思考、查找资料,使用递归遍历算法解决了此问题。下面带您一步一步解析。
      Frame标签有FrameSet、Frame、iFrame三种。FrameSet跟其他普通标签没有区别,不会影响到正常的定位。Frame与iFrame对Selenium而言是一样的,下面笔者统一称之为Frame。

      一、怎么切到Frame中?
      Selenium提供了SwitchTo().Frame(ref),ref是传入的参数,可以传入id、name、index以及Selenium的WebElement对象,用来定位Frame。下面举例说明,假设有如下HTML代码:
    <Frame src="a.html" id="frame1" name="myframe"></Frame>


      想要定位其中的Frame并切进去,可以通过如下代码:
      1.用index来定位,第一个是0
    driver.SwitchTo().Frame(0);


      2.用id来定位
    driver.SwitchTo().Frame("frame1");


      3.用name来定位
    driver.SwitchTo().Frame("myframe");


      4.用WebElement对象来定位
    driver.SwitchTo().Frame(driver.FindElement(By.TagName("Frame")));


      二、怎么从Frame切回主文档?
      切到Frame之后,便不能操作主文档的元素,此时如果想操作主文档内容,则需使用SwitchTo().DefaultContent()切回主文档。

      三、怎么对嵌套的Frame操作?
      有时候我们会遇到嵌套的Frame,如下:
    <Frame id="frame1">
    <Frame id="frame2" />
    <Frame id="frame3" />
    </Frame>




      1.从主文档切到frame2,需要一层一层切进去
    driver.SwitchTo().Frame("frame1");
    driver.SwitchTo().Frame("frame2");




      2.从frame2切到frame1,可使用
    driver.SwitchTo().ParentFrame();


      3.从frame2切到frame3,有两种方式
      第一种,先切回主文档,再一层一层切进frame3
    driver.SwitchTo().DefaultContent();
    driver.SwitchTo().Frame("frame1");
    driver.SwitchTo().Frame("frame3");



      第二种,从frame2切回frame1再切到frame3
    driver.SwitchTo().ParentFrame();
    driver.SwitchTo().Frame("frame3");




      有了上述三种操作后,我们在递归算法中,就可以遍历主页面下所有的Frame,在每个Frame中查找元素。
      算法设计如下图所示:


      1、从主页面直接使用元素的自身定位来查找元素,若定位到元素,则退出;若未定位到元素,则进入递归查找。
      2、遍历主页面下第一层Frame,切到Frame后,查找元素,若定位到元素则退出;若未定位到元素,则遍历该Frame下所有子级Frame,依次类推。每层Frame查找自身及所有子孙Frame后,使用driver.SwitchTo().ParentFrame()跳出当前Frame,可再切换到它的兄弟Frame中继续进行查找。
      综上所述,笔者已将此算法介绍完毕,亲测可用,在使用时,测试人员可以不积累元素的Frame信息,也能定位到该元素,再也不用担心Frame的跳转问题了。笔者会在下一篇文章中介绍,在当前文档内如何精确定位元素。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-10-7 06:41 , Processed in 0.067589 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表