当谈到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软件测试网原创