在 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. 待进一步优化查找元素和执行的效率。
       

留言

本站文章如未特殊注明,均为原创,转载请注明出处: 未必平凡  本文链接地址: https://vv2014.com/1059.html