appium(四) 操作介绍

JavaScript07

appium(四) 操作介绍,第1张

**锁定解锁屏幕 **

driver.lock(5)

将把当前应用放到后台 5 秒

driver.background_app(5)

**收起键盘 **

driver.hide_keyboard()

启动 ACTIVITY

在当前应用中打开一个 activity 或者启动一个新应用并打开一个 activity 。 只能在 Android 上使用

driver.start_activity('com.example.android.apis', '.Foo')

打开下拉通知栏 只能在 Android 上使用

driver.open_notifications()

**检查应用是否已经安装 **

driver.is_app_installed('com.example.android.apis')

安装应用

driver.install_app('path/to/my.apk')

**删除应用 **

driver.remove_app('com.example.android.apis')

**摇晃 (SHAKE) 关闭应用 **

driver.shake()

**关闭应用 **

driver.close_app()

启动 (LAUNCH)

根据服务关键字 (desired capabilities) 启动会话 (session) 。请注意这必须在设定 autoLaunch=false 关键字时才能生效。这不是用于启动指定的 app/activities ————你可以使用 start_activity 做到这个效果————这是用来继续进行使用了 autoLaunch=false 关键字时的初始化 (Launch) 流程的

driver.launch_app()

**应用重置(相当于卸载重装应用) **

driver.reset()

列出所有的可用上下文 (CONTEXT)

context 可以理解为 可进入的窗口 。例如,对于原生应用,可用的 context 和默认 context 均为 NATIVE_APP

driver.contexts

**列出当前上下文 **

driver.current_context

**获取当前页面的源码(可以辅助元素定位) **

driver.page_source

**截图屏幕图片 **

driver.get_screenshot_as_file(r'E:\img\img1.png') # 截取整个屏幕

获取应用程序的字符串 (APP STRINGS)

driver.app_strings

给设备发送一个按键事件(KEY EVENT)(只限安卓)

driver.keyevent(176)

获取当前 activity。只能在 Android 上使用

driver.current_activity

模拟用户滑动(SWIPE)

driver.swipe(start=75, starty=500, endx=75, endy=0, duration=800)

捏屏幕(PINCH) (双指往内移动来缩小屏幕)

driver.pinch(element=el)

放大 (ZOOM)屏幕 (双指往外移动来放大屏幕)

driver.zoom(element=el)

**滑动 (SCROLL)到某个元素。从一个元素滚动到另一个元素 **

driver.scroll(originalEl, destinationEl ) # originalEl - 要滚动的元素 destinationEl - 要滚动到的元素

**设置元素的值 **

driver.set_value(element=el,Val) # 设置 el 元素的值

推送文件到设备中去(PUSH FILE),推送文件需要转换为'base64'

**获取/设置 appium 的服务器设置。 **

**多个点点击(最多五个点) **

driver.tap([(100, 20), (100, 60), (100,100)], 500) # list 中的元组放 5 个点,500 表示按下 500ms

APP自动化测试appium环境怎么搭建?1

/12

下载安装node.js (注意操作系统,32位,64位)。安装完成后,检查是否安装成功:cmd, 输入node -v , 显示安装版本信息,则安装成功,如下图所示:

2

/12

安装JDK配置环境变量

JDK安装,以及环境变量设置

下载eclipse (注意操作系统,32位,64位),Mars版。

3

/12

配置Android SDK环境

下载Android SDK,下载地址www.androiddevtools.cn,如下图所示:

4

/12

安装保证Level 17或以上版本 api,如下图所示:

5

/12

Android操作系统选择安装用于模拟机,如下图所示:

6

/12

配置环境变量

a>新增变量:ANDROID_HOME,设置值为安装目录: l例如 E:\android-sdk

b>Path中新增参数:%ANDROID_HOME%\tools%ANDROID_HOME%\platform-tools

7

/12

验证是否安装配置成功

cmd: 输入 android, 弹出SDK Manager窗口。

8

/12

ADT安装

打开eclipse,help>install new software, 输入https://dl-ssl.google.com/android/eclipse

下载时间会比较久,也可以考虑直接下载后本地安装,如下图所示:

9

/12

安装完成,重启Eclipse,如下图所示:

10

/12

安装Appium,下载: http://appium.io,如下图所示:

11

/12

设置环境变量

Appium目录和他的bin目录都加入环境变量PATH:例如

APPIUM_HOME: E:\App\Appium

Path: %APPIUM_HOME%\node_modules\.bin

12

/12

运行appium-doctor来验证Appium的所有依赖是否配置正确。

Appium Server拥有两个主要的功能:

它是个http服务器,它专门接收从客户端通过基于http的REST协议发送过来的命令

他是bootstrap客户端:它接收到客户端的命令后,需要想办法把这些命令发送给目标安卓机器的bootstrap来驱动uiatuomator来做事情

通过上一篇文章《Appium Server 源码分析之启动运行Express http服务器》我们分析了Appium Server是如何作为一个http服务器进行工作的。那么今天我们就要分析第二点,Appium Server是怎么作为bootstrap的客户端来向目标安卓机器的bootstrap发送命令以驱动uiautomator框架来做事情的

1. MVC设计模式中的Controller及路由Routing

在我们上一篇文章描述appium server在启动http服务器的过程中, 实例化appium 服务器后,下一步就是要设置好从client端过来的请求的数据路由了:

[javascript] view plaincopy

var main = function (args, readyCb, doneCb) {

...

routing(appiumServer)

...

}

这里大家要有MVC设计模式这个背景知识,我相信大家做过界面应用或者网站编程的话应该很熟悉这种解藕降低依赖的著名设计模式,如果不清楚的话请自行百度谷歌。这里我会简要摘录下在我们这个http服务器中Controller扮演的角色:MVC的核心就是Controller(控制器),它负责处理http客户端传送过来的所有请求,并决定要将什么内容响应给http客户端。但Controller并不负责决定内容应该如何显示,而是将特定形态的内容响应给MVC架构,最后才由MVC架构依据响应的形态来决定如何将内容响应给http客户端。如何决定响应内容是View的责任。

nodejs的express架构就是采用了MVC框架的,所以这里才有了我们的Routing,我们先找到对应的Routing文件,然后进去看看。我们先看main.js的比较前的变量定义部分:

var http = require('http'), express = require('express'), ..., routing = require('./routing.js')

可以看到routing是在main.js所在目录的routing.js文件里导出来的,我们打开该文件:

var controller = require('./controller.js')module.exports = function (appium) {var rest = appium.restvar globalBeforeFilter = controller.getGlobalBeforeFilter(appium)// Make appium available to all REST http requests.rest.all('/wd/*', globalBeforeFilter)routeNotYetImplemented(rest)rest.all('/wd/hub/session/*', controller.sessionBeforeFilter)rest.get('/wd/hub/status', controller.getStatus)rest.post('/wd/hub/session', controller.createSession)rest.get('/wd/hub/session/:sessionId?', controller.getSession)rest.delete('/wd/hub/session/:sessionId?', controller.deleteSession)rest.get('/wd/hub/sessions', controller.getSessions)rest.get('/wd/hub/session/:sessionId?/context', controller.getCurrentContext)rest.post('/wd/hub/session/:sessionId?/context', controller.setContext)rest.get('/wd/hub/session/:sessionId?/contexts', controller.getContexts)rest.post('/wd/hub/session/:sessionId?/element', controller.findElement)rest.post('/wd/hub/session/:sessionId?/elements', controller.findElements)rest.post('/wd/hub/session/:sessionId?/element/:elementId?/value', controller.setValue)rest.post('/wd/hub/session/:sessionId?/element/:elementId?/click', controller.doClick)...

路由一开始就指定了我们MVC的处理http客户端过来的Controller是controller.js这个javascript脚本

然后从上面调用穿进来的appiumServer中取出express实例并赋给rest这个变量

然后设置gloabalBeforeFilter这个控制器来处理客户端过来的而在这个routing文件中没有定义的请求的情况

在往下就是定义客户端过来的各种请求的controller处理方法了,比如最下面那个客户端请求对一个控件进行点击操作。这里就不一一列举了。这里要注意的是其中大问号的都是代表变量,真正的值是客户端传送过来的时候赋予的,所以解析的时候可以直接取elementId就能得到真正的值了。

这里有一点我觉得需要跟踪下去的是上面的controller.getGlobalBeforeFilter(appium)这个调用,因为这个方法里面设置了appium server的一个很重的成员变量:

exports.getGlobalBeforeFilter = function (appium) {return function (req, res, next) {req.appium = appiumreq.device = appium.device...}}

就是把appium的device这个成员变量赋予给了nodejs提供的req这个request的device这个变量,当前在没有启动一个与boostrap的session前这个值为null,但往后appium.device将会赋予android这个对象,而因为上面代码的赋值是对象赋值,所以在javascript会是指针传递,那么也就是说最后appium.device被赋值了android对象就相当于req.device被赋予了android这个对象。这个是后话,下面你会跟到这些赋值的变化的了。