一盏小灯 如何在 robot framework 中使用 uiautomator2 替换 appiumLibrary
名词介绍
robot framework:以 Python 开发的一套关键字驱动测试框架,可支持 appium、selenium、request 等库进行 ui、接口测试。
https://robotframework.org/
appium library : 以 Python 封装的 robot framework 库,提供已封装的关键字在 robot framework 中使用。
https://pypi.org/project/robotframework-appiumlibrary/
uiautomator2: 以 Python 开发的用以 Android ui 自动化测试的框架。
https://testerhome.com/topics/10881
本文记录在 robot framework 中将 uiautomator2 封装为新的 library 库以替代 appiumlibrary 的思路和过程。
背景
现在的团队使用 robot framework + appium 的框架进行移动端的 UI 自动化测试。使用过程中遇到以下问题:
appium desktop 软件使用体验问题:
- 1. 从启动 appium desktop 软件,到启动 appium 的 inspector 查看元素,到使用 appium server 执行测试,速度都非常慢。
- 2. 如果在执行完某条用例失败后想查看元素,在启动 inspector 的时候经常会遇到闪退的情况(不是 app 的闪退,是电脑上 appium desktop 的闪退)。
- 3. 某些未知原因导致的元素定位问题:某些元素明明可以通过 xpath 获取到 text,但偏偏点击的时候会失败,尝试了很多种方式也无法解决。
在写了几十条用例之后,终于无法忍受上述问题给工作效率带来的阻碍,开始想替代方案。
现状和改造限制
在之前的项目中曾经使用过 用例平台管理用例 + uiautomator 2 执行自动化测试 + weditor 查看元素编写用例的方案,于是第一时间想用这一套框架来替代。
但是目前项目已经有一定的累积,因此无法直接替代:
- 1. robot framework 的关键字驱动方式进行用例组织,和自带的报表是团队需要的,因此最好能延用。
- 2. 已经写好了的几十条用例,希望能尽量保留。
改造方向
既然不能完全推倒现有的方案,只能考虑改造。
现有方案:
- robot framework 进行用例管理和执行管理、报告生成: 如上面所说,尽量保留,不能变动。
- appium library 作为关键字执行: 目前瓶颈就在这个库上,重点的改造对象。
- appium desktop 的 inspector 插件查看元素: 体验不好,可考虑替换。
改造思路
1. appium library: 基于 appium 封装的一个 robot framework 库。
如果要改造,思路如下:
- 找到 appium library 的不足,进行二次开发、改造。
- 使用其他框架进行替换,如熟悉的 uiautomator2. 但需要将其封装为 robot framework 的库进行调用。
从这个方向扩展,得出以下的方案:
- 将 uiautomator2 封装为一个 robot framework 库,替换 appium library。 暂定名为 u2 库。
- 需要覆盖已在用例中使用的 appium library 关键字,使在切换到新的 u2 库时,所有的用例无需进行任何改动。
2. appium inspector : 替换为 weditor 。
既然已经替换了 appium library 作为执行,那么 appium inspector 也可以替换了。目标是 weditor。 这只需安装对应的 Python 库即可。
改造实施
1. 封装 u2 库。
按 appiumlibrary 中对应关键字的实现思路,在新的 u2 库中进行改造。大致包括以下常用的关键字,改造耗时 1 天:
- start app: 以包名打开指定 app。
- close application:关闭 app。
- click element: 按传入的 locator 查找元素并点击。
- click text: 按传入的 text 查找元素并点击。
- input text:按传入的 locator 查找元素并输入 text 内容。
- get element attribute: 查找元素并返回对应属性值。
- element should(not)be visible(enable):判断元素是否存在或可用
- wait until element is(not)visible: 等待元素出现或消失。
- take screenshot: 截图并保存到 robot framework 的报告中。
部分关键字封装举例:
init: 在调用 u2 库时确保可以连接到手机
def __init__(self):
try:
print(self.u)
expect:
self.u = uiautomator2.connect(device)
start app:
def start_app(self, packageName):
self.u.start_app(packageName, stop=False)
find element: 这是重点,需要根据不同的 locator 方法查找元素
def find_element(self,locator,timeout=30):
method, locator = locator.split('=') # locator 的统一格式: id=test1, class=class1, 等待
if method== 'id':
find element by id
...
click element:
def click_element(self,locator,timeout=30):
self.find_element(self.locator,timeout=timeout).click()
改造效果
改造后的好处:
- 1. 执行速度加快了不少。而且不需要预先启动 appium server。
- 2. 可以直接在 u2 库中直接调某个方法进行调试。
待优化:
- 1. uiautomator2 需要预先安装部分 apk 到手机中。不过这是一次性的过程,可忽略。
- 2. 待进一步优化查找元素和执行的效率。