Python+Appium运行简单的demo,你需要理解Appium运行原理!
坚持原创输出,点击蓝字关注我吧
作者:清菡
博客: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.代码
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能够识别到要操作的设备。
运行代码,成功打开应用。
公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 84+原创文章,欢迎关注、交流,禁止第三方擅自转载。
感谢支持清菡原创,欢迎点击在看和转发!
Python+Appium运行简单的demo,你需要理解Appium运行原理!的更多相关文章
- python模块之HTMLParser之穆雪峰的案例(理解其用法原理)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser之穆雪峰的案例(理解其用法原理) #http://www.cnblog ...
- Docker运行简单的Demo
打开cmd.exe 输入docker run hello-world,本机没有这个images实例,将会从官方下载下载 运行一个简单的web实例,例如输入: docker run --name asp ...
- webpack构建工具初始化并运行简单的demo
webpack官网:https://webpack.js.org/ webpack是构建工具 安装webpack的前提:node,npm要安装 初始化项目 首先是初始化项目,创建一个文件夹,并且进入文 ...
- python uiautomator,比 appium 更简单的 app 测试工具
1,场景 在 app 测试的蛮荒时代,如果要进行 app 自动化测试非常麻烦.张大胖如果想做安卓自动化测试,首先必须要学 Java.因为安卓自动化测试都绕不开 google 自己研发的自动化测试框架, ...
- appium+python自动化60-windows上同时启动多个appium服务,让多个android机器并行运行
前言 做android自动化的时候,启动一个appium服务,只能匹配一个手机去自动化执行.有时候想同一套代码,可以在不同的手机上执行,测下app在不同手机上兼容性. 这就需要启动多个appium服务 ...
- Python实例---简单购物车Demo
简单购物车Demo # version: python3.2.5 # author: 'FTL1012' # time: 2017/12/7 09:16 product_list = ( ['Java ...
- Appium与python自动测试环境及demo详解
App--UI自动化这种高端的名词已经被越来越多的人所高呼,可是从实际角度来讲,个人觉得还是有点鸡肋,不如接口自动化敏捷度高,工作量 也是接口自动化的好几倍.但是,[划重点了] 在技术时代中,作为测 ...
- 使用appium+python做UI自动化的demo
使用appium+python做UI自动化的demo 案例使用的知乎app,下载最新的知乎apk,存在了电脑上,只需要配置本机上app目录,不需要再配置appPackage和appActivity # ...
- 自动化工具之Appium工具简单介绍
背景 自动化,性能测试,接口测试,开发平台等工作,到底测试的价值在哪里,其实价值来源不断充实与为大众服务,今天简单介绍ui小工具appium攻击. 简单介绍 Appium 是一个自动化测试开源工具,支 ...
随机推荐
- 第一篇博客 Python开发环境配置
本文主要介绍Windows7环境下安装并配置Anaconda+VSCode作为Python开发环境. 目录 Anaconda与包管理配 Anaconda安装 添加环境变量 Anaconda安装错误及解 ...
- 直播报名 | 8.29 Kylin Meetup – 来聊聊云原生
云原生的巨浪正在席卷全球的软件产业,包括开源和商业软件.Apache Kylin 正在为此而积极准备着:基于新的计算和存储引擎,即将发布的 Kylin 4.0 将实现真正的计算和存储分离,减小运维难度 ...
- UnitTest框架的快速构建与运行
我们先来简单介绍一下unittest框架,先上代码: 1.建立结构的文件夹: 注意,上面的文件夹都是package,也就是说你在new新建文件夹的时候不要选directory,而是要选package: ...
- Android Home
unity处理Android的home键响应事件 http://blog.csdn.net/tianyongheng/article/details/38459531 Unity3D教程:处理Home ...
- vue 组件内的守卫
1.beforeRouteEnter () // 进入该组件之前要去进行的逻辑操作, 2.beforeRouteLeave() // 离开该组件之前要去进行的逻辑操作(可清除定时器等耗用内存的变量, ...
- add forward
adb forward tcp:34999 localabstract:Unity-com.kingsgroup.rob adb forward --list adb forward --remove ...
- 【python】迭代器与生成器到底是什么?看完你就知道
迭代器跟生成器,与上篇文章讲的装饰器一样,都是属于我的一个老大难问题. 通常就是遇到的时候就去搜一下,结果在一大坨各种介绍博客中看了看,回头又忘记了. 你是不是也是这样呢? 俗话说:好记性不如烂笔头, ...
- 分享一个后端专用login模板
给大家啊分享一个后端专用login模板 Java工程师再也不用这样啦---> html源码 <html lang="en"> <head> <m ...
- 【Azure DevOps系列】Azure DevOps构建并发布Nuget程序包
在Azure DevOps中,管道可以用来构建解决方案,O(∩_∩)O哈哈~快万能了,本章主要介绍如何创建Nuget包并且将其发布到Nuget服务器的过程. 前面我创建了一个非常简单的类库,这边我不做 ...
- vue bus 中央事件总线
1.全局定义bus 新建src/eventBus.js 文件 import Vue from 'vue' export default new Vue() // 全局引入mai.jsvue中央事件总 ...