当前位置:文档之家› Selenium识别Extjs控件的解决方法

Selenium识别Extjs控件的解决方法

Selenium识别Extjs控件的解决方法
Selenium识别Extjs控件的解决方法

EXT框架Web应用Selenium自动化之xpath

在之前用到的Selenium Xpath中,部分页面元素id是固定的,定位相对方便;再有,动态元素的xpath定位也不太复杂。对于EXT作为框架开发的Web应用,页面元素的id等属性是动态的,例如用户每次登陆页面所生成页面元素的id会发生变化。这样一来就增加了定位元素的难度,并且在对测试用例进行抽象化时与之前的实践也有些不同,在稍后的文章会进行记录。

在此,我先对xpath部分进行一些总结。首先是Xpath教

程https://www.doczj.com/doc/cb15648684.html,/xpath/,全面的介绍了xpath语法中的重要信息。下面用一些实例来说明,在此也要感谢ZhangFei同学及Seleniumcn中文论坛在我学习过程中的帮助。此外Firefox浏览器中的Xpath Checker及firebug插件对定位XPath 都是很有帮助的,大家可以参考使用。

先对XPath做个简短介绍,之后用实例具体说明:

1.EXTJS的页面源码是多个div组成的,对于div id为常量时,可用div先定位,再由其他标签定位,例如input field可用label name,button可用button上的文字来定位。

2.在定位更接近目标的节点时可用“//”和“/”分割路径,“//”表示相对路径,即可直接定位到元素,不管它的位置在哪;“/”表示绝对路径,即当前目录下的直接子元素。

3.定位当前元素之上或之下的元素节点,可用轴进行定位,即以当前节点为轴的父、子节点,例如following-sibling,preceding,preceding-sibling等。

4.在遇有多个相匹配的元素时,可用元素index或position()函数进行定位。

以如下这个Login页面为例,

.

1.先说选择语言栏的dropdown list,我们的操作方式是click,可以点击到选择框或者向下箭头部分。如图,我们先用比较繁琐的xpath找到了input field。

定位input field也可以有更简单的xpath,例如xpath=//input[@class=' x-form-text x-form-field x-trigger-noedit '],不过此种方式仅限于页面只有一个这样的dropdown list,如果有多个,就需要通过其他的信息进行更精确的定位了,比如dropdown list 前面的名称,元素的序列号等等。例如:

或者我们也可以用dropdown list的箭头图片“”,例如xpath=//label[text()='工作状态:']//following::img[@class='x-form-trigger x-form-arrow-trigger '][1],同样的,如果页面上有多个dropdownlist,我们需要通过其他信息定位想要操作的那个元素。

2.对于button,可以直接用button上面的文字进行定位,例如:

3.对于展开页面树结构的xpath,例如:

,操作方式是click,可通过双击文字部分或单击“+”,“-”号图标进行操作。

先来说双击文字的xpath,比较简单,定位到要操作的文字就可以了。

或者,我们可以通过“+”,“-”号的img来定位,不过这里有两个问题。一个是在img 较多时,需要其他更精确信息;另一个是,展开/收缩树结构时会改变img节点的class属性,在定义展开/收缩方法时需要不同的xpath,详情请见图。

节点收起、展开时的img中的class不同

4. Checkbox的xpath定位。与dropdownlist类似,checkbox的标签也是input,这里我用的是type属性进行定位。同样的也会用到有多个checkbox的情况,所以需要更多的具体信息,如checkbox后面的文字,checkbox的序列位置。请见图。

5.这里也说一下自己在实验的时候对following、following-sibling和preceding、preceding-sibling这两对轴的一些认识,在教程中对preceding-sibling的解释是“选取当前节点之前的所有同级节点”,相应的following-sibling即为“选择当前节点之后的所有同级节点”。也就是说加上了“-sibling”关键字后,就是搜索与当前节点同级的之上/之下的节点;那么没有加上“sibling”关键字的,搜索的就是之上/之下的所有节点,忽略同级概念。以本文第一点中的第一张图为例。

在xpath的第二步定位到label节点,following是说搜索label节点之后的所有input 节点,从页面源码中可以看出,label与input并无同级关系,甚至input标签应该是label同级节点div的子节点.那么如果用following-sibling又是什么效果呢?那样先搜索到的应该是label的同级节点div,进而才能继续一层一层的找下来到input节点(如图).显然,两种方式在当前节点的下一节点上是不同的.Preceding也是同样的道理哈。

6.对于系统中弹出窗口中元素xpath的定位。系统中的弹出框,分为EXTJS的和windows的。对于EXTJS的与之前的介绍没有什么区别,还是按照div的层结构逐层查找。EXT的框架在页面源码上有些不同,像一些EXTJS的系统提示框、右键的功能菜单在未激活时源码显示为disable的状态,只有在激活的时候才会显示(见图例);对于新的windows窗口目前可能无法定位,需要借助其他工具了。

这次写这么多,基本上是我在学习xpath中遇到的问题,回过头来看看大部分都是很相似的,找到规律写起来就比较快了。再有,Xpath Checker和firebug的用处很大,在checker上动手试着找会很快上手的。下一步,看看能不能把这些抽象一下再总结一下。如果有写的不多的请大家帮忙指点哈,谢谢!

Selenium IDE测试ExtJs一种测试解决办法

最近发现要使用ExtJs测试其实很麻烦,因为ExtJs的id是变化的,而Selenium IDE录制完后,ExtJs的下次打开页面,就无法进行回放了。因此很麻烦,不过通过一些网友进行交流得到如下一些测试方法:

引用

1. 使用Xpath进行定位

2. 适当使用selenium..runScript()方法

3.应用Selenium IDE的extensions

下面我只针对第3种方法进行总结。

如果你想知道第三种方法的原理:请你在你的firefox浏览器上

输入

引用

chrome://selenium-ide/content/recorder-handlers.js

chrome://selenium-ide/content/locatorBuilders.js

通过上面两个js你大致可以了解Selenium IDE录制的原理。

要用Selen现在我ium IDE的extensions。

步骤:在Selenium IDE的Options进入,在点击Options显示如下一个节目

在该页面你要注意:

Selenium Core extensions(user-extensions.js) Selenium IDE extensions

下面我们准备两个脚本来进行extesions。

该代码命名为user-extensions.js通过Selenium Core extensions(user-extensions.js)后的Browser选择中自己写的user-extensions.js.或者也可以不要改js但是下面这个js是一定要的(放入Selenium IDE extensions)。

该段代码是必须的。产生的效果是让Selenium IDE在录制Extjs的时候能够回放成功。

总结下使用步骤:

引用

第一:将第一段js代码放入Selenium Core extensions(user-extensions.js)

第二:将第二段js代码放入Selenium IDE extensions 这是必须的。

现在你可以使用Selenium IDE来测试ExtJs了。你可以看看是不是可以正常进行录制和回放。ExtJs没有ZK厚道,ZK官网提供了一个接口来实现Selenium IDE的测试。

Selenium 自动化测试之:Extjs – Web

最近在一个项目的自动化测试过程中遇到一个问题,某些接口被禁用。要进行自动化,必须从界面走。

了解了一下Selenium 之后就开始尝试了。适逢服务端测试页面是用Extjs 秀出来的,网上有些朋友说会遇到一些问题……

用过Selenium 的朋友应该都知道,控制的识别用ID 最合适的。

用过Extjs 的朋友应该都知道,大部分情况下对象的ID 是由Extjs 库自动生成的。 矛盾就这样产生了……

配合FireBug 来获取控件ID ,然后编译代码进行调试。发现:

1、有些页面在经过一些操作之后,对象的ID 发现了变化;

2、使用不同的浏览器,对象的ID 也不一定是相同的 这样就很悲剧了,ID 在变化。说明不能用ID 来识别,最后决定用Xpath 来尝试,成功。 。

譬如: testPage.Click("xpath=/html/body/div[4]/div/div[3]");

当然,如果有固定ID 的,还是推荐使用ID 。Extjs 生成的ID 都是类似“ext-gen31”的,遇到这些ID 就改用Xpath 吧。

有进一步测试过程中,还有一个值得一提的是“远程调试”:

因为Selenium 本身是在操作浏览器,而非程序内部代码。所以在调试过程中,当你手动修改页面上某个对象属性时,测试代码对象的对应属性并不会自动更新,需要手动再获取一次属性 笔者刚开始就犯错了,在调试过程没有考虑到这个问题。当时在查看一个单选按钮时,发现按钮无论是选中于否属性都是True 。查了许久才发现是对象没有刷新,太悲剧了…… 。

相关主题
文本预览
相关文档 最新文档