Python3_Appium_QQ 实战

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

 

 

 

 

 

             

 

 

 

 

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/

Python3_Appium_QQ 实战_第1张图片
# > 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”命令回车。
Python3_Appium_QQ 实战_第2张图片
如果出现如上图信息,表示 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/

Python3_Appium_QQ 实战_第3张图片
当前最新版本为 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 进行解压,如下:

Python3_Appium_QQ 实战_第4张图片
点击“appium-installer.exe”进行安装。

Python3_Appium_QQ 实战_第5张图片
根据提示,一步一步进行安装,这里不再啰嗦。最终在会桌面上生成 Appium 图标,当我双击图标时,
那么新的问题来了。

Python3_Appium_QQ 实战_第6张图片
这个简单,百度“.net framework 4.0” ,百度软件中心提供该框架的下载,将其下载并安装即可。

Python3_Appium_QQ 实战_第7张图片
安装完成,再次启动 Appium,再次弹出提示:

Python3_Appium_QQ 实战_第8张图片
好吧,再次百度“.net framework 4.5”,进行下载安装。
Python3_Appium_QQ 实战_第9张图片

好吧!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 程序

Python3_Appium_QQ 实战_第10张图片

 

安装 SDK Platform-Tools
Android SDK Platform-tools 是版本有区别的工具文件夹,里面有 adb aaptfastboot 等工具包。在
AndroidDevTools.cn 网站上找到 Android SDK Platform-tools 下载链接。

 

把解压出来的 platform-tools 文件夹放在 android sdk 根目录下,并把 adb 所在的目录添加到系
PATH 路径里(这个我们在设置 android 环境变量时已经添加)

打开 Windows 命令提示符,通过“appium-doctor”命令检查 appium 环境

Python3_Appium_QQ 实战_第11张图片

出现“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 启动。界面如下: 

Python3_Appium_QQ 实战_第12张图片

uiautomatorviewer.bat
此工具位于...\android-sdk-windows\tools\目录下,双击 uiautomatorviewer.bat 启动。界面如下: 

Python3_Appium_QQ 实战_第13张图片

扩展理解:
该工具主要用来查看控件的属性,比如 resource idclass name 等。我们后面的对象定位中会经常用到
它,犹如 firefox 浏览器中的 firebug 工具一样重要。当然,它也可查看被测 app appPackageDesired
Capabilities 中使用),这也是我们在此处展示它的目的 

反编译 APP

一定要会一些逼格技能。那就是可以通过反编译 app 的方式来查看 app

Activity
我们以...\android-sdk-windows\samples\android-19\legacy\ApiDemos\assets 目录下的 HelloActivity.apk
例。复制并重命名为 HelloActivity.zip,并将其解压到一个指定的目录: 

Python3_Appium_QQ 实战_第14张图片

接下来需要借助两个小工具:
dex2jar http://sourceforge.net/projects/dex2jar/
jd-gui http://jd.benow.ca/
把解压之后的 classes.dex 文件拷贝到 dex2jar 目录: 

Python3_Appium_QQ 实战_第15张图片

dex2jar-2.0 目录下输入:d2j-dex2jar.bat classes.dex 

Python3_Appium_QQ 实战_第16张图片

然后在当前目录下就生成了一个 classes-dex2jar.jar 的文件。下面就可以通过 jd-gui 工具来打开这个 jar文件 

Python3_Appium_QQ 实战_第17张图片

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 包的名字) 

Python3_Appium_QQ 实战_第18张图片

 

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

Python3_Appium_QQ 实战_第19张图片

 

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')

 

控件定位

  1. Name定位
  2. Id定位
  3. Class name定位

buttons = driver.find_elements_by_class_name("android.widget.Button")
#第一个元素
buttons.pop(0).click()
#第二个元素
buttons.pop(1).click()
#最后个元素
buttons.pop().click() 

 

  1. Accessibility id 定位
  2. Android uiautomator定位

这个方法也属于 appium 扩展的定位方法。
如何获得 UIAutomator 参数
可以使用 UIAutomatorViewer.bat 工具直接查看。
UIAutomator 获取控件的方式多种多样,都是通过 UiSelector 对象来去查找,比如使用 view text
本去当前窗口查找控件,这里不做累述,往后会另起一篇文章来描述 UIAUtomator 获取控件的方式,到时
直接套用进来就可以了。 

工具目录在 :D:\Sdk\tools\bin

Python3_Appium_QQ 实战_第20张图片

 

Python3_Appium_QQ 实战_第21张图片

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()

  1. Xpath定位
  2. 其他定位

Inspector sesson 工具,appium 自带定位工具,可以直接定位到ID  和 xpath

Python3_Appium_QQ 实战_第22张图片

 

 

普通定位

Python3_Appium_QQ 实战_第23张图片

 

脚本录制:

Python3_Appium_QQ 实战_第24张图片

快速理解 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 参数详解:

Python3_Appium_QQ 实战_第25张图片

Python3_Appium_QQ 实战_第26张图片

Android特有

Python3_Appium_QQ 实战_第27张图片

 

Python3_Appium_QQ 实战_第28张图片

Python3_Appium_QQ 实战_第29张图片

Python3_Appium_QQ 实战_第30张图片

Ios特有

Python3_Appium_QQ 实战_第31张图片

Python3_Appium_QQ 实战_第32张图片

Python3_Appium_QQ 实战_第33张图片

 

测试实例

appium 只支持 android chromeChromium 等浏览器执行移动 web 应用 

 

转载于:https://my.oschina.net/u/3447023/blog/1928867

你可能感兴趣的:(Python3_Appium_QQ 实战)