APP移动端测试高级

一、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 如何使用

  1. 进入SDK目录下的tools目录,打开uiautomatorviewer
  2. 电脑连接真机或打开android模拟器
  3. 启动待测试app
  4. 点击uiautomatorviewer的左上角Device Screenshot,会生成app当前页面的UI控件截图
  5. 选择截图上需要查看的控件,即可浏览该控件的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常用属性定位:

    1. id ://*contains(@resource-id,'[com.android.settings:id/search')]
    2. class ://*[contains(@class,'android.widget.ImageButton')]
    3. 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()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 一、Appium介绍 Appium是一个移动端的自动化框架,可用于测试原生应用、移动网页应用和混合型应用,且是跨平...
    Anwfly阅读 2,677评论 2 7
  • 一、Appium介绍 Appium是一个移动端的自动化框架,可用于测试原生应用、移动网页应用和混合型应用,且是跨平...
    九樱MOL阅读 948评论 0 0
  • appium介绍 appium是一个移动端的自动化框架,可用测试原生应用,移动网页应用,和混合型应用,且是跨平台的...
    楷0105阅读 252评论 0 0
  • 一、Appium介绍 Appium是一个移动端的自动化框架,可用于测试原生应用、移动网页应用和混合型应用,且是跨平...
    遗憾与人海中阅读 309评论 0 0
  • 知识概览 一、 移动端测试是什么 移动端测试是指对移动应用进行的测试,即实体的特性满足需求的程度。 二、 移动端测...
    __65a0阅读 1,868评论 1 10