一、概述
本文将介绍如何使用python
基于Appium
框架编写第一个自动化测试用例,测试对象是Android
模拟器。
Appium
框架环境搭建,参考"Appium框架搭建:macOS系统下Android设备自动化测试环境搭建"。
本文将编写的自动化用例为:启动计算器,执行加法1
+ 2
,并验证执行结果是否为3
。
二、分析
编写自动化测试脚本之前,需要分析使用手动操作有哪些步骤,在每一步涉及到界面哪些元素(控件,例如输入框、按钮等),对这些界面元素需要进行操作。这一套流程分析完成后,就可以映射到自动化的脚本操作上来。
要完成上述操作,需要经过以下几步。
1、启动计算器程序;
2、点击数字1
;
3、点击+
;
4、点击数字2
;
5、点击等号=
6、确认计算结果
接下来就要将上面的几个步骤映射到如何使用脚本实现,要对界面元素进行操作,首先得能获取到界面元素,因此需要使用界面元素定位工具来获取界面元素信息,关于界面元素定位工具的简单使用可以参考文章手机界面元素定位工具uiautomatorviewer和使用Appium inspector简介。本文使用Appium inspector
。
二、脚本编写
1、连接到设备
首先要做的是连接到设备,本文Appium
服务端使用的是uiautomator2
来连接手机模拟器,对于这个Driver
的使用可以参考https://github.com/appium/appium-uiautomator2-driver。
初始化连接时候需要的信息是Appium
服务端的IP
和端口,由于本文Appium
客户端和服务端在同一个Mac
上,因此Appium
服务端的IP
和端口使用的是默认的127.0.0.1
和4723
。
此外,还需要给Appium
服务端传递platformName
(被测平台,本文是Android
)、platformVersion
(被测版本,本文是6.0.1
)、appPackage
(待运行的app
程序包)、appActivity
(启动app
的activity
)、deviceName
(设备名称,可以通过adb devices
查看),"automationName"(本文使用的Diver
是uiautomator2"
)等参数。
说明1:如何获取appPackage
和appActivity
,可以参考链接https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/activity-startup.md,执行如下命令即可:
adb shell dumpsys window windows | grep "mFocusedApp"
或
adb shell dumpsys activity top | grep "ACTIVITY"
因此,appPackage
是com.example.calculate
,appActivity
是com.example.simplecalculate.ui.activity.MainActivity
。
说明2:如何获取deviceName
运行 adb devices
,此处是emulator-5554
。
综上,连接Appium
服务端的代码为:
desired_cap = {
"automationName": "uiautomator2",
"platformName": "Android",
"platformVersion": "6.0.1",
"appPackage": "com.example.calculate",
"appActivity": "com.example.simplecalculate.ui.activity.MainActivity",
"deviceName": "emulator-5554",
"androidDeviceReadyTimeout": 20
}
driver = webdriver.Remote("http://127.0.0.1:4723", desired_capabilities=desired_cap)
注意:Appium 2.0
的默认连接路径中已经不需要包含/wd/hub
了,直接使用http://ip:port
即可,对于本文就是http://127.0.0.1:4723
。
2、启动计算器程序
按照第一步的参数,运行代码之后就会连接到模拟器的计算器程序,界面显示如下:
3、模拟计算过程编写脚本
通过定位工具定位数字1
的id
为com.example.calculate:id/button041_1
。
通过定位工具定位数字2
的id
为com.example.calculate:id/button042_2
。
通过定位工具定位加号+
的id
为com.example.calculate:id/button044_a'
。
通过定位工具定位等号=
的id
为com.example.calculate:id/button054_q
。
通过定位工具定位计算结果的id
为com.example.calculate:id/textView2
。
- 模拟点击数字
1
button = driver.find_element(by='id', value='com.example.calculate:id/button041_1')
button.click()
- 模拟点击
+
button = driver.find_element(by='id', value='com.example.calculate:id/button044_a')
button.click()
- 模拟点击数字
2
button = driver.find_element(by='id', value='com.example.calculate:id/button042_2')
button.click()
- 模拟点击
=
button = driver.find_element(by='id', value='com.example.calculate:id/button054_q')
button.click()
- 对比结果
result = driver.find_element(by='id', value='com.example.calculate:id/textView2')
assert result.text == '3'
三、运行自动化测试
1、运行前环境准备
- 已经启动
Appium
服务器 - 已启动手机模拟器
- 已经安装
python
和pytest
库
2、运行脚本
- 脚本内容
#-*- coding:utf-8 -*-
import pytest
from appium import webdriver
import time
def test_calc_for_appium():
desired_cap = {
"automationName": "uiautomator2",
"platformName": "Android",
"platformVersion": "6.0.1",
"appPackage": "com.example.calculate",
"appActivity": "com.example.simplecalculate.ui.activity.MainActivity",
"deviceName": "emulator-5554",
"androidDeviceReadyTimeout": 20
}
# 连接服务端
driver = webdriver.Remote("http://127.0.0.1:4723", desired_capabilities=desired_cap)
# 模拟点击数字1
button = driver.find_element(by='id', value='com.example.calculate:id/button041_1')
button.click()
# 模拟点击 + 号
button = driver.find_element(by='id', value='com.example.calculate:id/button044_a')
button.click()
# 模拟点击数字2
button = driver.find_element(by='id', value='com.example.calculate:id/button042_2')
button.click()
# 模拟点击等号
button = driver.find_element(by='id', value='com.example.calculate:id/button054_q')
button.click()
# 查看结果
result = driver.find_element(by='id', value='com.example.calculate:id/textView2')
assert result.text == '3'
- 在脚本文件所在的目录下,命令行执行
pytest