一、 现状

在自动化的过程中, 我们知道web自动化测试的开发和维护成本是比较高的,能否采用技术以及流程改进等手段来降低web自动化测试的成本呢?
我们先看看目前的实现方式,通常,实现步骤如下:
(1) 首先使用domsipder抓取我们所需要的网页上的元素,存储在xml文件中。
(2) 实现相应的关键字。这里的关键字主要有两类,一类是一些基础功能的实现,拿alb项目来举例:“RadioButton是否被选中”、“CheckBox 是否被选中”、“Button是否可用”、“Link跳转验证”等等;另一类是业务相关的关键字:“登陆alb系统”、“退出alb系统”、“设置时间段 查询”、“选择查询方式”等等。
(3) 实现testcase,这里case会调用(2)实现的关键字。
在具体的实现中有两个缺点:
(1) 关键字不利于共享和维护。主要体现在以下几点:
? Domspider抓取的xml文件没有统一的组织和管理。即使对同一页面元素,我们可能在不同的项目中重复的抓取,实现关键字,一旦页面元素改变了,维护变得很困难。
? 业务关键字没有好的组织形式。如果需要复用关键字,必须在整个关键字列表中去寻找相关的功能,这个查找过程是比较盲目的。通常的结果是各自实现自己的关键字,造成了资源的浪费。
(2) Case对页面的直接依赖。Case实现中有直接对相关页面的操作,如果相应的页面改变了,可能对很多的case造成影响,并且我们很难定位影响的case的范围,给维护自动化case带来了很大的困难。
二、 改进方法

在tplmaker1.0.0这个项目中,我做了一些相关的尝试:总的来说,这里我们用分层的思想,把页面单独抽象为一层,把页面对象化。因为系统的功能可以转化为一系列的页面操作,所以也可以转化为一系列页面对象的调用。具体来说,主要完成了以下两项工作:
1. 页面元素的聚合
这里的页面可以是一个具体的页面,也可以是一个相关页面的集合,比如:在tplmaker中,MaterialType页面可以包括物料类型管理页,添加页,修改页,查看页。把这些页面相关的元素聚合一起,放在一个文件中定义,成为一个ui对象,如下所示:

这项工作主要有两个目的:
(1) 把相关的元素按照它们在页面上的关系组合在一起,当页面变化时,很容易通过页面的关系找到代码中应该修改的地方。
(2) 可以帮助我们通过页面的关系定位页面元素。比如我们通过某个属性来定位元素,可能页面上会有多个属性相同的元素,这时候如果我们需要的元素在一个 frame中,我们可以通过这种逻辑关系,通过先定位frame,然后只选择出在frame中的含有该属性的元素。在tplmaker中,并没有完全实现 功能,后续可以参考Tellurium进行改进。
使用groovy作为开发语言,使Ui的定义和使用都比较直观和方便。
2. 页面对象化
在另一个文件中(这里也可以写在一个文件中,写在不同的文件只是为了可以在ide中打开不同的窗口,方便编辑),我们定义这个物料类型管理页的对象,重点是对象的方法,这里的方法只是针对该页面得相关操作,如下图所示:

方法列表:

方法包括了对物料类型的增删改查,以及针对页面的更简单的一些必要的操作。
在具体的case中,没有具体的对页面元素的解析和操作,只有对页面对象的调用,使得页面与具体的Case解耦。如下图所示:

如上图绿框部分所示,通过主页面打开物料类型管理,然后通过物料类型管理列表页面进行添加物料类型操作,这里调用的都是页面对象的方法。这样做带来了以下优点:
(1) 便于共享。由于我们的操作是针对页面的,我们可以在对应的页面中寻找相应的方法。例如:我需要一个物料类型查看的功能,很容易确定我要在物料类型管理对象进行该操作,打开如下图所示的由groovydoc生成的文档,查找相应的类是否有所需的方法。

如没有查到相应的方法,可以自己实现,并注意写好doc注释,上传代码库,以便于他人复用。(页面的Ui对象也是同样的道理)
(2) 便于维护。如有某个页面元素发生变化,我们只需要在相应的页面对象中去修改,Ui和方法,不会对testcase造成影响。并且查找和修改都在一个文件中,降低了遗漏修改的可能性。
这里使用groovy作为开发语言,既可以使用Java强大的类库和资源,又可以使用一些脚本语言的高级特性,减小代码量。
三、 缺点和改进
缺点:
? 在写case的过程中,可能会有一些对页面的操作是很简单并且不常用的,按照上述做法,也需要在页面对象中抽象并添加一个方法,增加了一定的自动化成本。 如果一个页面上的 方法过多,也会影响我们查找。
? 对方法的设计和实现需要在建立在对业务有一定熟悉程度的基础上,否则页面对象的方法可重用性差,就会造成页面对象方法的爆炸,达不到我们想要的效果。
改进:
? 页面元素的抓取。如果可以通过插件实现对象的抓取,并且自动的生成聚合后的文件会减少大家很多工作量。在抓取对象时,需要选择定位的方式,目前的工具都会优先采用id进行定位,但有些元素是动态生成id的,抓取的元素没有意义。
? 对方法的抽取和实现提供一些建议和规范,尽量避免上面所提到的缺点
四、 总结

上述是在tplmaker项目中所做尝试的一点想法,和大家分享一下,难免其中有一些不合理之处,或者有更好的解决方法。虽然在尝试的过程中使用了selenium,但是一些想法应该同样可以用在ficus中。大家在自动化方面更有经验,欢迎大家拍砖、讨论。

(全文完)

【本文转自百度测试技术空间】http://hi.baidu.com/baiduqa/blog/item/b9f34afca57d95235c600817.html
【关注百度技术沙龙】

转载于:https://blog.51cto.com/baidutech/743873

Web自动化测试中使用groovy实现页面的对象化相关推荐

  1. html500错误原因1003无标题,web工程中404/500错误页面配置+404页面模板

    [实例简介] web工程中404/500错误页面配置+404页面模板 [实例截图] [核心代码] 247959a9-c3ea-4360-8e57-105d680b29f0 ├── 404页面模板 │  ...

  2. Web自动化测试中的接口测试

    1.2.3 接口可测性分析 接口显而易见要比UI简单的都,只需要知道协议和参数即可完成一次请求,从自动化测试实施难易程度来看,有以下几个特征: 1)驱动执行接口的自动化成本不高:HTTP,RPC,SO ...

  3. 软件测试自动化验证码,借助 OCR,协助绕过 web 自动化测试中一些简单验证码问题。...

    前言 做软件自动化的时候,最怕就是在登录的时候遇到验证码.以前的经验是让开发设置一个万能码或者把验证码屏蔽掉.现在人工智能发展很快,有一些库可以帮助我们识别这验证码,将这些库引入到我们自动化代码中,就 ...

  4. 【深度学习浅尝】web自动化测试中识别图片算术验证码

    本文参考实验楼课程:Python实现深度神经网络. 声明 我也是机器学习零基础,在本次实践中,仅仅是个人对机器学习的理解,由于水平有限,难免存在不对之处.因此对机器学习中涉及到的原理和概念还是建议参考 ...

  5. UI自动化测试中的页面定位问题,年薪50W软件测试工程师为你解答

    这几天有人问我,UI自动化测试中使用到的页面定位元素应该存放在哪里比较合适? 我想说的是,如果你使用的是PO设计模式设计测试用例的话,可以把定位元素存在每一个page页面或者单独存放在一个目录中,新键 ...

  6. web自动化测试-第五讲: 三大切换

    三大切换:窗口切换.iframe切换.alert切换 为什么要讲这三个切换呢?第四讲我们讲过,"Message: no such element: Unable to locate elem ...

  7. Web自动化测试如何做?Web自动化测试的详细流程和步骤

    一.什么是web自动化测试 自动化(Automation)是指机器设备.系统或过程(生产.管理过程)在没有人或较少人的直接参与下,按照人的要求,经过自动检测.信息处理.分析判断.操纵控制,实现预期的目 ...

  8. Web自动化测试怎么做?Web自动化测试的详细流程和步骤

    一.什么是web自动化测试 自动化(Automation)是指机器设备.系统或过程(生产.管理过程)在没有人或较少人的直接参与下,按照人的要求,经过自动检测.信息处理.分析判断.操纵控制,实现预期的目 ...

  9. 软件测试之Web自动化测试怎么做?Web自动化测试的详细流程和步骤

    1.什么是web自动化测试 自动化(Automation)是指机器设备.系统或过程(生产.管理过程)在没有人或较少人的直接参与下,按照人的要求,经过自动检测.信息处理.分析判断.操纵控制,实现预期的目 ...

最新文章

  1. pytorch 序列化性能测试
  2. Codeforces Round #651 (Div. 2) D
  3. linux lnmp yum版安装
  4. 【Python CheckiO 题解】Easy Unpack
  5. 洛谷P2486 [SDOI2011]染色(树链剖分+线段树判断边界)
  6. Vscode linux ubuntu deb 最新下载
  7. 优化SQL的执行速度
  8. 撸一个vue的双向绑定
  9. arm linux 进程页表,arm-linux内存页表创建
  10. 【读书笔记】深入分析Java Web技术内幕-Cookie与Session
  11. java resultset 映射到实例_Java中,将ResultSet映射为对象和队列及其他辅助函数
  12. 关于实现servlet中心控制的Front Controller Pattern
  13. 记牌器内存扫描法原理(转)
  14. 【MQTT】SpringBoot集成MQTT
  15. java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...
  16. JavaScript专题(三)防抖
  17. 微信小程序 -- 订阅消息wx.requestSubscribeMessage
  18. 模型评价 - 分类模型的常用评价指标
  19. 什么是low-level、high-level任务
  20. 今日小程序推荐:码农老黄历-看今天哪个方位BUG最少

热门文章

  1. python快递费用计算_Python制作快递查询系统,来感受到了Python的强大!
  2. python函数不包括参数函数_python中实现函数不限制参数的数量
  3. java 命令行 解析_如何在Java中解析命令行参数?
  4. linux 输出数据到csv,Linux-从外壳输出CSV文件
  5. 考虑空气阻力的抛射体的matlab,考虑空气阻力的抛射体运动mtlab仿真
  6. java 组合 遍历 算法_java编程n个集合每次从每个集合里面取出一个元素组成一个字符串列出所有组合算法...
  7. jpush推送格式 swift_Swift - JPush极光推送的使用6(定时推送通知)
  8. 计算机科学家 收入,你离年薪100万的数据科学家还差10个“码农”
  9. java 表达式2004的值_javaSE习题 第三章 运算符、表达式和语句
  10. 英语总结系列(二十七):重复就是力量