Selenium 一个基于关键字驱动的自动化测试 WebLibrary

longmazhanfeng · 2016年06月29日 · 最后由 longmazhanfeng 回复于 2016年07月04日 · 3473 次阅读

首先,说明下这里采用的关键字驱动框架是RobotFramework,Web 自动化测试框架是Selenium2。该 WebLibrary 是对自动化测试的一个初步探索,并不完善,欢迎大家一起讨论。

这个自动化 Library 的初衷是:

  • 简化用例编写,脱离 Eclipse 环境 (不使用 TestNG)
  • 提高用例的可维护性
  • 提高用例的可读性
  • 提供较高的可扩展性

针对上述目的采用的实现方法是:

  • 使用类似表格填充的方式编写用例,带关键字自动提示功能 (RobotFramework IDE)
  • 对自动化用例根据进行分层,每层提供对外统一关键字 (采用 POM 思想分层)
  • 元素管理和测试业务逻辑分离
  • 除基础关键字外,其他所有层级的关键字采用中文统一规范命令,用例呈现形式接近自然语言
  • 提供分布式部署

那么,在上述的实现方法之下,用例的可读性、可维护性和可扩展性有哪些提高呢?

可读性

上层关键字规范的中文命名方式使用例的呈现方式接近于自然语言,可读性大大增强,一个具体的用例写出来的形式如下图所示:

可维护性

  • 可读性增强的情况下,可维护性也会随之得到提升
  • 在用例运行报错的情况下,关键字驱动和中文命名的优势就体现出来了,可以通过定位出问题的关键字找到出错位置
  • 采用分层设计,用例组织逻辑清晰,管理起来更加方便,如下图所示

可扩展性

这里只提一下 RobotFramework 提供的关键字驱动的可扩展性还是十分优秀的,把需要的功能或者操作封装成关键字即可;除此之外,Selenium2 自身的扩展性是完整保留的,Grid 也是支持的

RFUI 对 Selenium2 的二次封装

RobotFramework 提供上层的关键字驱动支持,底层的关于 元素/页面/窗口 各种操作的基础关键字,例如,click/input_text/maximize_browser_window,还是由 Selenium2 提供支持,所以需要将 Selenium2 封装成 RobotFramework 支持的 TestLibrary。

通过下图可以看出对 Selenium2 做了哪些封装,例如,支持文本定位点击(Web Click TextButton)、支持 Windows 下 Flash 上传控件(Web Upload File)、相同元素根据序号定位操作(Web Click Element)、支持 Hover and Click(Web Hover And Click)、获取匹配指定 Locator 的元素个数(Web Get Elements Num)、文本框输入完成后按下 Enter 键(Web Input Text)。当然包括这些特有的操作,所有的操作中都添加了加载保护(Wait Until Element Is Enabled/Visible),等元素到了可操作状态才进行下一步操作,所以可以省去用例中的 Sleep。图片太小可以右键->“新标签页打开”。

有了封装好的 WebLibrary 和 RobotFramework,那么我们的框架结构是这样的:

具体到实现原理的框架结构其实是这个样子的(需要结合前两篇博客来看):

总体来讲,框架功能的完善性很多可以加强的地方,不过先前提出的几个问题基本上得到了解决。这种基于关键字驱动的自动化用例编写方式是否可行,通过在实际项目中的使用之后得出的结论是肯定的,不过还有许多有待完善的地方,比如 RobotFramework IDE 还不够成熟,WebLibrary 提供的基础关键字不够全面不够智能等等,这些会在后续的对自动化测试的学习中逐渐完善。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 13 条回复 时间 点赞
1楼 已删除

能说下相比官方的 Selenium2Library ,增加或优化了哪些方法吗?

#1 楼 @chenhengjie123 上面列举的 “支持文本定位点击(Web Click TextButton)、支持 Windows 下 Flash 上传控件(Web Upload File)、相同元素根据序号定位操作(Web Click Element)、支持 Hover and Click(Web Hover And Click)、获取匹配指定 Locator 的元素个数(Web Get Elements Num)、文本框输入完成后按下 Enter 键(Web Input Text)” 这些就是增加的方法

#3 楼 @longmazhanfeng 好吧。我觉得这叫做一个库(Library)更合适?

#3 楼 @chenhengjie123 😅 这么一说好像是的。。


你这个别人想打赏都没办法了。。。

#5 楼 @lihuazhang 😂 😂 我去修改过来,是我调皮了

我觉得。。。这个和 webdriver 的 API 没有太大差别额

提供下你的 library 源码呗

#9 楼 @jphtmt 这里是 library 的主要实现代码--https://github.com/longmazhanfeng/WebLibrary

其实就是合理分层,一般把页面元素和基本关键字封装起来成业务关键字,然后在调用,其实 RF 在分层的时候有个很有趣的特征,知道这个特征的话可以优化脚本执行的性能

—— 来自 TesterHome 官方 安卓客户端

匿名 #12 · 2016年07月01日

Robot Framework 框架,提供一层清晰的强制分层/分工: 测试库专家,负责将 底层测试框架(如 appium/selenium)封装成 统一/易读 的关键字库; 脚本开发人员,负责使用这些任性化的关键字 来实现用例逻辑。
难得的是,本文,在用例层还实践了 POM 将 UI 元素和业务逻辑 剥离。
在分层设计的年代,测试脚本与源代码一样 都必须注重 重用/抽象,方便维护是很重要的。即使大家都懂这个道理,本文作者实践了。赞一个

#11 楼 @terrychow 请教下是什么特征啊😍

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册