一、写在前面
本文讨论的基础,是基于Robotframework(简称RF)+Selenium测试框架的Web前端自动化测试。针对Robotframework和Selenium的安装、使用等基础知识不做介绍,只讨论在进行自动化脚本编写过程中遇到的元素定位失败问题。
二、但是你不得不了解的事
RF框架在做前端自动化时,支持的元素定位方式有:css定位、id定位、name定位、xpath定位和js定位。在介绍如何使用这几种方法之前,你不得不认识并熟悉我们Web测试的基础工具(客户端)——浏览器。
以Chrome浏览器为例,Chrome的开发者工具栏的Elements面板,提供了用户捕捉前端元素及获取元素定位的方法。如下图1所示,打开Chrome开发工具的Elements面板,点击最左侧的箭头(图中1),在界面点击关键字搜索框(图中2),即可获取搜索框的元素(图中3)html文本:
“<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">”
在该html文本处右键点击,并点击Copy按钮(图中4),即可见Chrome关于该搜索框元素定位的几种方式:selector、Xpath、JS path。
如图1例中,selector的值为“#kw”;Xpath的值为“//*[@id="kw"]“;JS path的值为“document.querySelector("#kw")”。
selector提供了css或id或name的元素定位方式,Xpath提供了xpath相对路径的元素定位方式。使用selector和Xpath,结合RF Selenium2Library的Click Element、Click Button、Checkbox Should Be Selected等关键字使用,即可定位元素进行点击、判断等操作。除此外,RF还提供js定位方式,结合Chrome的JS Path和RF的Execute JavaScript关键字,即可完成对元素的操作。
图1 chrome开发工具获取元素定位
三、你可能不知道的事
尽管使用过“02”中的几种定位方式,能够捕捉到大部分元素,但是现实往往不是那么尽善尽美,你可能还是遇到了下面几个问题:
1、自动化脚本编写好,测试通过了,但是过几天回归测试就失败,元素找不到?
在这里,只能建议你:请确认你所使用的定位方式是唯一不变的。例如,避免使用“//*[@id="9134245532398"]“这类包含动态id的xpath定位方式。有的前端设计某些元素的id为随机数,每次刷新都会更改,切记勿用这类随机变换的标识做元素识别。元素定位只有一个标准:唯一性,推荐id和name优先。
2、元素处于frame框架嵌套中,即使获取到了正确的定位路径,测试脚本运行仍然失败?
请记住,处于frame框架中的元素,你需要先切换进frame(RF的 select frame关键字试一试,会有惊喜),再进行元素定位。好比你远远地看到一扇玻璃窗里有个熟人,你大声跟他说话,他却无动于衷。这个时候,你需要走进这扇玻璃窗的门里,因为,玻璃窗是隔音的,你的呼喊门里的人听不见。
3、如何操作被遮挡的元素?
针对这类情况,也许你尝试了id、name、css和xpath等定位方法,结果都失败了。也不存在2中所说的frame切换,不要灰心,试试js定位操作吧。使用RF的execute javascript配合JS path直接操作被遮挡元素,百试不爽。
4、如何处理新开tab页或新开窗口后的元素操作?
同02方法类似,将当前操作的窗口切换到新开的窗口或tab页,再结合chrom的元素定位路径对元素进行操作,RF的select window值得尝试。
5、定位没问题,点击按钮有显示被点中的样式,但是就是没效果?
元素定位正确,使用click button和click element点击元素都,也无报错,就是没反应,那就试试press key按钮吧。
6、自动化测试脚本运行太快,页面还没加载出来,元素找不到?
这个时候,没有其他办法,只能设置等待时间或者使用RF的Element Should Be Visible这类关键字判断元素已经再页面可见或可用后,在进行操作。
四、告诉你一个大事情
如果你遇到的问题,“03“中的方法都不能解决,那么……打印源码吧。
RF的get source关键字,将会告诉你,你当前操作的页面,所有html文本,按图索骥,根据你的定位方式是否真的能在当前页面中找到你定位的元素。get source将是你调试路上的好帮手!
作者:刘晓佳
来源:51Testing软件测试网原创