appium,appium定位元素的几种方式
史上最全-Appium自动化测试框架
“
appium是一个开源的移动端自动化测试框架,可以测试原生的、混合的以及移动端的web项目,appium是跨平台的,可以运行在osx、windows以及linux桌面系统上,用来测试ios、android应用
”
Selenium
2004年,Thoughtworks的员工Jason Huggins编写了一个名为JavaScriptTestRunner的测试工具
后来多人修改架构为独立服务模式,开发并推出了Selenium RC和Selenium-IDE
“
Selenium是一个用于Web应用程序测试的工具,Selenium测试直接运行在浏览器中,就像真正的用户在操作一样
”
这个工具的主要功能包括:
测试与浏览器的兼容性
测试你的应用程序看是否能够很好的工作在不同浏览器和操作系统之上
测试系统功能
创建回归测试检验软件功能和用户需求
“
框架底层使用JavaScript模拟真实用户对浏览器进行操作
”
1.x版本的Selenium需要启动一个Server,将操作Web元素的API调用转化为一段段Javascript,然后在浏览器中注入这段Javascript
但是这样会有缺点
速度慢
依赖于浏览器对注入的Javascript的正确解释
于是有了2.x版本的Selenium版本
2.x版本的Selenium整合了webdriver和原来的Selenium,把多个浏览器原生的API封装成一套更加面向对象的Selenium webdriver API
这样做的好处是速度提高,且调用的稳定性交给了浏览器
2.x的Selenium也可以叫Webdriver
Appium
为什么讲appium前,提到selenium呢?
Appium是基于webdriver协议添加了对移动设备自动化api扩展而成的,这样做的好处是避免重复造轮子
appium的框架是什么样的?
appium使用client-server架构,appium-client以脚本的形式,支持多种语言
appium-server需要安装appium-server程序,用来监听端口上来自appium-client的命令
“
appium-server已经很久没更新过版本了, 目前可以用appium-desktop代替
”
UiAutomator是谷歌推出的一款用Java编写的UI测试框架,可以使用UiAutomator框架提供的API来对安卓系统进行一系列的自动化测试操作
Bootstrap是Appium在初始化的时推送到Android手机上的一个UiAutomator测试脚本,该脚本的唯一一个测试方法所做的事情是在手机端开启一个SocketServer(通信模块),用来监听Appium从PC端过来的命令发送给UiAutomator来执行处理
工作原理
“
appium-server启动并监听在某个端口,接收测试脚本发来的命令请求,再将请求发送给中间件Bootstrap.jar, 中间件Bootstrap.jar会把appium的命令转换成UiAutomator的命令 ,发送给UiAutomator,UiAutomator对android系统进行操作
”
安装
更多内容,在 汽车网络诊断通信 上可以看到
如何使用appium的模拟机怎么用
1、Appium连接sdk中的模拟器
了解android的人都在知道,android sdk中自带AVD Manager(Android Virtual Device Manager).开发者会使用AVD Manager创建一个android模拟器来调试自己的应用。所以首先我们介绍如何让Appium连接好我们的模拟器
1) 创建一个AVD,并启动
点击Create 后填写相关信息后,点击OK,选中AVD后点击Start
2)启动appium 点击右上角的启动按钮
启动成功后,在cmd命令中输入:appium
2、Appium连接真机
实际开发的过程中我们可能是直接拿真机来调试。所以Appium如何连接真机呢?原理上和上述方式一致。但真机会稍微复杂一点
1)打开手机的USB调试模式
不同的手机打开调试模式的方式不同。一般都在设置中的开发者模式中打开
2)手机连接电脑
使用数据线连接手机与电脑,然后在cmd中输入adb devices查看是否连接成功
新手可能会出现两个问题
一是输入adb命令时提示不是内部命令或者外部命令
那么你需要下载一个adb工具包并存放在C:\Windows\System32目录下(必须强调:与sdk中的adb工具包版本一致!!!!)
二是需要打开手机的usb调试模式并安装好驱动
之后在cmd中输入adb devices
3)启动appium服务
在cmd命令中输入:appium
启动成功
3、Appium连接第三方模拟器
有时候我们可能不太想用真机或者android sdk中自带的模拟器。而是使用一些三方的android模拟器。例如夜神,逍遥等等
理论上来说可以使用连接真机的方式一样来尝试连接。以下案例使用逍遥模拟器来做演示
1)使用adb连接到逍遥模拟器
网上百度了一番后,发现逍遥模拟器的连接方式是:adb connect 127.0.0.1:21503
所以其udid就是127.0.0.1:21503
2)连接到appium 服务
在cmd命令中输入:appium
启动成功
读懂appium原理,看这篇就够了
话不多说,直接上干货:
appium的整体架构是C/S模式,整体流程(返回顺序为逆向):
脚本请求 —— 4723端口appium server —— 解析参数给PC端4724端口 —— 发送给设备4724端口 ——?通过设备4724端口发给bootstrap.jar ——?Bootstrap.jar把命令发给uiautomator
1、脚本请求 —— 4723端口appium server :
首先我们要开启appium服务,即Appium server,也就是在命令行用appium命令打开的东西,默认监听4723端口。4723端口专门和脚本打交道,基于WebDriver协议。webdriver是按照server – client的经典设计模式设计的,作用就是启动基于WebDriver Wire协议的appium服务,接下来脚本与appium server的通信实际上是一个HTTP request请求给appium server,在请求的body中,会以WebDriver Wire协议规定的 JSON 格式的字符串来告诉appium服务我们希望设备接下来做什么事情。读到这里,难免有同学会有疑问了,因为有一些文档上面说脚本发送请求是基于Json wire protocol协议的,首先这是完全正确的,接下来就解释一下:
appium中的Json wire protocol继承自selenium的webdriver wire protocol,并进行了扩展,使得Json wire protocol能够控制不同的移动设备的行为。如果大家觉得对于webdriver这个名词觉得比较陌生的话,接下来说一个词肯定熟悉 -?Selenium。Selenium是一个浏览器自动化操作框架。Selenium主要由三种工具组成。第一个工具SeleniumIDE,是Firefox的扩展插件,支持用户录制和回访测试,录制/回访模式存在局限性,对许多用户来说并不适合,因此第二个工具——Selenium WebDriver提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序。最后一个工具——SeleniumGrid帮助工程师使用Selenium API控制分布在一系列机器上的浏览器实例,支持并发运行更多测试。在项目内部,它们分别被称为“IDE”、“WebDriver”和“Grid”。
那么webdriver wire protocol又是什么呢:
在我们创建一个WebDriver的过程中,Selenium首先会确认浏览器的native component是否存在可用而且版本匹配。接着就在目标浏览器里启动一整套Web Service,这套Web Service使用了Selenium自己设计定义的协议,名字叫做 The WebDriver Wire Protocol, 只不过对应到我们这里的浏览器指的是Appium。
WebDriver Wire协议是通用的,也就是说不管是FirefoxDriver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的Web Service。对应到Appium,可以理解为是AppiumDriver。接下来,我们调用WebDriver的任何API,都需要借助一个 ComandExecutor 发送一个命令,实际上是一个HTTP request给端口上的Web Service。在我们的HTTP request的body中,会以WebDriver Wire协议规定的 JSON 格式的字符串来告诉Selenium我们希望浏览器(设备)接下来做什么事情。
说到这里可能会有疑问了,上面说到的是脚本请求对设备进行操作,但前提是,我们要对谁进行操作测试呢?这里就引入一个新名词:desiredCapabilities。了解了上述之后,再去看脚本怎么将desiredCapabilities传递给appium server就明白多了,脚本通过Json Wire Protocol协议以json格式发送测试设备信息给server端,测试设备信息被携带在Desired Capabilities中,这个东西实质上是一个key-value形式的对象,Desired Capabilities最重要的作用是告诉server本次测试的上下文。这次是要进行浏览器测试还是移动端测试?如果是移动端测试的话是android还是ios?如果android的话我们要测试哪个app?server的这些疑问Desired Capabilities都必须给予解答,否则server不买账,针对我们现在所说的安卓,它带来的影响就是无法完成app的启动。
那么,将测试设备信息告知之后,是不是就可以开始进行测试了呢?答案是:NO。这里又要引入一个名词:session。session就是一个会话,在webdriver/appium,你的所有工作永远都是在session start后才可以进行的。client 创建1个session,在该session中通过http向appium server发送请求,appium server解析请求,完成相应操作并返回response。
Session在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息,对应到这里其实就是desiredCapabilities中的配置信息参数。脚本通过POST /session这个URL,然后传入Desired Capabilities就可以开启session了,由于这是第一次请求创建session,所有并没有一个已创建的session id,所以appium server会调用android driver(appium升级到2.0.0后,原有的AppiumDriver函数变成抽象函数了,需更改为AndroidDriver)为client生成一个session并且生成一个与此session相关联的session id,这个 session id将被在本次响应中返回给客户端保存,当下次脚本发出操作请求时就会自带session id为唯一标识,代表所打开的设备,Appium server会按照此session id把这个session检索出来使用,脚本向appium server发送的请求即是存在于创建的session中的。
Session 的作用就是它在appium服务上保持设备的状态信息,供在任何时间进行访问,在多次的操作行为中,存储在 Session对象中的配置信息将不会丢失,而是在整个用户会话中一直存在下去,整个测试进程中设备与程序的联系不会断开,也不需要每次都发送带配置信息的请求,程序都知道对哪个设备进行测试操作。当测试结束后,需关闭webdriver,driver.quit()会关闭所有关联窗口和session,并且也会把进程也关闭。
2、解析参数给PC端4724端口 —— 发送给设备4724端口 ——?通过设备4724端口发给bootstrap.jar ——?Bootstrap.jar把命令发给uiautomator:
创建session成功之前,就已将bootstrap.jar放入手机中,并开启设备上的基于appium bootstrap的socket服务,绑定本机和boostrap通信的端口号4724用于和Android设备通讯,默认监听4724端口,等待client的连接。
Appium server将脚本的请求解析后给到4724端口,通过设备的4724端口转发解析后的请求, 此时,对于socket服务来说,appium server就充当了client的角色,appium server通过4724端口主动去请求设备上的socket服务,即向socket服务发送请求,即bootstrap.jar,Bootstrap.jar再把Appium的命令转换成uiautomator的命令来让uiautomator进行处理。有请求就有返回,socket接收到请求后会做出响应,原路返回给脚本,然后脚本再进行下一次的请求。
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。appium和手机的通信过程,主要是数据交换的一个过程,socket的作用是就是为了实现双向通信,它需要一对端口号,对应到这里就是4724,手机端的bootstrap就是socket-server端,appium server就是socket-client端。
关于socket的通信原理,先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。