Selenium关于Frame跳转问题的解决方法

发表于:2021-3-25 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:田利娟 侯健琦    来源:51Testing软件测试网原创

  当谈到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的跳转问题了。笔者会在下一篇文章中介绍,在当前文档内如何精确定位元素。

      版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号