2019独角兽企业重金招聘Python工程师标准>>>
Python3_Appium实战
-海盐
APPium移动自动化测试
样例中 测试的 app 使用的是 QQ;
Appium介绍
Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合
应用。
所谓的“移动原生应用”是指那些用 iOS 或者 Android SDK 写的应用(Application 简称 app)。所
谓的“移动 web 应用”是指使用移动浏览器访问的应用(Appium 支持 iOS 上的 Safari 和 Android 上的
Chrome)。所谓的“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。比如,
像 Phonegap,可以帮助开发者使用网页技术开发应用,然后用原生代码封装,这些就是混合应用。
重要的是,Appium 是一个跨平台的工具:它允许测试人员在不同的平台(iOS,Android)使用同一套
API 来写自动化测试脚本,这样大大增加了 iOS 和 Android 测试套件间代码的复用性。
Appium 与 Selenium
Appium 类库封装了标准 Selenium 客户端类库,为用户提供所有常见的 JSON 格式 selenium 命令以及
额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。
Appium 客户端类库实现了 Mobile JSON Wire Protocol(一个标准协议的官方扩展草稿)和 W3C
Webdriver spec(一个传输不可预知的自动化协议,该协议定义了 MultiAction 接口)的元素。
Appium 服务端定义了官方协议的扩展,为 Appium 用户提供了方便的接口来执行各种设备动作,例如
在测试过程中安装/卸载 app。这就是为什么我们需要 Appium 特定的客户端,而不是通用的 Selenium 客
户端。当然,Appium 客户端类库只是增加了一些功能,而实际上这些功能就是简单的扩展了 Selenium 客
户端,所以他们仍然可以用来运行通用的 Selenium 会话
支持多平台、多语言
appium 是跨平台的,可以用在 OSX,Windows 以及 Linux 桌面系统上运行。
appium选择了client-server的设计模式。 只要client 能够发送http请求给server, 那么的话client
用什么语言来实现都是可以的,这就是 appium 及 Selenium(WebDriver)如何做到支持多语言的;
appium 扩展了 webdriver 的协议,没有自己重新去实现一套。这样的好处是以前的 webdriver api 能
够直接被继承过来,以前的 Selenium(WebDriver)各种语言的 binding 都可以拿来就用,省去了为每种语
言开发一个 client 的工作量;
语言/框架 |
Github 版本库以及安装指南 |
Ruby |
https://github.com/appium/ruby_lib |
Python |
https://github.com/appium/python-client |
Java |
https://github.com/appium/java-client |
JavaScript (Node.js) |
https://github.com/admc/wd |
Objective C |
https://github.com/appium/selenium-objective-c |
PHP |
https://github.com/appium/php-client |
C# (.NET) |
https://github.com/appium/appium-dotnet-driver |
RobotFramework |
https://github.com/jollychang/robotframework-appiumlibrary |
APPium环境搭建
安装Appium
Appium 官方网站:http://appium.io/
# > npm install -g appium # get appium
# start appium
官方首页给出了 appium 的安装步骤。
所以,我们需要先安装 node.js 。node.js 官方网站:https://nodejs.org/
根据你的操作系统选择相应的版本进行下载。这里我以 Windows 7 (64) 为例进行安装,选择 Windows
installer(.msi) 64-bit 版本进行下载。
下载完成,双击进行安装,如下图。
安装完成,打开 Windows 命令提示符,敲入“npm”命令回车。
如果出现如上图信息,表示 node.js 安装成功。
npm 是一个 node 包管理和分发工具,已经成为了非官方的发布 node 模块(包)的标准。有了 npm,
可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。
下面通过 npm 安装 Appium 。
C:\Users\fnngj>npm install -g appium
内部培训文档,半成品,不外传。
当然,这种方式的 Appium 会很慢,为尊重官网上的介绍
如果未安装该组件,请执行下列操作之一:
1)安装 Microsoft Windows SDK for Windows Server 2008 和 .NET Framework 3.5;
2) 安装 Microsoft Visual Studio 2008。
这是因为 Appium 是由.NET 开发的,所以,它会依赖 .NET framework 相关组件。你当然可以按照提
示下载安装 1)或 2)从而再次尝试安装 Appium 。
但其实,我们可以在 Appium 官方网站上下载操作系统相应的 Appium 版本。
https://bitbucket.org/appium/appium.app/downloads/
当前最新版本为 AppiumForWindows_1_4_0_0.zip ,注意这是一个 Windows 版本,如果你的电脑为
MAC 请下载 appium-1.3.7.dmg。虽然你已经看到了这些下载包,但我不保证你能下载的下来。
所以,再来提供一个百度网盘的下载链接:http://pan.baidu.com/s/1jGvAISu
我们以 Windows 为例,将下载的 AppiumForWindows_1_4_0_0.zip 进行解压,如下:
根据提示,一步一步进行安装,这里不再啰嗦。最终在会桌面上生成 Appium 图标,当我双击图标时,
那么新的问题来了。
这个简单,百度“.net framework 4.0” ,百度软件中心提供该框架的下载,将其下载并安装即可。
。
好吧,再次百度“.net framework 4.5”,进行下载安装。
好吧!Appium 终于可以启动起来了。至于 Appium 的原理和使用我们放到后面的章节进行介绍。
安装Androdi开发环境
安装 java 环境
众所周知,Android 是由 Java 语言开发的,所以想开发 Android 应用首先需要 Java 环境,所以,我们
首先需要安装 Java 环境。
java 下载地址:http://www.java.com/zh_CN/download/manual.jsp
小知识:
java 环境分 JDK 和 JRE ,JDK 就是 Java Development Kit.简单的说 JDK 是面向开发人员使用的
SDK,它提供了 Java 的开发环境和运行环境。JRE 是 Java Runtime Enviroment 是指 Java 的运行环境,
是面向 Java 程序的使用者,
双击下载的 JDK ,设置安装路径。这里我们选择默认安装在
D:\Program Files (x86)\Java\jdk1.8.0_25 目录下。
下面设置环境变量:
“我的电脑”右键菜单--->属性--->高级--->环境变量--->系统变量-à新建..
变量名:JAVA_HOME
变量值:D:\Program Files (x86)\Java\jdk1.8.0_25
变量名:CALSS_PATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
找到 path 变量名—>“编辑”添加:
变量名:PATH
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
在 Windows 命令提示符下验证 java 是否成功:
cmd.exe
……
C:\Users\fnngj>java
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-d32 使用 32 位数据模型 (如果可用)
-d64 使用 64 位数据模型 (如果可用)
-server 选择 "server" VM
-hotspot 是 "server" VM 的同义词 [已过时]
默认 VM 是 server.
……
C:\Users\fnngj>javac
用法: javac
其中, 可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
……
安装 android adt & SDK
Android SDK:
Android SDK 提供了你的 API 库和开发工具构建,测试和调试应用程序,Android。简单来讲,Android
SDK 可以看做用于开发和运行 Android 应用的一个软件。
扩展理解:
ADT(Android Development Tools): 目前 Android 开发所用的开发工具是 Eclipse,在
Eclipse 编译 IDE 环境中,安装 ADT,为 Android 开发提供开发工具的升级或者变更,简单理
解为在 Eclipse 下开发工具的升级下载工具。adt 只是一个 eclipse 的插件,里面可以设置
sdk 路径
SDK(Software Development Kit): 一般是一些被软件工程师用于为特定的软件包、软件
框架、硬件平台、操作系统等建立应用软件的开发工具的集合。在 Android 中,他为开发者
提供了库文件以及其他开发所用到的工具。简单理解为开发工具包集合,是整体开发中所用
到的工具包,如果你不用 Eclipse 作为你的开发工具,你就不需要下载 ADT,只下载 SDK 即
可开发。SDK 可以自己编译,在 linux 环境下通过 make 命令进行,耗时比较长,需要有耐心
哦亲。。。然后我们可以把自己编译的 SDK 通过 ADT 导入 eclipse。在此基础上可以对源码
包进行修改,比如修改 android system/app/phone.apk 中的源码,
通过官方地址下载:http://developer.android.com/sdk/index.html
当然,我不能保证你可以访问到这个地址,原因你懂的!
这里提供 adt-bundle 下载链接:
http://dl.google.com/android/adt/adt-bundle-windows-x86-20140702.zip
https://dl.google.com/android/adt/adt-bundle-windows-x86_64-20140702.zip
http://dl.google.com/android/adt/adt-bundle-mac-x86_64-20140702.zip
http://dl.google.com/android/adt/adt-bundle-linux-x86-20140702.zip
http://dl.google.com/android/adt/adt-bundle-linux-x86_64-20140702.zip
Android-sdk 下载地址:
http://dl.google.com/android/android-sdk_r23.0.2-windows.zip
http://dl.google.com/android/installer_r23.0.2-windows.exe
http://dl.google.com/android/android-sdk_r23.0.2-macosx.zip
内部培训文档,半成品,不外传。
http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz
根据我的验证 adt 和 sdk 都可以用来运行 android 模拟器,所以下载哪个都可以。下载链接中已经
标识了系统信息,请根据自己的操作系统下载相应的版本。
或者通过虾面地址进行下载
http://www.android-studio.org/
下面设置 Android 环境变量,方法与 java 环境变量类似。我本机的目录结果为:
D:\android\android-sdk-windows
下面设置环境变量:
“我的电脑”右键菜单--->属性--->高级--->环境变量--->系统变量-à新建..
变量名:ANDROID_HOME
变量值:D:\android\android-sdk-windows
找到 path 变量名—>“编辑”添加:
变量名:PATH
变量值:;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
SDK Manager 安装模拟器
双击启动 SDK Manager.exe 程序
安装 SDK Platform-Tools
Android SDK Platform-tools 是版本有区别的工具文件夹,里面有 adb 、aapt、fastboot 等工具包。在
AndroidDevTools.cn 网站上找到 Android SDK Platform-tools 下载链接。
把解压出来的 platform-tools 文件夹放在 android sdk 根目录下,并把 adb 所在的目录添加到系
统 PATH 路径里(这个我们在设置 android 环境变量时已经添加)。
打开 Windows 命令提示符,通过“appium-doctor”命令检查 appium 环境
出现“All Checks were successful”的提示,说明基本环境已经搞好
安装Appium client
Appium Client 是对 webdriver 原生 api 的一些扩展和封装。它可以帮助我们更容易的写出用例,写出
更好懂的用例。
Appium Client 是配合原生的 webdriver 来使用的,因此二者必须配合使用缺一不可。
在本文档的开始已经介绍 Appium 支持多种编程语言编写自动化测试脚本,由于我个人熟悉 Python 语
言,所以选择 Python 语言来编写自动化测试脚本。
访问 Python 官方网站:https://www.Python.org/
安装Python3.6
通过pip 安装 pip install robotframework-appiumlibrary
第一个自动化脚本:
#coding=utf-8
from appium import webdriver
from time import sleep
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1.1'
desired_caps['deviceName'] = 'WXMDU17125001425'
desired_caps['appPackage'] = 'com.tencent.mobileqq'
desired_caps['appActivity'] = '.activity.SplashActivity'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
sleep(20)
login=driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.Button[1]")
login.click()
sleep(20)
driver.quit()
在安装的过程中我们横跨三大编程语言,Appium 是基于.NET 框架开发的,android 是基于 JAVA 开发的,而 client 端我们选用 Python 语言来编写自动化脚本。
这就要求测试人员对编程语言要有一定的基础和认识
APPium基础
Desired Capabilities 详解
Desired Capabilities 在启动 session 的时候是必须提供的。
Desired Capabilities 本质上是以 key value 字典的方式存放,它告诉 appium server 这样一些事情:
l 本次测试是启动浏览器还是启动移动设备?
l 是启动 andorid 还是启动 ios?
l 启动 android 时,app 的 package 是什么?
l 启动 android 时,app 的 activity 是什么?
from selenium.webdriver import Remote
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'platform': 'ANY',
'browserName':'chrome',
'version': '',
'javascriptEnabled': True
})
Ø 'platform': 'ANY' 平台默认可以是任何(Windows,MAC,android)。
Ø 'browserName': 'chrome' 浏览器名字是 chrome。
Ø 'version': '' 浏览器的版本默认为空。
Ø 'javascriptEnabled': True javascript 启动状态为 True。
Appium 的 Desired Capabilities 是扩展了 webdriver 的 Desired Capabilities 的。
Ø automationName:使用哪种自动化引擎:
appium(默认)还是 Selendroid?
Ø platformName:使用哪种移动平台:
iOS, Android, orFirefoxOS?
Ø deviceName:启动哪种设备,是真机还是模拟器?
iPhone Simulator, iPad Simulator, iPhoneRetina 4-inch, Android Emulator, Galaxy S4, etc...
Ø app:应用的绝对路径,注意一定是绝对路径。如果指定了 appPackage 和 appActivity 的话,这个
属性是可以不设置的。另外这个属性和 browserName 属性是冲突的。
Ø browserName:移动浏览器的名称。比如 Safari' for iOS and 'Chrome', 'Chromium', or 'B
rowser' for Android;与 app 属性互斥。
Ø udid:物理机的 id。比如 1ae203187fc012g。(UDID 是由子母和数字组成的字符串的序号,用来
区别每一个唯一的 Android/iOS 设备。)
Android
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.2'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['app'] = PATH('../../../apps/selendroid-test-app.apk')
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
下面这些属性是 android 平台特定的:
Ø appActivity:待测试的 app 的 Activity 名字。比如 MainActivity, .Settings。注意,原生 app 的
话要在 activity 前加个"."。
Ø appPackage:待测试的 app 的 java package。比如 com.example.android.myApp, com.an
droid.settings。
IOS
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'iOS'
desired_caps['platformVersion'] = '7.1'
desired_caps['deviceName'] = 'iPhone Simulator'
desired_caps['app'] = PATH('../../apps/UICatalog.app.zip')
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
必备工具
先来看 app 的的 Package 如何获取。与此同时我们会接触到两个具:monitor.bat 和
uiautomatorviewer.bat。这两个工具是在做 android 自动化过程中必须会用的两个辅助工具,这里做个简单
的介绍。
monitor.bat
此工具位于...\android-sdk-windows\tools\目录下,双击 monitor.bat 启动。界面如下:
uiautomatorviewer.bat
此工具位于...\android-sdk-windows\tools\目录下,双击 uiautomatorviewer.bat 启动。界面如下:
扩展理解:
该工具主要用来查看控件的属性,比如 resource id,class name 等。我们后面的对象定位中会经常用到
它,犹如 firefox 浏览器中的 firebug 工具一样重要。当然,它也可查看被测 app 的 appPackage(Desired
Capabilities 中使用),这也是我们在此处展示它的目的
反编译 APP
一定要会一些逼格技能。那就是可以通过反编译 app 的方式来查看 app
的 Activity。
我们以...\android-sdk-windows\samples\android-19\legacy\ApiDemos\assets 目录下的 HelloActivity.apk 为
例。复制并重命名为 HelloActivity.zip,并将其解压到一个指定的目录:
接下来需要借助两个小工具:
dex2jar :http://sourceforge.net/projects/dex2jar/
jd-gui :http://jd.benow.ca/
把解压之后的 classes.dex 文件拷贝到 dex2jar 目录:
在 dex2jar-2.0 目录下输入:d2j-dex2jar.bat classes.dex
然后在当前目录下就生成了一个 classes-dex2jar.jar 的文件。下面就可以通过 jd-gui 工具来打开这个 jar文件
HelloActivity 就是待测 app 的 main activity。当然,因为这个 apk 属于一个 demo 所以非常
简单,对于一些项目的 apk,要想找到 app 的 activity 还需要你在 Java 代码的熟悉
多渠道打包工具
利用 Apktool 工具,该工具为 Android 多渠道打包工具。
Apktool 下载地址:https://github.com/wubo/apptools
在克隆下来的...\apptools\apktool\windows\目录中会找到 aapt.exe 工具。我们实际要用的就是这个工具。
它可以获取 apk 包的信息。
在当前目录下输入“aapt”命令可以查看该工具的使用。
将该路径加到系统环境变量 path 中,或将 aapt.exe 与要查看的 apk 包放在同一个目录下。通过“aapt
dump badging xxx.apk”命令查看。(xxx 替换为要查看的 apk 包的名字)
aapt dump badging xxx.apk >1.txt
aapt命令是android SDK 中的一个工具,功能强大,比如在windows平台获取apk包的信息。
使用该工具准备条件,也即获取aapt.exe文件的方式(2选1即可):
- 安装android SDK 包(java虚拟机也是需要的),可执行文件aapt.exe一般默认路径C:\Users\你的用户名\AppData\Local\Android\android-sdk\platform-tools 。
- 或者在http://code.google.com/p/android-apktool/downloads/list 下载apktool-install-windows-r05-ibot.tar.bz2,获取aapt.exe文件。
为确保运行,可添加到环境变量或者在cmd窗口中中cd到对应路径执行
为了方便使用,请将aapt.zip附件下载到文件夹解压开,然后通过cmd 进入目录,使用aapt
desired_caps['appPackage'] = 'com.tencent.mobileqq'
desired_caps['appActivity'] = '.activity.SplashActivity'
例子 :android 设置
#coding=utf-8
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.2'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
Android 浏览器
#coding=utf-8
from appium import webdriver
desired_caps = {
'platformName': 'Android',
'platformVersion': '4.4.4',
'deviceName': '095EB88A',
'browserName': 'Browser',
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
print("start baidu page!")
driver.get('http://www.baidu.com')
控件定位
Name定位Id定位Class name定位
buttons = driver.find_elements_by_class_name("android.widget.Button")
#第一个元素
buttons.pop(0).click()
#第二个元素
buttons.pop(1).click()
#最后个元素
buttons.pop().click()
Accessibility id 定位- Android uiautomator定位
这个方法也属于 appium 扩展的定位方法。
如何获得 UIAutomator 参数
可以使用 UIAutomatorViewer.bat 工具直接查看。
UIAutomator 获取控件的方式多种多样,都是通过 UiSelector 对象来去查找,比如使用 view 的 text 文
本去当前窗口查找控件,这里不做累述,往后会另起一篇文章来描述 UIAUtomator 获取控件的方式,到时
直接套用进来就可以了。
工具目录在 :D:\Sdk\tools\bin
driver.find_element_by_android_uiautomator('new
UiSelector().text("8")').click()
driver.find_element_by_android_uiautomator('new
UiSelector().description("multiply")').click()
driver.find_element_by_android_uiautomator('new
UiSelector().text("5")').click()
driver.find_element_by_android_uiautomator('new
UiSelector().description("equals")').click()
driver.find_element_by_name("8").click()
Xpath定位- 其他定位
Inspector sesson 工具,appium 自带定位工具,可以直接定位到ID 和 xpath
普通定位
脚本录制:
快速理解 session/token/cookie 认证方式
Cookie
Web Application 一般以 HTTP 协议作为传输协议, 但 HTTP 协议是无状态的. 也就是说 server-side 与 client-side 一旦数据交换完毕后,两者之间的连接就会被关闭. client-side 再次发送请求时, 需要建立新的连接, 这就意味着 server-side 和 client-side 两者之间无法通过 HTTP 的连接来实现 会话跟踪. 显然, 这是不合理的, 因为这样无法保证完成一次 Web Application 业务流程中所产生的若干次 请求/响应 操作的原子性, 从而会导致业务逻辑混乱. cookie 就是为了解决这一问题所引入的 会话跟踪机制.
实现原理: 由 server-side 为 client-side 发放一张通行证, 并以此来认证 client-side 的身份(出于安全性的考虑, 这张通行证一般是临时的). 而这些通行证就是 cookie, 本质上 cookie 就是一小段文本信息, 里面包含了有如 session_id/login-status/token 等认证相关数据.
session
基于 session 的用户认证借助于请求体对象 req 中的 session 数据来完成.
实现原理: 当 client-side 请求 server-side 并通过身份认证后, server-side 就会生成并保存身份认证相关的 session 数据, 并将对应的 sesssion_id 写入 cookie 然后再响应到 client-side, client-side 会把 cookie 文件保存在本地. 此后, client-side 的所有请求都会附带该 session_id, 以确定 server-side 是否存在对应的 session 数据以及检验 session 数据中的 login-status. 如果存在且 login-status 为 True, 则证明 client-side 是被信任的, 无须再次认证身份. 否则, 需要重新进入身份认证流程.
缺点:
- server-side 保存 session 数据会增加运维和存储开销
- 因为一个 session_id 只能被保存有对应 session 数据的 server-side 完成认证, 所以在拥有多台 server-side 集群架构的场景中会降低其扩展性.
- 如果原生 App 不具备 cookie 功能模块, 就会加大其接入 session 认证后端的难度.
简而言之, session 有如用户信息档案表, 里面包含了用户的认证信息和登录状态等信息. 而 cookie 就是用户通行证.
Token
token(令牌) 由 uid+time+sign[+固定参数] 组成:
- uid: 用户唯一身份标识
- time: 当前时间的时间戳
- sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
- 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库
- 由其组成可以看出, token 的认证方式类似于临时的证书签名, 并且是一种 server-side 无状态的认证方式, 非常适合于 REST API 的场景. 所谓无状态就是 server-side 并不会保存身份认证相关的数据, token 只被保存在 client-side 中的 cookie 或 localstorage(数据库).
- 实现原理: 当 client-side 发送请求 server-side 并完成身份认证后, server-side 会生成但不保存一个 token, 而是将 token 以 cookie 或其他形式响应给 client-side. 此后 client-side 发送请求时都会在 Request-Header 中附带 token, server-side 收到 token 后再分发给其他的 身份认证服务 负责处理认证相关的业务. E.G. Openstack 中的 Keystone 项目会为整个云平台提供身份认证服务.
- 缺点:
- 因为 token 一般都是 hash/encrypt 的字符串, 所以会额外附加 加密/解密 的性能开销
- 有些加密方式同样存在安全隐患
Appium API
终端方式 |
操作动作 |
WEB |
输入、点击、鼠标悬停、清除等 |
APP(手机) |
锁定、解锁、滑屏、摇晃、重启等 |
应用操作
#安装app
app_path='E:\\qq.apk'
driver.install_app(app_path=app_path)
#卸载app
'''
需要获得 desired_caps['appPackage']='com.tencent.mobileqq'
'''
driver.remove_app("com.tencent.mobileqq")
#关闭app
'''
默认关闭,当前的应用,至于后台
'''
driver.close_app()
#检查应用安装是否成功
'''
检查应用是否安装,需要传入应用的name ,也就是desired_caps['appPackage']='com.tencent.mobileqq'
'''
driver.is_app_installed("com.tencent.mobileqq")
#启动app
'''
该方法比较特殊,定义在配合 driver.close_app() 进行同步使用
'''
driver.close_app()
driver.launch_app()
#将应用app至于后台
'''
将当前应用至于后台,需要传入 package
'''
driver.background_app("com.tencent.mobileqq")
#应用app重置
'''
重置应用,等于是 重新将应用 安装且打开;
'''
driver.reset()
上下文操作
#获取可用上下文
'''
获取当前所有可用的上下文,
'''
ct=driver.contexts
#获取当前上下文
cct=driver.current_context
#切换上下文
'''
切换到特定的上下文
'''
driver.switch_to.context(" 例如:获取的当前上下文")
案例
#coding=utf-8
from appium import webdriver
desired_caps = {}
desired_caps = {
'platformName': 'Android',
'platformVersion': '4.4.4',
'deviceName': '095EB88A',
'browserName': 'Browser',
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
print("start baidu page!")
driver.get('https://www.baidu.com')
#获取当前上下文
cct = driver.current_context
print( cct)
#切换为 web
driver.switch_to.context('WEBVIEW_1')
driver.find_element_by_id("kw").send_keys("appium")
driver.find_element_by_id("su").click()
driver.quit()
键盘操作
driver.find_element_by_id("kw").send_keys("appium")
键码操作
Driver.keyevent()
KEYCODE_CALL 拨号键 5
KEYCODE_ENDCALL 挂机键 6
KEYCODE_HOME 按键 Home 3
KEYCODE_MENU 菜单键 82
KEYCODE_BACK 返回键 4
KEYCODE_SEARCH 搜索键 84
KEYCODE_CAMERA 拍照键 27
KEYCODE_FOCUS 拍照对焦键 80
KEYCODE_POWER 电源键 26
KEYCODE_NOTIFICATION 通知键 83
KEYCODE_MUTE 话筒静音键 91
KEYCODE_VOLUME_MUTE 扬声器静音键 164
KEYCODE_VOLUME_UP 音量增加键 24
KEYCODE_VOLUME_DOWN 音量减小键 25
控制键
KEYCODE_ENTER 回车键 66
KEYCODE_ESCAPE ESC 键 111
KEYCODE_DPAD_CENTER 导航键 确定键 23
KEYCODE_DPAD_UP 导航键 向上 19
KEYCODE_DPAD_DOWN 导航键 向下 20
KEYCODE_DPAD_LEFT 导航键 向左 21
KEYCODE_DPAD_RIGHT 导航键 向右 22
KEYCODE_MOVE_HOME 光标移动到开始键 122
KEYCODE_MOVE_END 光标移动到末尾键 123
KEYCODE_PAGE_UP 向上翻页键 92
KEYCODE_PAGE_DOWN 向下翻页键 93
KEYCODE_DEL 退格键 67
KEYCODE_FORWARD_DEL 删除键 112
KEYCODE_INSERT 插入键 124
KEYCODE_TAB Tab 键 61
KEYCODE_NUM_LOCK 小键盘锁 143
KEYCODE_CAPS_LOCK 大写锁定键 115
KEYCODE_BREAK Break/Pause 键 121
KEYCODE_SCROLL_LOCK 滚动锁定键 116
KEYCODE_ZOOM_IN 放大键 168
KEYCODE_ZOOM_OUT 缩小键 169
组合键
KEYCODE_ALT_LEFT Alt+Left
KEYCODE_ALT_RIGHT Alt+Right
KEYCODE_CTRL_LEFT Control+Left
KEYCODE_CTRL_RIGHT Control+Right
KEYCODE_SHIFT_LEFT Shift+Left
KEYCODE_SHIFT_RIGHT Shift+Right
基本
KEYCODE_0 按键'0' 7
KEYCODE_1 按键'1' 8
KEYCODE_2 按键'2' 9
KEYCODE_3 按键'3' 10
KEYCODE_4 按键'4' 11
KEYCODE_5 按键'5' 12
KEYCODE_6 按键'6' 13
KEYCODE_7 按键'7' 14
KEYCODE_8 按键'8' 15
KEYCODE_9 按键'9' 16
KEYCODE_A 按键'A' 29
KEYCODE_B 按键'B' 30
KEYCODE_C 按键'C' 31
KEYCODE_D 按键'D' 32
KEYCODE_E 按键'E' 33
KEYCODE_F 按键'F' 34
KEYCODE_G 按键'G' 35
KEYCODE_H 按键'H' 36
KEYCODE_I 按键'I' 37
KEYCODE_J 按键'J' 38
KEYCODE_K 按键'K' 39
KEYCODE_L 按键'L' 40
KEYCODE_M 按键'M' 41
KEYCODE_N 按键'N' 42
KEYCODE_O 按键'O' 43
KEYCODE_P 按键'P' 44
KEYCODE_Q 按键'Q' 45
KEYCODE_R 按键'R' 46
KEYCODE_S 按键'S' 47
KEYCODE_T 按键'T' 48
KEYCODE_U 按键'U' 49
KEYCODE_V 按键'V' 50
KEYCODE_W 按键'W' 51
KEYCODE_X 按键'X' 52
KEYCODE_Y 按键'Y' 53
KEYCODE_Z 按键'Z' 54
TouchAction操作
手机,触摸动作的实践
按压操作
el =
driver.find_element_by_id("com.example.android.contactmanager:id/contactPhon
eEditText")
# 按压-----结束指针--
TouchAction(driver).press(el).release().perform()
TouchAction(driver).press(el).release().perform()
TouchAction(driver).press(x=0,y=308).release().perform()
除了 press()方法之外,本例中还用到了别外两个新方法。
relese()
结束的行动取消屏幕上的指针。内部培训文档,半成品,不外传。
Perform()
执行的操作发送到服务器的命令操作。
长按操作
duration 以毫秒为单位。1000 表示按一秒钟
TouchAction(driver).long_press(el).release().perform()
TouchAction(driver).long_press(x=0,y=308).release().perform()
TouchAction(driver).long_press(el,duration=2000).release().perform()
点击操作
TouchAction(driver).tap(el).release().perform()
TouchAction(driver).tap(x=0,y=308).release().perform()
TouchAction(driver).tap(el,count=2).release().perform()
移动操作
TouchAction(driver).move_to(el).release().perform()
TouchAction(driver).move_to(x=0,y=308).release().perform()
暂停操作
TouchAction(driver).wait(1000).release().perform()
TouchAction(driver).wait(5000).release().perform()
其他操作
Ios独有
锁定 driver.lock(5) 锁屏5s
摇晃 driver.shake()
Android 独有
获取当前activity driver.current_activity
收起键盘 driver.hide_keyboard()
滑动 driver.swipe(78,500,75,0.8)
swipe(self, start_x, start_y, end_x, end_y, duration=None)
start_x:开始滑动的 x 坐标。
start_y:开始滑动的 y 坐标。
end_x:结束滑动的 x 坐标。
end_y:结束滑动的 y 坐标。
duration:持续时间。
缩放屏幕
pinch(self, element=None, percent=200, steps=50)
例:
driver.pinch(element=el)
放大屏幕
zoom(self, element=None, percent=200, steps=50)
例:
driver.zoom(element=el)
位置拉取文件(将手机文件 拉取到本地PC)
pull_file(self, path)
例:
driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')
推送指定的文件(将PC文件,拉取到手机指定的位置)
push_file(self, path, base64data)
例:
data = "some data for the file"
path = "/data/local/tmp/file.txt"
driver.push_file(path, data.encode('base64'))
APPium参考
Desired Capabilities 参数详解:
Android特有
Ios特有
测试实例
appium 只支持 android 上 chrome, Chromium 等浏览器执行移动 web 应用