• 13
  • 13
分享
  • Selenium关于Frame跳转问题的解决方法——软件测试圈
  • 曼倩诙谐 2021-04-15 10:14:29 字数 1869 阅读 2279 收藏 13

  当谈到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.png

  1、从主页面直接使用元素的自身定位来查找元素,若定位到元素,则退出;若未定位到元素,则进入递归查找。

  2、遍历主页面下第一层Frame,切到Frame后,查找元素,若定位到元素则退出;若未定位到元素,则遍历该Frame下所有子级Frame,依次类推。每层Frame查找自身及所有子孙Frame后,使用driver.SwitchTo().ParentFrame()跳出当前Frame,可再切换到它的兄弟Frame中继续进行查找。

  综上所述,笔者已将此算法介绍完毕,亲测可用,在使用时,测试人员可以不积累元素的Frame信息,也能定位到该元素,再也不用担心Frame的跳转问题了。笔者会在下一篇文章中介绍,在当前文档内如何精确定位元素。


作者:田利娟 侯健琦   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   框架介绍  1、HttpRunner  是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份YAML/JSON脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。  2、Locust  Locust是一款易于使用的分布式用户负载测试工具。它用于对网站(或其他系统)进行负载测试,并确定系统可以处理多少并发用户。HttpRunner 通过复用Locust ,可以在无需对 YAML/JSON 进行任何修改的情况下,直接运行性能测试。  3、 httprunner使用手册  附httprunner中文使用文档地址:cn.httprunner.org/  环境安装  1...
            2 2 1868
            分享
          •   测试工作中,新人对于测试流程、测试方法都有可以直接拿来用的教材,但是对于回归测试中的bug处理的细节,往往需要我们更多的经历才能更好的完成自己的工作,下面我们来谈一谈回归测试bug的处理中需要关注的点:  一、什么是回归测试?  回归测试是指在发生修改之后重新测试先前的测试以保证修改的正确性。理论上,对软件的任何新版本,都需要进行回归测试,验证以前发现和修复的错误是否在新软件版本上再现,并确认曾经通过的功能不会出现问题。  二、回归测试做多少次?  很多资料都有具体指定回归的次数,在我看来,回归测试不能确却的给出一个项目具体做多少轮回归测试,因为,版本不可控的因素太多了,需求的更改、人员的...
            0 0 1078
            分享
          • 今年九月初找工作才开始走上软件测试的道路,下面的是我找软件测试这份工作之前通过阅读软件测评师教程做的笔记。因为是为找工作中的笔试和面试准备的,所以都是一些重点的罗列,希望能帮到正在找软件测试工作的应届生们。1、软件测试的目的是发现软件中存在的错误,提高软件质量,降低软件项目的风险。2、软件测试只能证明软件存在错误,而不能证明软件没有错误。测试的目的只是把软件的错误控制在一个可以进行产品交付/发布的程度上,可以交付/发布产品并不是没有错误的产品。3、软件测试不可能无休止的进行下去。随着测试时间的延伸,发现错误的成本会越来越大,这就需要测试有度,而这个度并不能由项目计划实际判断,而是要根据测试发现...
            11 12 2246
            分享
          •   YouTube 创作者频道在北京时间今天凌晨宣布带来一项新功能:当创作者发现自己的视频评论区变得难以应对时,可以在不必完全关闭或删除评论的同时,一键暂停新的评论。▲ 图源 YouTube,原图清晰度如此  官方表示,这项功能此前已经测试了一段时间,并收获了不少积极的反馈。测试人员表示,这项功能将为自己频道的评论管理带来“更大的灵活性”。  在这项功能上线之前,若创作者想要“阻止”新的评论,只有两个选择:开启评论审核或关闭评论区。  在推出了这项功能之后,用户可在 PC 端或移动设备上使用 YouTube Studio 工具在视频的“评论设置”中找到“暂停”选项。若该功能打开,观众仍可看到所...
            0 0 1019
            分享
          •   这个问题也是测试工程师经常问的问题。有人主张测试用例详细到每个步骤执行什么都要写出来,目的是即使一个不了解系统的新手都可以按照测试用例来执行工作。主张这类写法的人还可以举出例子:欧美、日本等软件外包文档都是这样做的。  另外一种观点就是主张写的粗些,类似于编写测试大纲。主张这种观点的人是因为软件开发需求管理不规范,变动十分频繁,因而不能按照欧美的高标准来编写测试用例。这样的测试用例容易维护,可以让测试执行人员有更大的发挥空间。  实际上,软件测试用例的详细程度首先要以覆盖到测试点为基本要求。举个例子:“用户登陆系统”的测试用例可以不写出具体的执行数据,但是至少要写出五种以上情况(),如果只...
            0 0 1171
            分享
      • 51testing软件测试圈微信