前言
适用于移动端的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
并且,这个官方文档和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打开声音与振动页面,显示如下所示。
从布局分析的这个图中可以看出对应按钮的resourceId、class、package等参数。我们写脚本的时候将用到这些参数。
但是这个工具只能在Android中使用,具有很多不便性。这里我们推荐使用weditor来查看布局元素。
weditor是一个用于查看和分析应用程序的 UI 层次结构的工具。它是一个可视化的界面,用于检查应用程序中的各种元素、属性和布局。Weditor 工具可以帮助开发人员和测试人员在进行 Appium 自动化测试时更好地理解和操作应用程序的界面。
pip install weditor
安装好weditor之后,直接在命令行中启动weditor,weditor会打开一个网页,我们可以在网页中进行页面操作,如下图所示。
知道如何查看布局元素之后,我们就可以尝试点击事件了。
尝试点击事件
我们通过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进行自动化点击的功能,从而达到自动化测试的效果。