快让Appium自动化测试你的App吧

503 阅读6分钟

前言

适用于移动端的UI自动化测试框架有很多,其中主要以Appium与Airtest最为有名,本次主要为大家主要分享Appium的自动化测试流程。

以我司App Zepp为测试目标,不涉及任何隐私,也欢迎大家购买我们的Amazfit智能手表,体验我们的Zepp App。

环境配置

我们直接通过命令安装appium的最新版本(假设你已经配置了npm命令)

npm i -g appium@next

安装完appium之后我们还需要安装驱动,这里我们以Android平台为例,安装uiautomator2驱动

appium driver install uiautomator2

当然,你还要配置Android SDK相关环境变量,此处直接省略了。上述环境配置后我们就可以开始编写代码了。

Appium支持使用JS、Python、Java、Ruby语言编写测试脚本,我们选择最常用的Python语言。

在上述配置完成后,我们可以通过appium-doctor来检查配置是否完成,配置完成后直接使用appium启动appium服务器,如下图所示。

红框中的地址就是appium的地址,在编写代码的时候将使用到。在开始编写代码之前,为了更好的理解Appium的操作原理,我们先来看一张图。

我们编写的脚本会下发指令到Appium服务器,然后Appium服务器下发指令给Android SDK,Android SDK通过ADB等一系列命令操作App。

当然,如果你不喜欢命令行也可以使用开源的Appium客户端,不过,要注意的是Appium客户端并不是一款IDEA,不能编写代码。编写脚本代码我们仍然需要在IDEA中进行,这里我使用的是PyCharm。环境配置好之后,我们来看如何使用Appium进行自动化测试。

Appium-Desktop 是为了让 Appium 能够更好用,使得入门更容易,让调试和界面分析更方便,官方开发了 GUI 的工具 Appium-desktop。

本来环境配置到这里就应该结束了,但是我发现Appium-Desktop已经被废弃且不再维护了,所以我们不应该再依赖它。而我们当前能查阅到的的所有资料基本都会推荐你去使用它。

使用方法

在我学习Appium使用方法的时候,我发现官方文档的中文版很多都是todo

appium.io/docs/zh/2.0…

并且,这个官方文档和Airtest的官方文档相比真的是“一言难尽”,对初学者非常的不友好。

uiautomator2.readthedocs.io/en/latest/a…

打开目标Activity

操作App的第一步,我们可以写一个自动化脚本,让脚本帮我们自动打开目标Activity,然后我们就可以定位元素去执行点击了。

这里我们定义一个字典,声明平台、驱动等参数,代码如下所示。

capabilities = {
     'automationName''UiAutomator2',
     'platformName''Android',
     'appPackage'"xxx",
     'appActivity'"xxx"
 }

这两个加粗的参数是必填的,appPackage是App的包名,appActivity是我们想打开的目标页面,这里我们打开启动页页面。通过webdriver.Remote方法来连接Appium服务器,代码如下所示。

driver = webdriver.Remote("0.0.0.0:4723", capabilities)
这里的0.0.0.0:4723就是我们启动appium服务器之后控制台显示的地址。由于我们在capabilities指定了目标页面,所以连接服务成功之后,会直接执行打开目标页面的adb命令。
adb shell am start -n packagename/xxxxxx.MainTabActivity

代码写好后,运行程序,“高大上”的流程执行结束了,但是我们发现抛出了一个权限异常。

这是因为目标Activity的exported属性没有设置为true导致的。不过我们不用纠正这个问题,至少这说明Appium已经是可用的状态了。

查看布局元素

在Android中我们可以使用Android SDK中的uiautomatorviewer工具来分析页面元素,这里遇到了两个坑:

  • uiautomatorviewer只能在JDK1.8或以下版本运行

  • 我的mac环境下官方环境自带的uiautomatorviewer无法正常运行,使用源代码自己重新编译了一个jar

运行uiautomatorviewer打开声音与振动页面,显示如下所示。

image.png

从布局分析的这个图中可以看出对应按钮的resourceId、class、package等参数。我们写脚本的时候将用到这些参数。

但是这个工具只能在Android中使用,具有很多不便性。这里我们推荐使用weditor来查看布局元素。

weditor是一个用于查看和分析应用程序的 UI 层次结构的工具。它是一个可视化的界面,用于检查应用程序中的各种元素、属性和布局。Weditor 工具可以帮助开发人员和测试人员在进行 Appium 自动化测试时更好地理解和操作应用程序的界面。

pip install weditor

安装好weditor之后,直接在命令行中启动weditor,weditor会打开一个网页,我们可以在网页中进行页面操作,如下图所示。

image.png

知道如何查看布局元素之后,我们就可以尝试点击事件了。

尝试点击事件

我们通过weditor可以清晰的看到某个布局元素的resourceId,我们可以通过resourceId来执行对应按钮的点击事件。

铃声提醒右侧switch的resourId为“rainbow_tile_switch”,编写代码如下所示:

# 连接Appium服务器
driver = webdriver.Remote("0.0.0.0:4723", capabilities)
# 定位到铃声提醒按钮
ring = driver.find_element(By.ID, "rainbow_tile_switch")
# 执行点击事件
ring.click()

这里我们直接打开了声音与振动页面,所以是可以直接查找到这个元素的,如果当前不在这个页面我们还可以通过添加wait方法来等待元素的出现。

driver.implicitly_wait()

运行程序,结果如下所示。

在Appium早期的版本根据ID定位元素的方法是find_element_by_id,根据文本定位元素的方法是find_element_by_text,我们现在能搜到的教程基本上都是这样写的。但是在Appium 2.0中 将这些方法全都合并了。

driver.find_element(By.ID, "rainbow_tile_switch")

在这行代码中,我们是根据ID去查找,并且传了一个参数By.ID,By类就是定位元素方式的枚举类,其代码如下所示。

class By:
    """Set of supported locator strategies."""

    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

从By类中我们可以看出可以通过 ID、XPATH、LINK_TEXT等方式定位,这些值我们都是可以在weditor中看到的。但是其实上述代码写法是有问题的,因为铃声提醒、覆屏静音等Switch按钮的resourceId都是相同的,所以在实际操作中,我们可能需要使用XPATH来定位。

总结

这样我们就实现了使用Appium进行自动化点击的功能,从而达到自动化测试的效果。