专栏文章 如何在 robot framework 中使用 uiautomator2 替换 appiumLibrary

Jerry li · 2019年08月01日 · 最后由 Anney-Ying 回复于 2019年10月25日 · 5175 次阅读

名词介绍

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. 待进一步优化查找元素和执行的效率。
共收到 3 条回复 时间 点赞

我们这边的现状跟前辈的非常雷同。我自己也用 py 把 u2 给封装成关键字后在 rf 中调用,后来领导想换成了以https://github.com/StandOutstar/Pytest_Allure_Airtest_Demo 这个项目为蓝本二次开发定制的版本了。但是同事们代码能力都较差,前几天领导找我沟通换框架的问题上,个人感觉这个 Android 和 iOS 公用一套确实更方便
前辈看看这个项目,提供下看法?盼复

这个框架我还没试过,不知道对 Android 和 iOS 的支持好不好,所以暂时给不了你意见。
不过如果 Android 和 iOS 都能用同一套代码的话也是不错的

我最近也在封装该库,但是对于 find element 和 toast 没有好的方法,请问有什么建议吗?

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