Python+Appium运行简单的demo,你需要理解Appium运行原理!

2020-09-21 15:06:15 浏览数 (1)

作者:清菡 博客:oschina、云 社区、知乎等各大平台都有。

目录

  • 一、Appium 的理念
    • 四个原则
    • 1.Web-Selenium 的运行原理
    • 2.Appium 运行原理
  • 二、Appium 面板
  • 三、一段简单的代码来打开应用
    • 1.前提条件
    • 2.怎么识别 app?
    • 3.查看安卓 App 包名的链接
    • 4.Appium 官网介绍
    • 5.为什么有平台版本号?
    • 6.aapt 命令获取应用包名和入口 activity
    • 7.代码

一、Appium 的理念

四个原则:
  • 你没有必要为了自动化而重新编译你的应用或者以任何的方式修改它。
  • 你不应该被限制在特定的语言或框架上来编写运行测试。
  • 移动端自动化框架在自动化接口方面不应该重新造轮子。 (Appium 中没必要把 http 通信过程,命令的执行过程以及点击输入等公用的操作再写一遍,Appium 直接继承 Selenium,把现有的东西全部拿过来)
  • 移动端自动化框架应该开源,不但在名义上而且在精神上和实践上都要实至名归。

1.Web-Selenium 的运行原理:

图片来自网络,画的很好

通过 Http 通信,没有改变浏览器访问系统的属性,只要访问就可以了。 Appium 做自动化也是如此。

2.Appium 运行原理:

图片来自网络

安卓和 Ios 都有自己自带的自动化测试框架。 因为 Ios 和安卓是不同的语言编写的,所以用 Appium(Appium 是跨平台跨语言)。

版本不一样,用的自动化框架也不一样。自动化框架不一样,API 接口也不一样。

图片来自网络

Appium server 去跟移动端的东西通信,首先确实是 Ios 还是安卓。即使确认了是安卓,也得确认下是 UiAutomator 的 Api 还是 Instrumentation 的 Api。

「一般只支持主流版本,其它版本需要用户自己支持了。」

启动一个模拟器或者真机就有一套自带的自动化框架。

图片来自网络

Appium 发送命令到手机,手机上有个 Bootstrap 接收命令。Bootstrap 是一个服务:Ip 地址和端口做的一个监听。

Appium server 启动后得到代码发送的命令后,不会直接发给手机。

比如你在安卓 8 的设备上做个什么操作,打开一个 APP,Appium server 检查下目前设备上有没有安卓 8 的。如果有,它就把这个命令发送给手机端。

Bootstrap 得到命令后,在本系统中调用 UIAutomator 提供的 API 去做一些实际的操作。就实现了通过 Python 代码去驱动移动端做一堆的事情。

Bootstrap.jar 就是利用了 UIAutomator 一个测试类在这个当中写了 Ip 地址和端口,启动这个服务就结束了。当然也会传达命令,调用 UIAutomator 等。

Appium server 是个服务,移动终端上面也放了一个服务。作为服务主要接收别人向我们发送的命令,实际上就是「通信」

Appium server 这个中间件支持 Ios、安卓。

移动端不仅有 Web 网页的操作,还有自己特性的操作。移动端的特点:手指触屏操作、多点触控、混合应用。移动端特有的操作,把命令加进来,做一个扩充就好了。

装了 Appium 没有装 Selenium 是肯定会报错的。因为 Appium 是基于 Selenium 的,Appium 做了些拓展。

很多东西和 Web 自动化,包括从概念上都是一样的。虽然说,它做了拓展,它也是基于现在的基础。现在通信原理的基础上增加了一些原理,增加了一些操作,核心是没有变的。原因很简单:大家都是界面操作。本质上是差不多的,就是在不同的平台上来做这些事情。

很多方面基本上都是这种思想来做的。现在开源的东西越来越多,很多实现思想就是这种分层、独立、兼容很多语言,可以不限定客户端是谁的。

Appium 本来就是开源的,是 Js 实现的。

以上是 Appium 客户端的介绍。

二、Appium 面板

高级选项分为 3 大板块:基本配置-Ios 配置-安卓配置。

日志文件非常有用,如果你在 App 自动化的过程中遇到了什么问题报错了,很多时候都要进入 Appium 的日志当中来分析的。

这个服务端的日志,它做的非常的全面。包括 Python 代码向它发送的请求,以及在它收到请求后做的一系列的处理,到底用的 Adb 还是什么东西,还是和谁通信等都描述得非常清楚。

所以默认的日志级别是 debug,把整个过程中做的很多操作全部都打印出来了。

日志路径自己配置一个,例如我配置在 D 盘的根目录下。D://appium.log

这里有些选项,这些选项什么都不选的时候,启动 Server。这样操作是没有时间的。

后续运行代码的时候,面板上的日志会刷个不停。所以有些日志要滚动很久才能看到,所以点击 Get Raw Logs 按钮。得到一个这样的文件:

这个文件中有时候很多东西显示的不对。所以配置一个日志存放路径,将日志输出到对应的路径保存就好了。

三、一段简单的代码来打开应用

App 自动化最基本的东西:Adb 命令。

Adb 命令是用来调试真机或者模拟器的。adb devices这条命令识别当前电脑连接的设备(模拟器也能识别)。真机必须开启 Usb 调试模式,在开发者选项当中勾选 Usb 调试模式。

1.前提条件

  • 平台类型
  • 平台版本号
  • app 包名
  • app 入口 activity
  • 设备名称

2.怎么识别 app?

.apk的后缀名。

开发把包给你的时候都会先打包成一个 apk,然后你去安装,安装后在安卓系统上不再是.apk,会对它进行解压。解压后在特定的系统中特定的目录下面会有自己的包名。

包名–安卓系统当中的标识(相当于唯一代号)

有相同的包名,就是应用已安装。卸载的时候能找到这个包名就能卸载,找不到就不能卸载。

模拟器和安卓真机都是基于 Liunx 内核的。在 Liunx 中都是以文件的形式来管理的。各种文件路径,和 Windows 系统一样。文件路径来管理各种内部的数据,包括系统安装的一些东西。需要熟悉 Liunx 的常用命令。

一般安卓手机都有个系统文件夹。很多产商基于安卓的原生系统做了很多美化工作,所以很多文件目录会有所改变,每个品牌的手机,文件所放的目录都不一样。

3.查看安卓 App 包名的链接:

https://blog.csdn.net/qq_41282136/article/details/100265002

adb shell pm list packages -3

然后你进自己手机系统文件夹下可以找到对应的包名。

activity 就是页面,安卓设备上每一个页面都可以叫做一个 activity,它们的名字都是不一样的。入口 activity 就是打开这个 app 的时候,默认是进入哪个页面的,默认是哪个 activity 名称。

想安装的时候可以提供 apk 的名字。

4.Appium 官网介绍

http://appium.io/docs/cn/about-appium/intro/#appium_1

图片来自网络

automationName 是自动化测试的一个引擎。

前面的东西叫做「键名」,既然这个东西是从客户端编写的,需要把这样的一个信息发给 Appium Server 服务端。「键名是不可以随便改的。」 不然是解析不了的。这个是人家定义好的请求的规范。

5.为什么有平台版本号?

因为要做平台版本匹配。平台版本号意味着使用的自动化框架 API 是不一样的,这样发送到终端上面会调用不同的。

写的代码换到 Ios 也是可以用的,只是要准备 Ios 的环境,这个需要苹果系统才可以。

.apk是安卓的。Appium 会将这个 App 给到的安装包路径,去将这个包安装到对应的设备上面去。如果你给定的是 App 这个字段,它会主动向你的真机或者模拟器去装这个 App。但是如果你的真机或者模拟器中已经装好了,再去装就会报错。

图片来自网络

如果没有这个app参数,只有 APP 包和 appActivity,就证明设备上已经存在,只要根据包名和入口去打开对应的应用就可以了。

做浏览器版本的 App 测试,就不需要 app 参数了,直接用 browserName 参数就可以了。

如果连接了好几台设备,实际上只对一台设备进行操作的时候,通过 udid 去连接设备。

图片来自网络

noReset 重置应用的状态,也就是恢复到默认设置。相当于第一次安装它,将所有的用户数据都清除。

在应用中清除缓存数据或者应用数据。例如在安卓上输入用户名密码,以后不需要输入了。除非把系统重装了,用户的账号密码登录后就记住了,如果把所有用户的记录全部删除就相当于第一次下载下来第一次使用。

做自动化的过程中是不需要重置的。按照用户的习惯来测试。

安卓的一些内核是 chrome,因为安卓系统是谷歌提供的。

activity:有一些是开发在代码中指定了这个入口页面是什么。用另外一个命令 aapt 获取

6.aapt 命令获取应用包名和入口 activity

图片来自网络

把路径配置到系统变量-path 中。

apk 的应用名称不是包名。

输入aapt dump badging 包名,直接把 apk 拖拽过来就可以啦。

7.代码

代码语言:javascript复制
from appium import webdriver

desired_caps={}
# 平台类型
desired_caps["platformName"]="Android"
# 平台版本号
desired_caps["platformVersion"]="10"
# 设备名称
desired_caps["deviceName"]="2NSDU20410017297"
# app 包名
desired_caps["appPackage"]="填对应的package name信息"
# app 入口 acitivity
desired_caps["appActivity"]="填对应的launchable-activity name信息"

# 连接Appium server。前提:appium desktop要启动。有监听端口。
# 将desired_caps发送给appium server。打开app
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

# 运行代码之前:
#1.appium server启动成功。处于监听状态
#2.模拟器/真机必须能够被电脑识别。即adb devices能够识别到要操作的设备。

运行代码,成功打开应用。

0 人点赞