Appium-python-Android

Appium简介

Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。 它使用WebDriver协议驱动iOS,Android和Windows应用程序。
· Appium官网:http://appium.io/
· Appium github主页:https://github.com/appium?utf8=%E2%9C%93&q=&type=source&language=
· 官方中文文档:http://appium.io/docs/cn/about-appium/intro/
· Appium官方论坛:https://discuss.appium.io/latest
· Testerhome中文社区:https://testerhome.com/

Appium优势

· 可以跨平台同时支持android、ios
· 支持多种语言,java、python、php、Ruby等等
· 不用为复杂的环境发愁
· 如果你有selenium经验,直接上手。

Appium架构原理

Appium是在手机操作系统自带的测试框架基础上实现的,Android和iOS的系统上使用的工具分别如下:
· Android(版本>4.3):UIAutomator,Android 4.3之后系统自带的UI自动化测试工具。
· Android(版本≤4.3):Selendroid,基于Android Instrumentation框架实现的自动化测试工具。
· ·iOS:UIAutomation(instruments框架里面的一个模板),iOS系统自带的UI自动化测试工具。
Appium-python-Android_第1张图片

运行原理

我们的电脑(client)上运行自动化测试脚本,调用的是webdriver的接口,appium server接收到我们client上发送过来的命令后他会将这些命令转换为UIautomator认识的命令,然后由UIautomator来在设备上执行自动化。
Appium的架构原理如上图所示,由客户端(Appium Client)和服务器(Appium Server)两部分组成,客户端与服务器端通过JSON Wire Protocol进行通信。

Appium服务器

Appium服务器是Appium框架的核心。它是一个基于Node.js实现的HTTP服务器。Appium服务器的主要功能是接受从Appium客户端发起的连接,监听从客户端发送来的命令,将命令发送给bootstrap.jar(iOS手机为bootstrap.js)执行,并将命令的执行结果通过HTTP应答反馈给Appium客户端。

Bootstrap.jar。

Bootstrap.jar是在Android手机上运行的一个应用程序,它在手机上扮演TCP服务器的角色。当Appium服务器需要运行命令时,Appium服务器会与Bootstrap.jar建立TCP通信,并把命令发送给Bootstrap.jar;Bootstrap.jar负责运行测试命令。

Appium客户端。

它主要是指实现了Appium功能的WebDriver协议的客户端Library,它负责与Appium服务器建立连接,并将测试脚本的指令发送到Appium服务器。现有的客户端Library有多种语言的实现,包括Ruby、Python、Java、JavaScript(Node.js)、Object C、PHP和C#。Appium的测试是在这些Library的基础上进行开发的。

Appium组件
Appium Server

Appium Server就是Appium的服务端——一个web接口服务,使用Node.js实现。引用官网解释说明。
Appium is a server written in Node.js. It can be built and installed from source or installed directly from NPM:
$ npm install -g appium
$ appium

Appium Desktop

Appium Desktop是一款适用于Mac,Windows和Linux的开源应用程序,它以美观而灵活的用户界面为您提供Appium自动化服务器的强大功能。 它是几个Appium相关工具的组合:

  1. Appium Server的图形界面。 您可以设置选项,启动/停止服务器,查看日志等…您也不需要使用Node 的NPM来安装Appium,因为Node运行时与Appium Desktop捆绑在一起。
  2. 您可以使用Inspector查看应用程序的元素,获取有关它们的基本信息,并与它们进行基本的交互。
    Appium-python-Android_第2张图片
    Appium-python-Android_第3张图片
注意

Appium Desktop与Appium不同。 Appium Desktop是Appium的图形前端,带有其他工具。 Appium Desktop以其自己的节奏发布,并拥有自己的版本控制系统。 就像国内很多定制的Android系统有自己版本号,但是都是基于一个Android系统版本封装的。版本号不一定与Andriod原生系统版本号一致。如:魅族的flyme6.0系统的内核是Android 5.1

Appium GUI

Appium GUI是Appium desktop的前身。 这个也是把Appium server封装成了一个图形界面,降低使用门槛,如同最初的操作系统Dos都是敲命令,后面都是图形界面操作系统,如Windows系统。很多初学者对下面这个界面应该不陌生吧,这个就是Windows版本的Appium GUI界面。测试人员可以手动启动,配置相关server 服务,如果不用这个启动的话,需要命令启动服务。因为大部分教程都是基于这个GUI来讲解的,所以很多人一说Appium就认为是这个。
该产品的Windows版本在2015年的AppiumForWindows_1_4_16_1.zip之后就停止更新了。目前版本可以使用,但是封装的不是最新的Appium版本,而是1.4.16版本。如果要使用最新的桌面版需要使用Appium Desktop。
历史版本下载:https://bitbucket.org/appium/appium.app/downloads/
Appium-python-Android_第4张图片

Appium Clients

因为Appium是一个C/S结构,有了服务端的肯定还有客户端,Appium Clients就是客户端,它会给服务端Appium Server发送请求会话来执行自动化任务。就像我们浏览器访问网页,浏览器是客户端,通过操作发送请求服务器来获取数据。我们可以使用不同的客户端浏览器(IE,Firefox,Chrome)访问一个网站。 Appium客户端可以使用不同的语言来实现,如Python,java等。具体详见下表:

Language/Framework Github Repo and Installation Instructions
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-desktop

Appium-desktop主界面包含三个菜单Simple,Advanced、Presets
Simple
host:设置Appium server的ip地址,本地调试可以将ip地址修改为127.0.0.1
port:设置端口号,默认是4723不用修改
start server
启动 Appium server
Appium-python-Android_第5张图片

Advanced

高级参数配置修改,主要是一些Android和iOS设备,log路径等相关信息的配置。

Appium-python-Android_第6张图片
Appium-python-Android_第7张图片

presets

将Advanced中的一些配置信息作为预设配置。

启动Appium

启动后控制台提示如下信息,表示Appium启动成功。

[Appium] Welcome to Appium v1.7.2
[Appium] Non-default server args:
[Appium] address: 127.0.0.1
[Appium] Appium REST http interface listener started on 127.0.0.1:4723

参考资料

https://github.com/appium/appium-desktop
Appium-python-Android_第8张图片

什么是Capability

desired capability的功能是配置Appium会话。他们告诉Appium服务器您想要自动化的平台和应用程序。
Desired Capabilities是一组设置的键值对的集合,其中键对应设置的名称,而值对应设置的值。(如:“platformName”: “Android”)Desired Capabilities主要用于通知Appium服务器建立需要的Session。

Session

Appium的客户端和服务端之间进行通信都必须在一个Session的上下文中进行。客户端在发起通信的时候首先会发送一个叫作“Desired Capabilities”的JSON对象给服务器。服务器收到该数据后,会创建一个session并将session的ID返回到客户端。之后客户端可以用该session的ID发送后续的命令。

常用Capability配置讲解

Capability官方完整文档
如果有了解过Capability的人会发现一个问题,其实他主要分成了三部分:公共部分、ios部分、android部分,如果你android想用ios的那是不可能的,so,老老实实去了解每个平台有哪些,他们的作用是什么。下面我们介绍一些公用常用的,红色标记的为常用的选项。
公用Capability
Appium-python-Android_第9张图片
Android独有Capability
Appium-python-Android_第10张图片
ios独有Capability
Appium-python-Android_第11张图片

Capability启动App演示
New Session Window 会话建立

· Automatic Server 本地AppiumServer服务
· Custom Server:例如,如果要针对运行在网络中另一台计算机上的Appium服务器启动Inspector会话,这很有用。
· Sauce Labs:如果您无法访问机器上的iOS模拟器,则可以利用Sauce Labs帐户在云中启动Appium会话。
· TestObject:您还可以利用TestObject的真实设备云来进行真机测试。
· headspin:使用远程设备来创建会话。

desired capability参数Josin

{
“platformName”: “Android”,
“platformVersion”: “5.1.1”,
“deviceName”: “127.0.0.1:62025”,
“appPackage”: “com.tal.kaoyan”,
“appActivity”: “com.tal.kaoyan.ui.activity.SplashActivity”,
“noReset”: true
}
Appium-python-Android_第12张图片
新的会话窗口允许您构造一组desired capabilities,用于启动Appium会话。您可以针对当前运行的Appium Desktop服务器(默认的)启动一个会话,或者您可以针对各种其他端点启动一个会话。
因为不需要使用Appium Desktop自己的服务器,您可以在不启动Appium Desktop服务器的情况下进入新的会话窗口。只需点击“File”(Windows / Linux)或“Appium”(Mac),然后选择“New Session…”,它将打开新的会话窗口,而不必启动本地服务器。在这种情况下,将禁用附加到本地服务器。

Inspector元素获取

启动成功之后就可以使用 Inspector来进行元素空间获取了。 注意:默认的元素定位有一些不准,需要切换到第二个坐标点定位选项后再切换回来才能准确定位。
Appium-python-Android_第13张图片

环境依赖

· Node.js
· Appium
· Appium-desktop
· Appium-doctor
· Appium-Python-Client
· Python
· JDK
· Andriod SDK

安装Node.js

下载地址:https://nodejs.org/en/download/releases/
注意:Node.js版本要注意与Appium兼容,本套教程Appium版本是1.7.2,则选择的Node.js版本为6.11.3
安装完成后在按键Win+R输入cmd打开Windows 命令提示符,
输入如下命令:
C:\Users\Shuqing>node -v
v6.11.3
C:\Users\Shuqing>npm -v
3.10.10
说明:
· npm(node package manage)是node.js安装包管理工具,类似Python中的pip工具。
· 如果显示‘npm’不是内部命令提示,则可以管理员省份运行cmd,如果还是失败,则需要检查一下环境变量是否配置,或者重新安装nodejs。

Appium 安装

Appium Server其实可以通过命令 npm install -g appium来安装。不过由于众所周知的网络原因,直接使用这样安装会非常非常慢,甚至会安装失败,所以我们可以使用国内镜像来安装。
选用的镜像是 淘宝NPM镜像
镜像设置
npm install -g cnpm --registry=https://registry.npm.taobao.org

执行完成命令看到如下提示则表示设置完成
C:\Users\Shuqing> npm install -g cnpm --registry=https://registry.npm.taobao.org
npm WARN deprecated [email protected]: If using 2.x branch, please upgrade to at least 2.1.6 to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0
C:\Users\Shuqing\AppData\Roaming\npm\cnpm -> C:\Users\Shuqing\AppData\Roaming\npm\node_modules\cnpm\bin\cnpm
+ [email protected]
added 764 packages in 63.767s

appium 安装

使用如下命令来执行安装:
#安装最新版本
cnpm install -g appium
#安装指定版本
cnpm install [email protected] -g
看到如下命令时则表示下载安装完成。
All packages installed (565 packages installed from npm registry, used 57s, speed 835.67kB/s, json 477(6.16MB), tarball 40.58MB)
[[email protected]] link C:\Users\Shuqing\AppData\Roaming\npm\appium@ -> C:\Users\Shuqing\AppData\Roaming\npm\node_modules\appium\build\lib\main.js
npm的包安装分为本地安装(local)、全局安装(global)两种,一般我们推荐使用全局安装。

appium配置

安装完成之后可以使用如下命令查看appium的安装路径
C:\Users\Shuqing>where appium
C:\Users\Shuqing\AppData\Roaming\npm\appium
C:\Users\Shuqing\AppData\Roaming\npm\appium.cmd

appium运行

在控制台输入命令 appium即可启动appium服务,appium -v查看版本
C:\Users\Shuqing>appium -v
1.7.2
C:\Users\Shuqing>appium
[Appium] Welcome to Appium v1.7.2
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
如果输入appium后显示:“appium不是内部或外部命令,也不是可运行的程序或批处理文件” 可以将appium安装的路径 如: “C:\Users\Shuqing\AppData\Roaming\npm”配置到系统环境变量Path中

退出appium

按键 ctrl+c 选择y 即可退出

安装Appium-desktop

下载地址:https://github.com/appium/appium-desktop/releases
上面提到的问题可以使用前面我们已经介绍了Appium Server来解决,Appium-desktop工具其实也封装了Appium server和Node.js依赖环境。
appium-desktop是我们初学者最容易上手的工具,后面课程首先会基于这个工具来讲解!然后再基于appium 命令来讲。

python环境安装配置

安装成功之后输入命令 python --version看到如下提示即可
C:\Users\Shuqing>python --version
Python 3.5.0

安装Appium-Python-Client

通过命令: pip install Appium-Python-Client 进行安装。 安装后可以通过如下命令来检测是否安装成功。
输入命令“from appium import webdriver” 回车,如果控制台没有报错,则说明安装成功。
C:\Users\Shuqing>python
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.

from appium import webdriver

如果出现如下报错,则说明安装失败
ImportError: No module named ‘appium’
ImportError: cannot import name “webdriver”
说明:装Appium-Python-Client安装后的路径一般为:
{Python 安装路径}\Lib\site-packages\appium

JDK安装配置

jdk下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
jdk环境变量配置
http://jingyan.baidu.com/article/624e74599e8ad834e8ba5a94.html
安装配置完成后,打开命令提示符窗口,然后输入如下面命令有对应提示说明安装配置成功。
C:\Users\Shuqing>java -version
java version “1.8.0_05”
Java™ SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot™ 64-Bit Server VM (build 25.5-b02, mixed mode)

Andriod sdk 安装

下载地址: http://tools.android-studio.org/index.php/sdk
根据自己的PC平台下载对应版本即可。
安装完成后需要配置环境变量:ANDROID_HOME,第二章有详细说明。

安装 appium-doctor

appium-doctor可以检测Appium整体依赖环境配置情况。
C:\Users\Shuqing>cnpm install appium-doctor -g
· 在控制台输入命令:appium-doctor 看到如下提示说明整体环境配置成功。
C:\Users\Shuqing>appium-doctor
info AppiumDoctor Appium Doctor v.1.4.3
info AppiumDoctor ### Diagnostic starting ###
info AppiumDoctor ✔ The Node.js binary was found at: D:\program files\nodejs\node.exe
info AppiumDoctor ✔ Node version is 6.11.3
info AppiumDoctor ✔ ANDROID_HOME is set to: E:\Andriod_sdk
info AppiumDoctor ✔ JAVA_HOME is set to: C:\Program Files\Java\jdk1.8.0_05
info AppiumDoctor ✔ adb exists at: E:\Andriod_sdk\platform-tools\adb.exe
info AppiumDoctor ✔ android exists at: E:\Andriod_sdk\tools\android.bat
info AppiumDoctor ✔ emulator exists at: E:\Andriod_sdk\tools\emulator.exe
info AppiumDoctor ✔ Bin directory of %JAVA_HOME% is set
info AppiumDoctor ### Diagnostic completed, no fix needed. ###
info AppiumDoctor
info AppiumDoctor Everything looks good, bye!
info AppiumDoctor
如果上面某一项显示为“X”则说明相关环境没有配置好,需要重新安装配置。

参考资料

https://testerhome.com/topics/13146

测试环境

· Win 10 64bit
· Python 3.5
· Appium 1.7.2
· Andriod 5.1.1 模拟器& Android 5.1 MX4
· 测试App:考研帮Android版 3.1.0

测试场景

自动安装考研帮App(kaoyan3.1.0.apk),然后启动App

测试步骤

· 获取待测试app的packageName和Activity
· 配置Capability
· 连接设备
· 编辑脚本并运行
· 查看结果

运行前检查事项
  1. 检查设备是否连接
  2. 检查Appium server是否启动
  3. 检查Capability配置信息是否正确
测试脚本

test_kyb.py

from appium import webdriver
 
desired_caps={
   }
desired_caps['platformName']='Android'
 
#模拟器设备
desired_caps['platformVersion']='5.1.1'
desired_caps['deviceName']='127.0.0.1:62025'
 
#mx4真机
# desired_caps['platformVersion']='5.1'
# desired_caps['deviceName']='MX4'
# desired_caps['udid']='750BBKL22GDN'
 
desired_caps['app']=r'C:\Users\Shuqing\Desktop\kaoyan3.1.0.apk'
 
desired_caps['appPackage']='com.tal.kaoyan'
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
 
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
pycharm常用快捷键

· 复制粘贴当前行 Ctrl+D
· 注释 Ctrl+/
· 运行当前脚本 Ctrl+shift+F10
· 折叠展开代码 Ctrl + Numpad + /-
· 方法定义跳转 Ctrl+B
1.首次启动Appium会在设备上安装2个守护app,Appium Settings和Unlock 部分设备系统由于权限的问题(如:三星S6 edge+)需要用户手动确认安装,否则不安装守护App会导致脚本运行失败,安装好后不要随意卸载这两个App。
· Unlock :用于解锁手机弹窗提示
· Appium Setting:Appium守护app
2. from appium import webdriver 中的webdriber模块和selenium中的webdriver模块不一样!
webdriver模块源码路径:
{python安装路径}}\Lib\site-packages\appium\webdriver

Appium报错&解决方案——那些年我们踩过的坑

Appium服务未启动
urllib.error.URLError: 【解决方案】点击启动Appium按钮后,出现[Appium] Welcome to Appium v1.7.2提示后再运行脚本
会话冲突
error: Failed to start an Appium session, err was: Error: Requested a new session but one was in progress
【报错分析】 之前的会话没有关闭,然后你又运行了测试实例,也没有设置覆盖.
【解决方案】 重新停止appium服务,开启Appium服务 在AdVance界面勾选Allow Session Override选项 ,重启Appium 测试结束在AfterClass加driver.quit()
未安装java环境
selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Original error: ‘java -version’ failed. Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c “java -version”
设备未连接
selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not find a connected Android device.
【解决方案】由于设备未连接,或者连接后未开启USB Debug。需要重新连接设备即可。
更换手机设备后如下对应的属性要记得更新,否则无法正常运行脚本。
desired_caps[‘platformVersion’] = ‘XXX’
desired_caps[‘deviceName’] = ‘Galaxy S6 edge+’
launchable activity 值写错
Activity used to start app doesn’t exist or cannot be launched! Make sure it exists and is a launchable activity
【解决方案】
· launchable activity 写错更正即可。
· 如果是存在此activity,则一定是AndroidMainfest.xml.xml中,当前activity设置的属性exported=false,表示当前activity无法被外部程序唤醒。(appium无法唤醒此类)需要研发人员去修改参数。
系统权限问题
Failure [INSTALL_FAILED_USER_RESTRICTED])
【解决方案】

  1. USB安装管理权限限制,关闭即可。
  2. 开启安装允许未知来源app选项
    服务异常
    An unknown server-side error occurred while processing the command” while opening the App
    【解决方案】重新启动Appium服务
元素定位

与Web自动化测试一样,app自动化测试过程中最重要一个环节就是元素定位,只有准确定位到了元素才能进行相关元素的操作,如输入、点击、拖拽、滑动等。appium提供了许多元素定位的方法,如id定位、name定位、class定位、层级定位等等… 接下来将会给大家来实践运用这些定位技巧。

元素定位方式

· id
· name
· class
· List定位
· 相对定位
· Xpath定位
· H5页面元素定位
· Uiautomator定位

id定位

日常生活中身边可能存在相同名字的人,但是每个人的身份证号码是唯一的,在app界面元素中也可以使用id值来区分不同的元素,然后进行定位操作。Appium中可以使用 find_element_by_id() 方法来进行id定位。
测试场景1

  1. 安装考研帮kaoyan3.1.0.apk
  2. 点击升级页面取消按钮
  3. 点击引导页面的跳过按钮
    kyb_cancel_skip.py
from  appium import webdriver
 
desired_caps={
   }
desired_caps['platformName']='Android'
desired_caps['deviceName']='127.0.0.1:62025'
desired_caps['platforVersion']='5.1.1'
 
 
 
desired_caps['app']=r'C:\Users\Shuqing\Desktop\kaoyan3.1.0.apk'
desired_caps['appPackage']='com.tal.kaoyan'
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
 
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(5)
 
driver.find_element_by_id('android:id/button2').click()
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
思考

· 如果安装的版本最新的包,或者升级到了最新的版本,则启动后没有升级弹窗元素该如何处理?
· 跳过引导页面首次启动和非首次启动场景该如何处理?

方案探索1——if条件判断

有同学可能想到用if来做条件判断,判断元素是否存在,存在则点击,不存在则跳过。
kyb_cancel_skip_if.py

from  appium import webdriver
 
desired_caps={
   }
desired_caps['platformName']='Android'
desired_caps['deviceName']='127.0.0.1:62025'
desired_caps['platforVersion']='5.1.1'
 
 
desired_caps['app']=r'C:\Users\Shuqing\Desktop\kaoyan3.1.0.apk'
desired_caps['appPackage']='com.tal.kaoyan'
desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
 
desired_caps['noReset']='True'
 
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(5)
 
cancelBtn=driver.find_element_by_id('android:id/button2')
skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
 
 
if cancelBtn:
    cancelBtn.click()
else:
    print('no cancelBtn')
 
 
if skipBtn:
    skipBtn.click()
else:
    print('no skipBtn')
方案探索2——异常捕捉

既然上面的if语句判断无法生效,但是我们发现一个突破口,那就是捕捉NoSuchElementException异常。
Python异常处理视频教程
kyb_cancel_skip_try.py

from  appium import webdriver
from selenium.common.exceptions import NoSuchElementException
 
desired_caps={
   }
desired_caps['platformName']='Android'
desired_caps['deviceName'

你可能感兴趣的:(自动化测试-appium,黑盒测试,测试类型)