Appium原理及版本变化细节

Appium原理小结

Api接口调用selenium的接口,Android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的)、uiautomator接口(API4.2+),iOS底层用ios的uiautomation接口。

Client/ServerArchitecture

Appium server是用Node.js写的,安装node.js可以直接用npm命令或dmg,server端功能:监听一个端口,接收client发送来的command,翻译这些命令,把这些command转成移动设备可以理解的形式发送给移动设备,然后移动设备执行完command后把执行结果返回给appium server,appium再把执行结果返回给client。

Client其实就是发起command的设备,一般来说就是执行代码的机器,执行appium测试代码的机器,可以把client理解成代码,这些代码可以是JavaPython、ruby、js,只要实现了webdriver标准协议就可以。

跨语言:只要支持selenium webdriver api和这种语言相关的client libraries就可以。Server放在任意机器上,哪怕是云服务器都可以(appium和webdriver天生适合云测试)。

Session

session就是一个会话,在webdriver/appium,你的所有工作永远都是在session start后才可以进行的。一般来说,通过POST /session这个URL,然后传入Desired Capabilities就可以开启session了。

开启session后,会返回一个全局唯一的sessionid,以后几乎所有的请求都必须带上这个session id,因为这个seesion id代表了你所打开的浏览器或者是移动设备的模拟器。

进一步思考一下,由于session id是全局唯一,那么在同一台机器上启动多个session就变成了可能,这也就是selenium gird所依赖的具体理论根据。

Desired Capabilities

Desired Capabilities携带了一些配置信息。从本质上讲,这个东东是key-value形式的对象。你可以理解成是java里的map,python里的字典,ruby里的hash以及js里的json对象。实际上Desired Capabilities在传输时就是json对象。

Desired Capabilities最重要的作用是告诉server本次测试的上下文。这次是要进行浏览器测试还是移动端测试?如果是移动端测试的话是测试android还是ios,如果测试android的话那么我们要测试哪个app? server的这些疑问Desired Capabilities都必须给予解答,否则server不买账,自然就无法完成移动app或者是浏览器的启动。

Appium Clients

原生的webdriver api是为web端设计的,appium官方提供了一套appium client,为不同的语言的开发者可以测试自己的app,测试的时候,一般要使用这些client库去替换原生的webdriver库。算是client对原生webdriver进行了一些移动端的扩展。

android框架

ios框架

appium0.18.x到appium1.x 的改变

1.新的客户端库

appium客户端库取代原来的webdriver客户端库

from appium import webdriver取代fromselenium import webdriver

2.新的capabilities选项

不再使用device、version,使用platformName、platformVersion、deviceName、automationName(“Selendroid”如果是api2.3以上要选择,默认可以不填),udid(ios要指定设备标示)。

之前的app这项capability保留不变,但该项现在专门用在非browser类型的app上面,要测试Safari或Chrome浏览器应用,要使用标准的browserName,app和browserName都是专用的选项。

同时我们也用骆驼命名法重新统一命名了我们的Appium Server的capabilities。比如说原来的app-package和app-wait-activity将改成appPackage和appWaitActivity。当然,鉴于我们能自动检测到Android应用的包和activity,所以你可以大多时候忽略掉这些选项了。

3. 我们把以下的控件查找器策略给移除掉了:

name

tag name

我们现在引入了accessibility_id这个策略来取代原来name所做的事情(译者注:也就是说原来的AppiumDriver.findElementByName将会被现在的AppiumDriver.findElementByAccessibilityId取代)。当中细节将会根据你使用的Appium客户端(译者注:客户端语言)而有所不同。

新的class name将会取代原来的tag name(译者注:也就说原来的findElementByTagName将会被想在的findElementByClassName取代),所以如果你要根据一个控件的UI类型来查找出该控件,请使用class name这个控件查找器。

注意class name和xpath策略的变化:你现在需要使用FQCN来描述你的控件。也就是说如果你由一个xpath选择子如下所述:

//table/cell/button

那么现在要改为(译者注:也就是说原来的findElementByXpath(""//TextView[contains(@text,‘Addnote‘)]"")将需要改成findElementByXpath("//android.widget.TextView[contains(@text,‘Addnote‘)]"):

//UIATableView/UIATableCell/UIAButton

(如此类推:button现在就要写成android.widget.Button)

同时我们也添加了如下的控件定位器策略(译者注:也就是说入Andoid增加了AppiumDriver.findElementByUiAutomator):

iosuiautomation

androiduiautomator

请根据你使用的客户端(根据不同语言)库来确定如何使用新的控件定位器策略。

4.使用XML取代JSON

取得当前窗口的源码(译者注:也就是AppiumDriver.getPageSource函数)返回的格式将从原来的JSON改成XML。所以如果你之前的代码有依赖分析控件源码的地方必须做相应的更新。

5. 混合应用通过context而非window进行支持

如今Appium支持(跟切换上下文这个概念)更加概念一致的的“context”。为了取得所有可用的上下文或者你的应用特有的上下文,请使用如下方式:

# python driver.contexts current = driver.context

请使用如下方式进行切换:

# python driver.switch_to.context("WEBVIEW")

6. execute_script("mobile:xxx")将销声匿迹

所有”mobile:”相关的方法讲都会被剔除掉,并且被Appium客户端库的原生方法给替代掉。例如原来的driver.execute("mobile:lock",[5])将会被现在的driver.lock(5)所取代(这里lock这个功能已经成为了原生的客户方法了)。当然,具体的调用方法将会根据你所使用的不同的客户端库而有所不同了。

需要特别声明的是,手势操作相关的方法将会被新的TouchAction/MultiAction API所替代,把这些手势操作集合在一起将会使得你的手势操作相关的自动化更强大和通俗易懂。更详细的TouchAction/MultiAction的使用请查看你的的Appium客户端。

参考网址:

官网介绍:http://appium.io/slate/en/master/?python#appium

论坛:http://automationtesting.sinaapp.com/blog/appium

大神blog:http://blog.csdn.net/zhubaitian/article/details/39753945

时间: 2024-10-14 16:40:21

Appium原理及版本变化细节的相关文章

.NET/C# 各版本变化及衍生知识点

还是新开一篇吧,因为不光要记录各版本变化,还想把相关知识点衍生出来扩展一下,一天写不完就多几天,这里面知识点非常多. C# 1.0,对应.NET 1.0,对应VS 2003,新特性:事件.委托. C# 2.0,对应.NET 2.0,对应VS 2005,新特性:泛型.匿名.迭代.可空.委托(协变/逆变).部份类.形态类.属性访问控制 C# 3.0,对应.NET 3.0,对应VS 2008,新特性:类型推断.隐式类型的部变量.对象集合初始化.自动实现属性.匿名类型.扩展方法.查询表达式.Lambda

【金阳光测试】Android自动化 -- 学习历程:Appium原理初步

章节:自动化基础篇——Appium原理初步(第七讲) 金阳光测试官网: http://www.goldensunshine.cc/forum.php?mod=viewthread&tid=19&extra=page%3D2 本期关键词: Appium.跨语言跨平台.Bootstrap 主要讲解内容及笔记: 一.what is appium 一种封装了uiautomator.或者其他测试框架的自动化测试框架,跨平台(支持linux.mac.windows).跨语言(几乎所有的我知道的语言都支

Nmap原理02 - 版本探测介绍(上)

Nmap原理02 - 版本探测介绍(上) 1.介绍 本文将介绍如何通过修改或添加nmap-service-probes文件来实现对nmap中未知服务的探测,首先介绍服务和版本探测的相关信息,然后介绍服务和版本探测的原理以及nmap-service-probes的文件格式,最后通过一个例子演示修改nmap-service-probes文件识别自己的服务,本节介绍前半部分介绍+技术摘要. 转载请注明出处:http://www.cnblogs.com/liun1994/ 2. Service and

Appium原理

Appium原理小结 Api接口调用selenium的接口,android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的).uiautomator接口(API4.2+),ios底层用ios的 uiautomation接口. Client/ServerArchitecture Appium server是用node.js写的,安装node.js可以直接用npm命令或dmg,server端功能:监听一个端口,接收clien

APP端自动化 之 Appium原理

手机App分为两大类,原生App(Native App)和混合APP(Hybrid App) 原生App(Native App) 原生App实际就是我们所常见的传统App开发模式,云端数据存储+App应用客户端.App应用客户端,包含了所有的UI元素.框架逻辑等.只有数据存储在云端. 混合App(Hybrid App) 混合App就是HTML5 App,混合App通常由两部分组成,HTML5云网站+App应用客户端,这里的App应用客户端实际只是个架子,里面的UI元素和逻辑,都是存储在云端的,每

babel版本变化 - 简单理解

babel版本变化 现在大部分使用babel的项目都是用的babel7.x了,但是还是需要去了解一下babel每个版本的一个重大变化,本篇主要是简单来记录下我了解的babel几个版本的重大变化 babel5.x 我看官网babel5已经没有了,,,但是在我了解的过程中,有好多博客都说有babel5,,,差不多就是说babel5就是一个全家桶,类似于vue-cli那样的东西,包括各种包和插件,babel5大概就是让你通过一次安装,尽可能的可以达到所有你想要的东西. babel6.x babel5升

spring boot 自动装配的实现原理和骚操作,不同版本实现细节调整,debug 到裂开......

开篇说明: 注解本身并没有什么实际的功能(非要说标记也是一个“实际”的功能的话,也可以算吧),隐藏在背后的注解处理器才是实现注解机制的核心.本篇将从这两个层面出发探索 spring boot 自动装配的秘密,并使用 spring boot 的自动装配机制来实现自动装配. 本次代码已经放到 github:https://github.com/christmad/code-share/tree/master/spring-boot-config-practice 代码中主要是做了 @Configur

Appium自动化测试学习笔记 —— Appium原理

Appium简介 开源.跨平台.多语言支持的移动应用自动化工具 可测对象 原生应用APP.混合应用APP.移动Web App APP运行环境:真机.模拟器 测试对象App运行平台 IOS.Android(目前这两种是市场主流):Windows.FirefoxOS. 测试程序运行平台支持 Windows.Linux.Mac OS; 注:IOS应用appium server必须运行在Mac OS系统上,如 MacBook.imac: 支持的测试语言 python.Java.ruby.php.js.C

HttpClient 版本变化 转载

转载地址:http://my.oschina.net/u/577453/blog/173724 最近用到了HttpClient写爬虫,可能我有新版本强迫症,老是喜欢用新版本的东西(虽说新版本不一定好用),然后就用了HttpClient 4.3.HttpClient这货和Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样, 3.X是这样的 HttpClient httpClient=new DefaultHttpClient