一、Appium介绍
Appium是一个移动端的自动化框架,可用于测试原生应用、移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。
原生的应用是指用android或ios的sdk编写的应用;移动网页应用是指网页应用,类似于ios中safari应用或者Chrome应用或者类浏览器的应用;混合应用是指一种包裹webview的应用,原生应用于网页内容交互性的应用。
重要的是Appium是跨平台的,何为跨平台,意思就是可以针对不同的平台用一套api来编写测试用例。
二、环境搭建
主要几个点如下:
1. appium安装
直接解压即可,打开Appium.exe
启动成功展示如下:
2. Appium库安装
安装
pip install Appium-Python-Client
检验是否成功
pip list
三、Appium使用
1. 打开模拟器或真机的应用
①打开手机应用
②打开Appium
③创建一个python项目,并创建一个文件
④将下面代码复制到文件中
⑤获取当前应用包名和启动activity并修改文件
from appium import webdriver
server 启动参数
desired_caps = dict()
设备信息
平台信息,不区分大小写
desired_caps['platformName'] = 'Android'
系统版本,7.1.2可以写[7 ,7.1 , 7.1.2]
desired_caps['platformVersion'] = '7.1.2'
设备名称,可以随便写,但是不能乱写,Android可以随便写,但是ios必须正确的写
desired_caps['deviceName'] = 'emulator-5554'
app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
声明我们的driver对象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
driver.quit()
2. 脚本内启动其他app
driver.start_activity(appPackage,appActivity)
3. 关闭app
driver.close_app() # 关闭当前操作的app,不会关闭驱动对象
4. 关闭驱动对象
driver.quit() # 关闭驱动对象,同时关闭所有关联的app
三、App基础操作API
完成app自动化需要一些基础条件的支持,本节将讲解APP初始化API。
3.1前置代码
server 启动参数
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
声明driver对象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
3.2 安装APK到手机
driver.install_app(app_path)
参数:app_path:脚本机器中APK文件路径
3.3 手机中移除APP
driver.remove_app(app_id)
参数:app_id:需要卸载的app包名
3.4 判断APP是否已安装
driver.is_app_installed(bundle_id)
参数:bundle_id: 可以传入app包名,返回结果为True(已安装) / False(未安装)
3.5 发送文件到手机
import base64
data = str(base64.b64encode(data.encode('utf-8')),'utf-8')
driver.push_file(path,data)
参数:
path:手机设备上的路径(例如:/sdcard/a.txt)
data:文件内数据,要求base64编码
Python3.x中字符都为unicode编码,而b64encode函数的参数为byte类型,需要先转码;
生成的数据为byte类型,需要将byte转换回去。
3.6 从手机中拉取文件
import base64
data = driver.pull_file(path) # 返回数据为base64编码
print(str(base64.b64decode(data),'utf-8')) # base64解码
参数: path: 手机设备上的路径
3.7获取当前屏幕内元素结构
driver.page_source
作用:返回当前页面的文档结构,判断特定的元素是否存在
四、手机控件查看工具uiautomatorviewer
4.1 工具简介
用来扫描和分析Android应用程序的UI控件的工具.
4.1 如何使用
- 进入SDK目录下的tools目录,打开uiautomatorviewer
- 电脑连接真机或打开android模拟器
- 启动待测试app
- 点击uiautomatorviewer的左上角Device Screenshot,会生成app当前页面的UI控件截图
- 选择截图上需要查看的控件,即可浏览该控件的id,class,text,坐标等信息
五、APP元素定位操作
手工测试主要通过可见按钮操作,而自动化是通过元素进行交互操作。
元素的基本定位基于当前屏幕范围内展示的可见元素。
5.1 Appium常用元素定位方式
| name | value |
| --- | --- |
| id | id属性值 |
| class | class属性值 |
| xpath | xpath表达式 |
5.2 前置代码
from appium import webdriver
server 启动参数
desired_caps = {}
设备信息
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
声明我们的driver对象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
5.3 通过id定位
- 方法:find_element_by_id(id_value) # id_value:为元素的id属性值
- 业务场景:
1. 进入设置页面
2. 通过ID定位方式点击搜索按钮 - 代码实现:
driver.find_element_by_id("com.android.settings:id/search").click()
driver.quit()
5.4 通过class定位 - 方法:find_element_by_class_name(class_value) # class_value:为元素的class属性值
- 业务场景:
1. 进入设置页面
2. 点击搜索按钮
3. 通过class定位方式点击输入框的返回按钮 - 代码实现:
id 点击搜索按钮
driver.find_element_by_id("com.android.settings:id/search").click()
class 点击输入框返回按钮
driver.find_element_by_class_name('android.widget.ImageButton').click()
driver.quit()
5.5 通过xpath定位
-
方法:find_element_by_xpath(xpath_value) # xpath_value:为可以定位到元素的xpath语句
android端xptah常用属性定位:- id ://*contains(@resource-id,'[com.android.settings:id/search')]
- class ://*[contains(@class,'android.widget.ImageButton')]
- text ://*[contains(@text,'WLA')]
模糊定位 contains(@key,value): value可以是部分值
业务场景:
1. 进入设置页面
2. 点击WLAN菜单栏-
代码实现:
xpath 点击WLAN按钮
driver.find_element_by_xpath("//*[contains(@text,'WLA')]").click()
5.6 定位一组元素,注意element -> elements
应用场景为元素值重复,无法通过元素属性直接定位到某个元素,只能通过elements方式来选择,返回一个定位对象的列表.
5.7 通过id方式定位一组元素 方法: find_elements_by_id(id_value) # id_value:为元素的id属性值
业务场景:
1. 进入设置页面
2. 点击WLAN菜单栏(id定位对象列表中第1个)-
代码实现:
定位到一组元素
title = driver.find_elements_by_id("com.android.settings:id/title")
打印title类型,预期为list
print(type(title))
取title返回列表中的第一个定位对象,执行点击操作
title[0].click()
5.8 通过class方式定位一组元素 方法:find_elements_by_class_name(class_value) # class_value:为元素的class属性值
业务场景:
1.进入设置页面
2.点击WLAN菜单栏(class定位对象列表中第3个)-
代码实现:
title = driver.find_elements_by_class_name("android.widget.TextView")打印title类型,预期为list
print(type(title))
取title返回列表中的第一个定位对象,执行点击操作
title[3].click()
for index, item in enumerate(ele_list):
print(index, item.text) ```
5.9 通过xpath方式定位一组元素 方法:find_elements_by_xpath(xpath_value) # xpath_value:为可以定位到元素的xpath语句
业务场景:
1. 进入设置页面
2. 点击WLAN菜单栏(xpath中class属性定位对象列表中第3个)-
代码实现:
定位到一组元素
title = driver.find_elements_by_xpath("//*[contains(@class,'widget.TextView')]")
打印title类型,预期为list
print(type(title))
取title返回列表中的第一个定位对象,执行点击操作
title[3].click()