Appium环境搭建及使用
一、安装node.js
1、到官网下载node.js:https://nodejs.org/en/download/
2、安装完成后,运行cmd,输入node –v,如果安装成功,会输出如下版本信息:
![image-20210923104902379](https://note-img.jiner.wang/image-20210923104902379.png)
二、配置Android sdk环境
参见https://jiner.wang/monkey%e5%ae%89%e8%a3%85%e4%b8%8e%e9%85%8d%e7%bd%ae/
三、安装Appium Server
1.下载安装文件:https://github.com/appium/appium-desktop/releases/tag/v1.15.1
2.直接双击exe文件安装就好,桌面会生成一个appium的图标
3.把node_modules的bin目录放到系统的Path路径里
![image-20210923105124884](https://note-img.jiner.wang/image-20210923105124884.png)
4.检查appium所需的环境是否OK:
进入cmd命令行,输入appium-doctor ,出现以下提示,All Checks were successful ,说明环境成功。
![image-20210923105156733](https://note-img.jiner.wang/image-20210923105156733.png)
5、或者单独安装Appium-windows-1.15.1.exe包后,在安装界面话工具Appium Desktop
四、安装Appium-python-Client
使得appium和python建立连接关系,使用命令:pip install Appium-Python-Client,出现如下截图,则说明安装成功。
![image-20210923190819955](https://note-img.jiner.wang/image-20210923190819955.png)
五、自动化原理
Appium自动化的原理图
![](https://note-img.jiner.wang/20200223122125834.png)
3个主体部分 : 自动化程序、Appium Server、移动设备
- 自动化程序自动化程序是由我们来开发的,实现具体的 手机自动化 功能。要发出具体的指令控制手机,也需要使用 客户端库。和Selenium一样,Appium 组织 也提供了多种编程语言的客户端库,包括 java,python,js, ruby等,方便不同编程语言的开发者使用。我们需要安装好客户端库,调用这些库,就可以发出自动化指令给手机。
- Appium Server
Appium Server 是 Appium 组织开发的程序,它负责管理手机自动化环境,转发 自动化程序的控制指令 给 手机,并且转发 手机给 自动化程序的响应消息。
- 手机设备我们这里说的手机设备,其实不仅仅是手机,包括所有 苹果、安卓的移动设备,比如:手机、平板、智能手表等。当然手机上也包含了 我们要自动化控制的 手机应用APP。手机设备为什么能 接收并且处理自动化指令呢?因为,Appium Server 会在手机上 安装一个 自动化代理程序, 代理程序会等待自动化指令,并且执行自动化指令
比如:要模拟用户点击界面按钮,Appium 自动化系统的流程是这样的:
- 自动化程序 调用客户端库相应的函数, 发送
点击元素
的指令(封装在HTTP消息里)给 Appium Server - Appium Server 再转发这个指令给 手机上的自动化代理
- 手机上的自动化代理 接收到 指令后,调用手机平台的自动化库,执行点击操作,返回点击成功的结果给 Appium Server
- Appium Server 转发给 自动化程序
- 自动化程序了解到本操作成功后,继续后面的自动化流程
其中,自动化代理控制,使用的什么库来实现自动化的呢?
如果测试的是苹果手机, 用的是苹果的 XCUITest 框架 (IOS9.3版本以后)
如果测试的是安卓手机,用的是安卓的 UIAutomator 框架 (Android4.2以后)
这些自动化框架提供了在手机设备上运行的库,可以让程序调用这些库,像人一样自动化操控设备和APP,比如:点击、滑动,模拟各种按键消息等。
六、基本使用
1、一些常用方法
1)查看第三方包名
adb shell pm list package -3
![image-20210929111343694](https://note-img.jiner.wang/image-20210929111343694.png)
2)查找appActivity
应用已经安装在手机上了,可以直接打开手机上该应用,进入到你要操作的界面
然后执行
adb shell dumpsys activity recents | find "intent={"
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.stnts.iyoucloud/com.stnts.sly.android.activity.SplashAc
tivity}
intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] fl
g=0x10a00100 cmp=com.bbk.launcher2/.Launcher}
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER
] flg=0x30200000 cmp=com.tencent.mobileqq/.activity.SplashActivity}
intent={act=com.android.notification.permission.action.FRONT flg=0x10800000
cmp=com.android.systemui/com.vivo.systemui.statusbar.notification.permission.act
ivity.NotificationPermissionDialogActivity}
intent={act=android.intent.action.VIEW dat=content://com.tencent.mobileqq.fi
leprovider/external_files/storage/emulated/0/Android/data/com.tencent.mobileqq/T
encent/QQfile_recv/suileyou-qa-release-3.3.8.003.apk typ=application/vnd.android
.package-archive flg=0x10800003 cmp=com.android.packageinstaller/.InstallStart}
其中第一行就是当前的应用,我们特别关注最后
cmp=com.stnts.iyoucloud/com.stnts.sly.android.activity.SplashAc
tivity}
应用的package名称就是 tv.danmaku.bili
应用的启动Activity就是 .ui.splash.SplashActivity
3)adb 命令
使用 Python的 os.system()
或者 subprocess
来自动化调用它,完成我们的各种自动化需求。
比如,我们自动化过程中,可能需要截屏手机,并且下载到指定目录中
import os
os.system('adb shell screencap /sdcard/screen3.png && adb pull /sdcard/screen3.png')
- 查看目录
adb shell ls /sdcard
- 上传
adb push wv.apk /sdcard/wv.apk
#下载
adb pull /sdcard/new.txt
- 截屏
adb shell screencap /sdcard/screen.png
2、界面元素查看工具
常用的查看工具是: Android Sdk包中的 uiautomateviewer
和 Appium Desktop 中的 Appium Inspector
Appium Inspector
具体使用参看以下文档
https://jiner.wang/appium-inspector%e4%bd%bf%e7%94%a8/
uiautomateviewer
安卓查看APP界面元素,最常用的就是 Android SDK 中的工具 uiautomateviewer
,它在SDK目录目录 的 tools\bin 目录中
和Selenium一样,我们要定位选择元素,也是根据元素的特征,包括
- 元素的属性
- 元素的相对位置(相对父元素、兄弟元素等)
3、界面操作和常用命令
1)tap点按
WebElement 对象的 tap
方法和 click 类似,都是点击界面。但是最大的区别是, tap是 针对坐标
而不是针对找到的元素。inspect 查看该元素的bounds属性,它就是表示元素的左上角,右下角坐标的 坐标
tap 方法可以像这样进行调用
driver.tap([(850,1080)],300)
它 有 两个参数:
- 第一个参数是个列表,表示点击的坐标。注意最多可以有5个元素,代表5根手指点击5个坐标。所以是list类型。如果我们只要模拟一根手指点击屏幕,list中只要一个元素就可以了
- 第二个参数 表示 tap点按屏幕后 停留的时间。如果点按时间过长,就变成了长按操作了。
2)滑动
driver.swipe(start_x=x, start_y=y1, end_x=x, end_y=y2, duration=800)
前面4个参数 是 滑动起点 和 终点 的x、y坐标。
第5个参数 duration是滑动从起点到终点坐标所耗费的时间。
3)按键
调用 press_keycode
方法,就能模拟 按键动作,包括安卓手机的实体按键和 键盘按钮。
如下代码所示
from appium.webdriver.extensions.android.nativekey import AndroidKey
# 输入回车键,确定搜索
driver.press_keycode(AndroidKey.ENTER)
4)长按、双击、移动
Appium的 TouchAction 类提供了更多的手机操作方法,比如:长按、双击、移动
下面就是一个长按的例子
from appium.webdriver.common.touch_action import TouchAction
# ...
actions = TouchAction(driver)
actions.long_press(element)
actions.perform()
5)查看通知栏
打开通知栏
1、可以通过滑动方法实现
2、driver.open_notifications()
关闭通知栏
1、收起通知栏,可以使用前面介绍的模拟按键, 发出返回按键 的方法
4、一个例子
#coding=utf-8
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android' # 被测手机是安卓
desired_caps['platformVersion'] = '11' # 手机安卓版本
desired_caps['deviceName'] = 'IQOO' # 设备名,安卓手机可以随意填写
desired_caps['appPackage'] = '***' # 启动APP Package名称
desired_caps['appActivity'] = '***' # 启动Activity名称
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.implicitly_wait(5)
#如果有隐私协议,点击同意
if driver.find_element_by_id('btn_ok_pr'):
driver.find_element_by_id('btn_ok_pr').click()
l = driver.get_window_size()
x1 = int(l['width'] * 0.75)
y1 = int(l['height'] * 0.5)
x2 = int(l['width'] * 0.25)
# 向左滑动,一共四个广告页面
driver.swipe(x1, y1, x2, y1, 500)
driver.implicitly_wait(1)
driver.swipe(x1, y1, x2, y1, 500)
driver.implicitly_wait(1)
driver.swipe(x1, y1, x2, y1, 500)
driver.implicitly_wait(1)
driver.swipe(x1, y1, x2, y1, 500)
driver.find_element_by_id('start_new_world').click()
#获取游戏名称
eles=driver.find_elements_by_id('item_name')
for ele in eles:
print(ele.text)
driver.quit()