小米5小米怎么设置铃声铃声

写点程序,留点回忆,分享点滴,快乐自己
    这里主要是指在eclipse里面查看android文档。前面说过android的官方网站()是被墙的,但是SDK装好之后如果选择了安装文档,会在本地保存一份接口文档。正常安装完成直接可以使用。只要将鼠标悬停在想了解的接口上就可以看到相关javadoc的提示。按F2将弹出窗口固定之后可以用eclipse内置浏览器打开。如果嫌eclipse内置浏览器不好用,可以在eclipse-&Window-&Preferences-&General-&Web Browser中设置成你喜欢的浏览器。
如果看不到相关类的信息而出现以下提示,那么应该是没安装相关docs,需要重新运行SDK Manager,安装相应版本的文档。
安装完毕,在SDK的目录下会出现docs目录
在eclipse里面就可以看到相关类的在线帮助文档了。
按F2后点击如下按钮即可在浏览器中打开详细的文档说明。
我参与的团队
积分与排名
评论排行榜
阅读排行榜Android攻城狮的第一门课(入门...
第1章 搭建Android开发环境
第2章 Android项目结构介绍
第3章 在界面中显示以及输入文本信息...
第4章 在界面中显示图片
第5章 认识按钮Button以及ImageButton...
第6章 监听按钮的点击事件
第7章 挑战!难度略高,胆小慎入!...
第8章 实现动态自动匹配输入的内容...
第9章 使用多状态按钮ToggleButton...
第10章 使用CheckBox实现多选效果...
第11章 使用RadioGroup与RadioButton实...
第12章 五布局之线性布局LinearLayout...
第13章 五布局之相对布局RelativeLayout...
第14章 五布局之帧布局FrameLayout...
第15章 五布局之绝对布局AbsoluteLayout...
第16章 五布局之表格布局TableLayout...
第17章 认识“老朋友”Activity
第18章 使用Intent实现页面跳转
第19章 App签名打包
第20章 使用SDK开发文档
第21章 综合练习&制作简易计算器...
你发的评论可能会是问题?是否将他发到问答中
Copyright (C)
All Rights Reserved | 京ICP备 号-2
本次提问将花费2个积分
你的积分不足,无法发表
本次提问将花费2个积分
继续发表请点击 "确定"请问哪里有android api文档?离线,在线都看不了
本地文档,在线文档目前都看不了。osc上的也看不了
本地文档好像是要下载一个JS,但是下不下来 导致根本不能使用
OSC的也基本打不开,一直卡主,官网的更不说了,比OSC还痛苦
哪里还有文档可以查啊!!
OSC 也会卡??
--- 共有 1 条评论 ---
对啊! OSC的估计也在下载那个JS
本地docs访问速度很慢,这是我的解决方案,可以使用,本人已测试过,可以很快访问。http://my.oschina.net/willedward/blog/91260
你下的sdk里不是有一个api文档吗,就是网页版的,英文,但是能看!
--- 共有 1 条评论 ---
的确是不能看本帖已被设为精华帖!
该文档是Testerhome官方翻译的
官方网站上的:
中文Appium API 文档
第一章:关于appium
appium客户端
客户端类库列表及Appium服务端支持
这些类库封装了标准Selenium客户端类库,为用户提供所有常见的 格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。
Appium客户端类库实现了(一个标准协议的官方扩展草稿)和(一个传输不可预知的自动化协议,该协议定义了MultiAction 接口)的元素。
Appium 服务端定义了官方协议的扩展,为Appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载app。这就是为什么我们需要Appium 特定的客户端,而不是通用的Selenium 客户端。当然,Appium 客户端类库只是增加了一些功能,而实际上这些功能就是简单的扩展了Selenium 客户端,所以他们仍然可以用来运行通用的selenium会话。
Github版本库以及安装指南
JavaScript (Node.js)
Objective C
RobotFramework
1.2 appium介绍
Appium 介绍
Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用。
所谓的“移动原生应用”是指那些用 iOS 或者 Android SDK 写的应用。所谓的“移动 web 应用”是指使用移动浏览器访问的应用(Appium 支持 iOS 上的 Safari 和 Android 上的 Chrome)。所谓的“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。比如,像 ,可以帮助开发者使用网页技术开发应用,然后用原生代码封装,这些就是混合应用。
重要的是,Appium 是一个跨平台的工具:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了 iOS 和 Android 测试套件间代码的复用性。
想知道 Appium 如何支持平台,版本和自动化形态的详细信息,请参见。
Appium 的理念
为了满足移动自动化需求,Appium 遵循着一种哲学,重点体现于以下4个需求:
你无需为了自动化,而重新编译或者修改你的应用。
你不必局限于某种语言或者框架来写和运行测试脚本。
一个移动自动化的框架不应该在接口上重复造轮子。(移动自动化的接口应该统一)
无论是精神上,还是名义上,都必须开源。
Appium 设计
那么 Appium 架构是如何实现这个哲学呢?为了满足第一条,Appium 真正的工作引擎其实是第三方自动化框架。这样,我们就不需在你的应用里植入 Appium 相关或者第三方的代码。这意味着你测试使用的应用与最终发布的应用并无二致。我们使用以下的第三方框架:
iOS: 苹果的
Android 4.2+: Google's
Android 2.3+: Google's . (Instrumentation由单独的项目提供支持 )
为了满足第二点,我们把这些第三方框架封装成一套 API, API.WebDriver(也就是 "Selenium WebDriver") 指定了客户端到服务端的协议。
(参见 )。使用这种客户端-服务端的架构,我们可以使用任何语言来编写客户端,向服务端发送恰当的 HTTP 请求。
目前已经实现了大多数流行语言版本的客户端,这意味着你可以使用任何测试套件或者测试框架。客户端库就是简单的HTTP 客户,可以以任何你喜欢的方式潜入你的代码。换句话说,Appium 和 WebDriver 客户端不是技术意义上的“测试框架”,而是“自动化库”。你可以在你的测试环境中随意使用这些自动化库!
事实上 WebDriver 已经成为 web 浏览器自动化的标准,也成了 W3C 的标准 —— 。我们又何必为移动做一个完全不同的呢?所以我们扩充了,在原有的基础上添加移动自动化相关的 API 方法,这也满足了第三条理念。
第四条就不用说了,。
Appium 概念
Appium 的核心是一个 web 服务器,它提供了一套 REST 的接口。它收到客户端的连接,监听到命令,接着在移动设备上执行这些命令,然后将执行结果放在 HTTP响应中返还给客户端。事实上,这种客户端/服务端的架构给予了许多的可能性:比如我们可以使用任何实现了该客户端的语言来写我们的测试代码。比如我们可以把服务端放在不同
的机器上。比如我们可以只写测试代码,然后使用像
这样的云服务来解释命令。
自动化始终围绕一个session进行,客户端初始化一个seesion(会话)来与服务端交互,不同的语言有不同的实现方式,但是他们最终都是发送为一个POST请求给服务端,请求中包含一个JSON对象,被称作“desired capabilities”。此时,服务端就会开启一个自动化的 session,然后返回一个 session ID,session ID将会被用户发送后续的命令。
Desired Capabilities
Desired capabilities 是一些键值对的集合 (比如,一个 map 或者 hash),客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试。比如,我们可以把platformName capability 设置为 iOS,告诉 Appium 服务端,我们想要一个iOS 的 session,而不是一个 Android 的。我们也可以设置 safariAllowPopups capability 为 true,确保在 Safari 自动化 session 中,我们可以使用 javascript 来打开新窗口。参见 ,查看完整的 capabilities 列表。
Appium Server
Appium server 是用 Node.js 写的。我们可以用源码编译或者从 NPM 直接安装。
Appium 服务端
Appium 服务端有很多语言库 Java, Ruby, Python, PHP, JavaScript 和 C#,这些库都实现了
Appium 对 WebDriver 协议的扩展。当使用 Appium 的时候,你只需使用这些库代替常规的 WebDriver 库就可以了。
你可以从看到所有的库的列表。
我们提供了 GUI 封装的 Appium 服务端下载,它封装了运行 Appium服务端的所有依赖,而不需要担心怎样安装Node.js。其中还包括一个Inspector工具,可以帮助你检查应用的界面层级,这样写测试用例时更方便。
Getting Started
恭喜!你现在有足够的知识来使用 Appium 了。 来我们回到
继续了解更加
细节的需求和指南。
第二章:进阶指南
selenium配置
Selenium Grid
使用 "--nodeconfig" 服务器参数,你可以在本地 selenium grid 里注册你的 appium 服务器。
& node . -V --nodeconfig /path/to/nodeconfig.json
在 node 的配置文件里,你需要定义 "browserName","version" 和 "platform"。
基于这些参数,selenium grid 会将你的测试定向到正确的设备上去。你还需要配置你的 host 详细信息和
selenium grid 的详细信息。你可以在
找到详细的参数列表和描述信息。
一旦你启动了 appium 服务器并且在 grid 里注册了信息,你会在 grid 控制台发现你的设备:
"http://&grid-ip-adress&:&grid-port&/grid/console"
Grid 配置文件例子{
"capabilities":
"browserName": "&e.g._iPhone5_or_iPad4&",
"version":"&version_of_iOS_e.g._6.1&",
"maxInstances": 1,
"platform":"&platform_e.g._MAC_or_ANDROID&"
"configuration":
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://&host_name_appium_server_or_ip-address_appium_server&:&appium_port&/wd/hub",
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": &grid_port&,
"hubHost": "&Grid_host_name_or_grid_ip-address&"
可以在 查看有效的 platform 参数。
如果没有给出url、host和 port,配置会自动指向本地:whatever-port-Appium-started-on。
如果你的Appium服务和Selenium Grid服务没有运行在同一台机器上,为确保Selenium Grid连接正常,请在你的host & url docs上使用外部其它名称或IP地址,而非localhost 和 127.0.0.1
2.2 自动化混合应用
自动化混合应用
Appium 其中一个理念就是你不能为了测试应用而修改应用。为了符合这个方法学,我们可以使用 Selenium 测试传统 web 应用的方法来测试混合 web 应用 (比如,iOS 应用里的元素 "UIWebView" ),这是有可能的。这里会有一些技术性的复杂,Appium 需要知道你是想测试原生部分呢还是web部分。幸运的是,我们还能遵守 WebDriver 的协议。
自动化混合 iOS 应用
在你的 Appium 测试里,你需要以下几步来和 web 页面交涉:
前往到应用里 web 视图激活的部分。
这会返回一个我们能访问的 web 视图的 id 的列表。
使用你想访问的这个 web 视图的 id 作为参数,调用
(这会将你的 Appium session 放入一个模式, 在这个模式下,所有的命令都会被解释成自动化web视图而不是原生的部分。比如,当你运行 getElementByTagName,它会在 web 视图的 DOM 上操作,而不是返回 UIAElements。当然,一个 Webdriver 的方法只能在一个上下文中有意义,所以如果在错误的上下文,你会收到错误信息。)
如果你想停止 web 视图的自动化,回到原生部分,你可以简单地使用 execute_script 调用 "mobile: leaveWebView" 方法来离开 web 层。
在 iOS 真机上运行
appium 使用一个远程调试器建立连接来实现和 web 视图的交互。当在模拟器上执行下面例子的时候,我们可以直接建立连接,因为模拟器和 appium 服务器在同一台机器上。
当在真机上运行用例时,appium 无法直接访问 web 视图,所以我们需要通过 USB 线缆来建立连接。我们使用 建立连接。
使用 brew 安装最新的 ios-webkit-debug-proxy。在终端运行一下命令:
# 如果你没有安装 brew 的话,先安装 brew。
& ruby -e "$(curl -fsSL /mxcl/homebrew/go/install)"
& brew update
& brew install ios-webkit-debug-proxy
你也可以通过 git 克隆项目来自己安装最新版本:
# Please be aware that this will install the proxy with the latest code (and not a tagged version).
& git clone /google/ios-webkit-debug-proxy.git
& cd ios-webkit-debug-proxy
& ./autogen.sh
& ./configure
& sudo make install
一旦安装好了, 你就可以启动代理:
# 将udid替换成你的设备的udid。确保端口 27753 没有被占用
# remote-debugger 将会使用这个端口。
& ios_webkit_debug_proxy -c 0e4b2f612b65e98c1d07d22ee429:27753 -d
注意: 这个 ios-webkit-debug-proxy 需要 "web inspector" 打开着以便建立连接。在
settings & safari & advanced
里打开它。请注意 web inspector 在 iOS6 时候加入的 以前的版本没有。
Wd.js Code example// 假设我们已经有一个初始化好了的 `driver` 对象。
driver.elementByName('Web, Use of UIWebView', function(err, el) { // 找到按钮,打开 web 视图
el.click(function(err) { // 引导到 UIWebView
driver.windowHandles(function(err, handles) { // 得到能访问的视图列表。
driver.window(handles[0], function(err) { // 因为只有一个,所以选择第一个。
driver.elementsByCss('.some-class', function(err, els) { // 通过 css 拿到元素。
els.length.should.be.above(0); // 肯定有元素。
els[0].text(function(elText) { // 得到第一个元素的文本。
elText.should.eql("My very own text"); // 比较匹配文本。
driver.execute("mobile: leaveWebView", function(err) { // 离开web视图上下文。
// 如果你想的话,做一些原生应用的操作。
driver.quit(); // 退出。
想看到具体的上下文,请看
*我们正在完善 web 视图下面的方法。
Wd.java 代码例子//配置 webdriver 并启动 webview 应用。
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("device", "iPhone Simulator");
desiredCapabilities.setCapability("app", "http://appium./WebViewApp6.0.app.zip");
URL url = new URL("http://127.0.0.1:4723/wd/hub");
RemoteWebDriver remoteWebDriver = new RemoteWebDriver(url, desiredCapabilities);
// 切换到最新的web视图
for(String winHandle : remoteWebDriver.getWindowHandles()){
remoteWebDriver.switchTo().window(winHandle);
//在 guinea-pig 页面用 id 和 元素交互。
WebElement div = remoteWebDriver.findElement(By.id("i_am_an_id"));
Assert.assertEquals("I am a div", div.getText()); //验证得到的文本是否正确。
remoteWebDriver.findElement(By.id("comments")).sendKeys("My comment"); //填写评论。
//离开 webview,回到原生应用。
remoteWebDriver.executeScript("mobile: leaveWebView");
//关闭应用。
remoteWebDriver.quit();
Wd.rb cucumber 的例子TEST_NAME = "Example Ruby Test"
SERVER_URL = "http://127.0.0.1:4723/wd/hub"
APP_PATH = "/s/112/ts_ios.zip"
capabilities =
'browserName' =& 'iOS 6.0',
'platform' =& 'Mac 10.8',
'device' =& 'iPhone Simulator',
'app' =& APP_PATH,
'name' =& TEST_NAME
@driver = Selenium::WebDriver.for(:remote, :desired_capabilities =& capabilities, :url =& SERVER_URL)
## 这里切换到最近一个窗口是因为在我们的例子里这个窗口一直是 webview。其他的用例里,你需要自己指定。
## 运行 @driver.window_handles,查看 appium 的日志,找出到底哪个窗口是你要的,然后找出相关的数字。
## 然后用 @driver.switch_to_window(number),切换过去。
Given(/^I switch to webview$/) do
webview = @driver.window_handles.last
@driver.switch_to.window(webview)
Given(/^I switch out of webview$/) do
@driver.execute_script("mobile: leaveWebView")
# 你可以使用 CSS 选择器在你的 webview 里来选择元素
And(/^I click a webview button $/) do
@driver.find_element(:css, ".green_button").click
用 ruby 调试 web 视图:
我在我的帮助类里创建了一个快速方法来定位web元素,无论它在哪一个窗口视图。
(这非常有帮助,特别是你的 webview 的 id 变化或者你用同一份代码来测试 Android 和 iOS。)
自动化混合 Android 应用
Appium 通过 Chromedriver 内建混合应用支持。Appium 也可以使用 Selendroid 做为 4.4 之前的设备对 webview 支持的背部引擎。(你需要在 desired capability 里指定 "device": "selendroid")。然后:
前往你应用里 web 视图激活的部分。
用 "WEBVIEW" 做窗口句柄调用
, 比如 driver.window("WEBVIEW")。
(这会将你的 Appium session 放入一个模式, 在这个模式下,所有的命令都会被解释成自动化web视图而不是原生的部分。比如,当你运行 getElementByTagName,它会在 web 视图的 DOM 上操作,而不是返回 UIAElements。当然,一个 Webdriver 的方法只能在一个上下文中有意义,所以如果在错误的上下文,你会收到错误信息。)
如果要停止web上下文里的自动化,回到原生部分的自动化,简单地使用 "NATIVE_APP" 调用 window 方法。比如 driver.window("NATIVE_APP")。
注意:我们可以像上面说的,使用同样的策略。然而,Selendroid 使用 WEBVIEW/NATIVE_APP 窗口设置策略。 Appium 常规的混合支持也使用这种策略。
Wd.js 代码例子// 假设我们已经初始化了一个 `driver` 实例。
driver.window("WEBVIEW", function(err) { // 选择唯一的 WebView
driver.elementsByCss('.some-class', function(err, els) { // 通过 CSS 取得元素
els.length.should.be.above(0); // 验证元素存在
els[0].text(function(elText) { // 得到第一个元素的文本
elText.should.eql("My very own text"); // 验证文本内容
driver.window("NATIVE_APP", function(err) { // 离开 webview 上下文
// 可以做些原生应用的测试
driver.quit(); // 关闭 webdriver
Wd.java 代码例子//配置 webdriver 并启动 webview 应用。
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("device", "Selendroid");
desiredCapabilities.setCapability("app", "/path/to/some.apk");
URL url = new URL("http://127.0.0.1:4723/wd/hub");
RemoteWebDriver remoteWebDriver = new RemoteWebDriver(url, desiredCapabilities);
// 切换到最新的web视图
remoteWebDriver.switchTo().window("WEBVIEW");
//在 guinea-pig 页面用 id 和 元素交互。
WebElement div = remoteWebDriver.findElement(By.id("i_am_an_id"));
Assert.assertEquals("I am a div", div.getText()); //验证得到的文本是否正确。
remoteWebDriver.findElement(By.id("comments")).sendKeys("My comment"); //填写评论。
//离开 webview,回到原生应用。
remoteWebDriver.switchTo().window("NATIVE_APP");
//关闭应用。
remoteWebDriver.quit();
2.3 用例迁移
把appium 0.18.x上的测试用例集迁移到appium1.x上
Appium 1.0 已经从先前的版本中移除了一部分过时的特性, 这个指导文档会帮助你了解使用Appium 1.0需要做的具体改变.
新的客户端库
你需要关注的最大的改变是利用新的appium的client libraries来替换原生的WebDriver ciients. 访问 去寻找符合你自己编程语言的客户端库吧. 在每个客户端的网站上都可以找到用于集成到你代码中的依赖库相关介绍和下载
基本上, 你需要做如下的改变(以Python作为例子)
from appium import webdriver
替换原来的:
from selenium import webdriver
新的适配参数
下面的适配参数将不再使用
取而代之的是利用下面的配置参数
platformName ("iOS" 或者 "Android")
platformVersion (你希望测试的os版本)
deviceName (你想用的设备, 比如 "iPhone Simulator")
automationName ("Selendroid" 如果你想使用Selendroid的话, 否则可以省略)
app 配置参数保持不变, 但是特指非浏览器的app, 如果你想使用类似Safari或者Chrome这样的浏览器, 你需要设置browserName. 这代表app和browserName是互斥的.
我们把appium的配置参数都规范为驼峰拼写法(camelCase), 这代表着原来的app-package或者app-wait-activity现在会变成appPackage和appWaitActivity. 当然目前android的app package和activity都已经是自动探测了, 大部分情况下你可以省略这两个配置项.
新的定位方式
我们已经移除了下面的定位方式
我们增加了accessibility_id定位方法去做过去name做的事情. 具体的细节还得跟你使用的Appium客户端库有关.
tag name已经被替换为class name. 所以想通过UI的类型来定位某个元素, 你需要使用class name定位方式
关于class name和xpath的定位方式: 现在需要使用完整的全类名, 这意味着如果你有一个如下的定位用的xpath
//table/cell/button
现在需要改成
//UIATableView/UIATableCell/UIAButton
如果是android的话, button需要改变成android.widget.Button
我们也增加了如下的定位方式
-ios uiautomation
-android uiautomator
根据你使用的客户端去相应的使用新的定位方式
使用xml, 不再是json了
App source方法先前返回JSON, 现在修改成返回XML. 所以如果你有代码是依赖解析app source的, 那么就需要更新
通过context支持混合应用, 不再是window了
以前混合app的切换支持是通过"windows"
window_handles
switch_to.window
现在Appium支持"context" 概念了, 要获得当前环境下所有的上下文(contexts), 或者特定的context, 你可以用
driver.contexts
current = driver.context
在这些context之间切换, 可以使用
driver.switch_to.context("WEBVIEW")
没有了execute_script("mobile: xxx")
所有的mobile:方法都已经被移除, 并且被替换为appium client libraries的原生方法. 这意味着如果一个方法调用原来的方式是
driver.execute("mobile: lock", [5])
现在需要更新为
driver.lock(5)
在这个地方lock已经变成了原生的客户端方法. 当然具体的调用细节在不同的客户端库中的实现可能会有所差别.
特别需要注意的是, 手势(gesture)方法已经被替换为TouchAction / MultiAction API, 它允许更强大通用的组合手势的自动化. 可以参考你的客户端库的具体用法.
这就是全部啦, 祝迁移愉快
(文档由翻译, 欢迎更多热爱技术的同学加入到翻译中来, We Love Appium)
2.4 appium设置
Settings 是 Appium 引入的一个新的概念。 它目前还没有被纳入 Mobile JSON Wire Protocol 及 Webdriver 标准之中。
Settings 是一种用来配置 Appium 服务器的方式。
Settings 有以下特点:
可变的,它在同一会话中是可以被修改的。
唯一的,它在被测应用会话中是唯一的。 它在每创建一个新会话时会被重置。
可控的,它在自动化测试过程中控制着 Appium 服务器的运行。 它们不会被用来控制被测应用或被测终端。
在 Android 环境中 以 ignoreUnimportantViews 设置举例,该参数在 Android 环境中可以被设置成忽略所有与当前视图无关的元素,它将使测试过程更加有效率。 然而当我们希望能够访问被忽略的元素时,我们必须在将 ignoreUnimportantViews 设置成 true 后,重新修改成 false 。
另外也可以通过 Settings 配置让 Appium 忽略所有当前不可见的元素。
Settings 可以通过以下 API 方法进行配置:
POST /session/:sessionId/appium/settings
以 JSON 格式提交 key:value 键值对形式的Settings配置。
settings: {
ignoreUnimportantViews : true
GET /session/:sessionId/appium/settings
以 JSON 格式返回当前所有 Settings 配置。
ignoreUnimportantViews : true
其它 Settings 配置参考
"ignoreUnimportantViews" -该参数值为 true 或 false。 如果你希望能够尽量减少测试过程的交互确认过程,或希望测试脚本能更快的执行,可以在 Android 终端环境下使用 setCompressedLayoutHeirarchy() 参数。它将忽略所有被标记为 IMPORTANT_FOR_ACCESSIBILITY_NO 或 IMPORTANT_FOR_ACCESSIBILITY_AUTO(以及那些被认为不是很重要的系统元素)的元素。
第三章:appium 设置
3.1 加速器管理
Intel(R) 硬件加速器管理
如果你发现android模拟器太慢, 并且你的系统运行在Intel(R) 的cpu上. 那么你可以尝试下HAXM, HAXM能够让你充分利用硬件虚拟化技术来加速android模拟器。
要安装HAXM, 你可以打开Android SDK Manager, 你可以在Extras中发现这个安装选项;
你可以在找到所有相关的文档;
这将需要x86的模拟镜像;
利用Intel的包来安装HAXM; Android SDK Manager有时候会安装不成功,这主要取决于你安装的版本是否兼容。
3.2 android 设置
Android Setup
使用前,你需要安装node.js(版本大于等于0.10)。 请参照 。
当node.js安装成功后,请安装 。
运行'android' tool(位于SDK,tool文件目录下)。
运行'android' tool 来安装大于等于Level 17的API。
(如果你想从Appium的源码来运行,可在真机或者模拟器上用
来编译bootstrap jar包)。
最后,将环境变量$ANDROID_HOME设置为 Android SDK 的路径。例如,如果你将Android SDK 解压到 /usr/local/adt/,你需要把这个路径加到你的shell环境变量中去:
export ANDROID_HOME="/usr/local/adt/sdk"
现在就可以启动Appium了!如果你在源码中运行Appium请运行
./reset.sh --android 版本从Appium checkout会安装所有的依赖。
老版本的额外安装
当android的版本是2.3到4.1的时候,appium用的是selendroid。 当它检测到时低版本时,它会自动应用Selendroid。但是需要配置一些额外的设置如果从source运行。
或更新 (mvn)
运行 ./reset.sh --selendroid 从checkout的Appium源码
(运行Appium Android 测试)
在Linux上运行,启动一个API大于等于level17的AVD。 在源文件目录下运行 (appium) 在安装好 NPM, 或者 node。如果你选择的是从源代码方式运行。
来了解所有命令和参数。
Android 加速模拟器需要存在,它有自己的局限性,如果想了解更多,请看这里
如果你想运行任何Appium的测试,或者任何强大的命令,确保你的 hw.battery=yes 在 AVD's config.ini文件中。
Selendroid 需要你APP中的如下权限:
&uses-permission android:name="android.**permission.INTERNET"/&,
如果你在使用selendroid或者低版本的android(如版本2.3到4.1),请确保你的App已设置internet权限。
3.3 部署iOS app 到手机上
部署iOS app 到手机上
准备在真机上执行appium测试, 需要如下准备:
用特殊的设备参数来构建app
使用 , 这是一个第三方程序,可以用来部署你构建的app到手机上
Xcodebuild 命令的参数:
新的参数运行指定设置. 参考 :
xcodebuild [-project projectname] [-target targetname ...]
[-configuration configurationname] [-sdk [sdkfullpath | sdkname]]
[buildaction ...] [setting=value ...] [-userdefault=value ...]
这有一个资料来参考可用的
CODE_SIGN_IDENTITY (Code Signing Identity)
介绍: 标识符,指定一个签名。
例如: iPhone Developer
PROVISIONING_PROFILE 已经从可用的的命令中消失了,但还是有必要设置的。
在xcodebuild命令中设置 "CODE_SIGN_IDENTITY" & "PROVISIONING_PROFILE":
xcodebuild -sdk &iphoneos& -target &target_name& -configuration &Debug& CODE_SIGN_IDENTITY="iPhone Developer: Mister Smith" PROVISIONING_PROFILE="XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX"
成功的话, app会构建到如下目录 &app_dir&/build/&configuration&-iphoneos/&app_name&.app
用Fruitstrap进行部署
clone一个fruitstrap的fork版本在 ,这个已经不再维护. 已确认该fork可用, 但是其它的据说也可用。
clone成功的话, 执行 make fruitstrap
然后, 然后复制生成的 fruitstrap到app的所在的目录或上级目录下。
运行fruitstrap 通过输入以下命令 (命令是否可用依赖于你fork的 fruitstrap):
./fruitstrap -d -b &PATH_TO_APP& -i &Device_UDID&
如果是为了持续集成,你可以发现很有用的方法来记录fruitstrap命令行和日志文件中的记录, 像这样:
./fruitstrap -d -b &PATH_TO_APP& -i &Device_UDID& 2&&1 | tee fruit.out
在node服务启动前fruitstrap进行需要被结束, 一个方法是扫描fruitstrap的输出来得知app完成启动。 有一个有效的方法是通过一个Rakefile 和一个 go_device.sh 脚本:
bundle exec rake ci:fruit_deploy_app | do
echo "$line" | grep "text to identify successful launch"
if [ $? = 0 ]
echo "App finished launching: $line"
kill -9 `ps -aef | grep fruitstrap | grep -v grep | awk '{print $2}'`
一旦fruitstrap的进程被结束, node 服务就可以启动并且appium测试可以被执行!
3.4 Android并发测试
Android并发测试
Appium提供了在一台设备上启动多个Android会话的方案,而这个方案需要你输入不同的指令来启动多个Appium服务来实现。
启动多个Android会话的重要指令包括:
-p Appium的主要端口
-bp Appium bootstrap端口
--chromedriver-port chromedriver端口(当使用了webviews或者chrome)
--selendroid-port selendroid端口(当使用了selendroid)
更多参数的解释详见 。
如果我们有两台设备,设备ID分别为4,我们应该用下面的命令启动来两个不同的Appium服务:
node . -p 4492 -bp 2251
node . -p 4491
-bp 2252 -U 43364
只要你的Appium和Appium bootstrap端口介于0和65536即可,并且保证是两个不同的端口以便两个Appium服务不会监听相同的端口。确认你的-u参数绑定正确的设备ID。这可以让Appium知道连接哪台设备,所以参数一定要准确。
如果你用了chromedriver或selendroid,不同的服务要设置不同的端口。
iOS并发测试
不幸的是,IOS不能进行本地并发测试。跟Android不一样,IOS在同一时间只能启动一个版本的模拟器来运行多个测试。
如果你想在IOS上进行并发测试,你需要用到Sauce。只需上传你的Appium测试脚本到Sauce,它就可以按照你的设置执行多个IOS或Android的并发测试。在Sauce上执行测试的更多信息,详见。
3.5 Appium支持的平台
Appium支持的平台
Appium支持很多的运行平台和测试方式(包括原生、混合应用、内嵌浏览器、真机、模拟器等)。这篇文档主要用来让大家明确在使用
Appimu的时候支持的平台版本和上述测试方式的必备条件。
iOS平台支持
请移步到 。这里介绍了在iOS系统下使用Appium的必备条件和安装说明。
版本号:6.1,7.0,以及7.1。
支持设备:iPhone模拟器,iPad模拟器以及iPhones和iPads真机。
是否支持原生应用:支持。同时支持模拟器中调试应用版本和正确签名的真机ipa。其他相关支持由苹果的框架提供。
是否支持内置移动浏览器:支持。Safari浏览器已经通过测试。对于真机,则需要安装调试工具ios-webkit-remote-debugger。很遗憾,对于Safari的原生界面的自动化是不支持的。更多信息请移步至 。
是否支持混合应用:支持。同样对于真机需要安装调试工具ios-webkit-remote-debugger,更多详情请移步至 查看详情。
是否支持在同一个session中执行多个应用的自动化:不支持。
是否支持同时再多个设备上执行自动化:不支持。
是否支持第三方提供应用:只支持在模拟器上有限的第三方应用(例如:喜好设置、地图等)。
是否支持自定义的、非标准UI控件的自动化:仅支持很少一部分。最好对控件添加可识别信息,以方便对元素进行一些基础的自动化操作。
Android平台支持
请移步至 ,,或者 获得在不同操作系统下android平台对appium的支持和安装配置文档。
支持版本:android 2.3平台及以上。
android 4.2平台及以上通过Appium自有的类库支持。默认在自动化后台。
从android 2.3到4.3平台,Appium是通过绑定,实现自动化测试的,你可以到android开发社区的。(仪表盘)中查看相关介绍。Selendroid拥有一套不同的命令行和不同的profile文件(这部分差距正在逐步缩小)。要获得在后台运行自动化的权限,需要配置automationName 组件的值为 Selendroid。
支持的设备:Android模拟器和Android真机。
是否支持原生应用:支持。
是否支持内置移动浏览器:支持(除了使用Selendroid后台运行的情况)。通过代理方式绑定到来运行自动化测试。在android4.2和4.3版本中,只有在官方版本的谷歌浏览器或者Chromium下才能运行自动化测试。伴随着android 4.4+版本的出现。自动化测试则可以运行在内置浏览器的应用程序。但是需要在测试设备环境下安装Chrome/Chromium/浏览器。请移步至 获取更多详情。
是否支持混合应用: 支持。请移步至参考相关文档。
通过默认的Appium的后台支持android 4.4以上的版本。
通过Selendroid的后台支持android 2.3以上的版本。
是否支持在同一个session中执行多个应用的自动化:支持(但是不支持使用Selendroid后台的场景)。
是否支持同时再多个设备上执行自动化:支持,。尽管Appium必须要启动另一个端口即通过添加参数的方式运行命令行,例如--port,--bootstrap-port(或者--selendroid-port)或者--chromedriver-port。更多详情请移步至。
是否支持第三方应用自动化:支持(但是不支持Selendroid后台运行的场景)。
是否支持自定义的、非标准UI控件的自动化:不支持。
3.6 Appium在真机上
Appium在真机上
Appium已经初步支持真机测试。
如果要在真机上执行测试,你将要做如下准备:
1.一个苹果的开发者ID和有效的开发者对应的配置文件和签名文件
2.一台iPad或者iPhone
你要测试的应用的源码
一台安装了XCode和XCode Command Line Developer Tools的Mac机器
Provisioning Profile
要在真机上测试就需要一个有效的iOS开发者的Distribution Certificate and Provisioning Profile。你可以在这个上面找到配置这些的相关信息
同样的,你还需要对你的应用签名,更多的信息可以查看.
你必须使用Xcode的执行按钮来安装你的应用
使用Appium运行你的测试
一旦你的设备和应用设置好了之后,你就能够用如下的命令在你的机器上执行测试:
node . -U &UDID& --app &bundle_id&
这将会启动Appium并且开始在真机上测试应用。
疑问解答思路
确认UDID已经正确的在xcode organizar或itunes中设置了。很长的字符串(20多个字符串)
0.确认你测试代码中的测试对象设备的设置
再次确认你从instruments启动你的自动化测试
确认instruments已经关闭
3.7 在 Linux 上运行 Appium
在 Linux 上运行 Appium限制
如果你在 Linux 上使用 Appium, 那么你没法使用已经构建好的 '.app',那是为 OS X 准备的。 另外由于 Appium 在测试 iOS 应用时 依赖 OS X 特有的库, 所以你也没有办法测试在 Linux 上测试 iOS 应用。
首先,安装版本高于或等于 0.8 的 nodejs。可以根据
进行安装。
安装好了 node.js 之后,安装 。 你会需要运行 android adb 等工具,这些工具都在 SDK 里包含了, 你要做的是配置环境变量。当然你要确保你的 API level 大于等于 17。 你也需要使用 Ant 来构建 bootstrap jar 以便 Appium 使用它来测试 Android 应用。
最后, 设置 $ANDROID_HOME 为你的 Android SDK 的路径。比如, 你将 Android SDK 解压在 /usr/local/adt/, 那你就要将如下添加到你的 .bashrc 或 .zshrc 或 .bash_profile 等 shell 配置文件中去:
export ANDROID_HOME="/usr/local/adt/sdk
现在你可以运行 Appium 了, 在你 checkout 出来的 Appium 目录里, 运行 .reset.sh --android, 它会帮助你安装好所有的依赖。
运行 Appium
运行测试前, 你需要启动一个 API Level 大于等于 17 的 Android 模拟器或者连接一个系统是 4.1 以上的 Android 真机。然后在 Appium 目录运行
找到所有的命令行参数。
There exists a hardware accelerated emulator for android, it has it's own
limitations. For more information you can check out this
Android 有一些硬件加速的模拟器,这些模拟器有自己的限制。你可以在
找到更多的信息。
确保你使用的 AVD 里面的 config.ini 有这条指令 hw.battery=yes。
3.8 在 Mac OS X 上使用 Appium
在 Mac OS X 上使用 Appium
在 OS X 上, Appium 支持 iOS 和 Android 测试
系统配置 (iOS)
Appium 需要 Mac OS X 10.7, 推荐 10.8。 (经过测试, 10.9 也能工作。)
确保 Xcode 和 iOS SDK 都已经安装好了。 (当前 Appium 支持 Xcode 4.6.3/iOS 6.1 和 Xcode 5/iOS 7.0。 注意不推荐在基于 Xcode 5 下且低于 7.0 的 iOS 版本进行测试。 参照下篇可以获取更多信息)
你需要授权 iOS 模拟器的使用。如果你是通过 NPM 安装的 Appium,那么你可以运行 sudo authorize_ios (authorize_ios)是来自 Appium npm 包里的一个二进制执行文件。如果你是从源代码运行 Appium,那么你可以简单的使用 sudo grunt authorize。如果你使用, 那你只要用界面来操作。
如果你使用的是Xcode 6,在启动Appium之前,你需要打开模拟器,并且在你需要进行输入文字的操作之前,必须先将输入法提前调出。你可以通过点击输入区域或通过快捷键command-K来将软键盘唤出。
Xcode 6中,有一个Devices的模块(command-shift-2可唤出)。你必须确保Appium 的capabilities参数中,所使用到的deviceName要存在于Devices里。换句话说,如果capabilities中的deviceName为"iPhone 5s",platformVersion为"8.0",那么你必须确保Devices中要存在那么一个设备是"iOS8系统的iPhone5s",否则Appium将不知道使用哪一个设备进行测试。
在iOS8设置中的开发者选项里面,你可以打开或关闭UIAutomation。如果你的是iOS8设备,请在运行Appium之前,确保UIAutomation是打开状态的。
使用多种 iOS SDK 进行测试
Appium 使用苹果提供的 instruments 来启动 iOS 模拟器,默认它会使用当前安装的 Xcode 和该 Xcode 下安装好的最高版本的 iOS SDK。这就意味着如果你想测试 iOS 6.1, 但是你安装了 iOS 7.0, 那么 Appium 会强制使用 7.0 的模拟器。 唯一的方法就是安装多个Xcode,然后在安装不同的 SDK。然后在启动 Appium 前,切换到你要测试的特定的版本。
另外,我们发现 Xcode 5 上的 iOS 6.1 测试,会很慢而且不稳定。所以我们推荐,如果要在 6.1 及 6.1 以下版本的 iOS 上进行测试,请使用 Xcode 4.6.3。如果要在 iOS 7.0 上测试,请使用 Xcode 5。假设我们的 Xcode 5 在 /Applications/Xcode.app, Xcode 4.6 在 /Applications/Xcode-4.6.app,我们就可以用下面的命令来切换到 Xcode 4.6 来为 iOS 6.1 测试做准备。
sudo xcode-select -switch /Applications/Xcode-4.6.app/Contents/Developer/
如果要回到 Xcode 5 的话,我们再运行一次:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
系统配置 (Android)
在Mac OSX 上运行Android项目所需要的配置,与Linux的配置方法是一致的,请参考 。
3.9 在Windows上运行Appium
在Windows上运行Appium局限性
如果你在windows上安装appium,你没法使用预编译专用于OS X的.app文件,你也将不能测试IOS apps,因为appium依赖OS X专用的库来支持IOS测试。这意味着你只能通过在mac上来运行IOS的app测试。这点限制挺大。
安装 0.8版本及以上, 通过官方的安装程序来安装。
安装android的sdk包,(), 运行依赖sdk中的'android'工具。并确保你安装了Level17或以上的版本api。设置ANDROID_HOME系统变量为你的Android SDK路径,并把tools platform-tools两个目录加入到系统的Path路径里。因为这里面包含有一些执行命令
安装java的JDK,并设置JAVA_HOME 变量为你的JDK目录。
或者直接使用Android Windows SDK自带的ant,地址在eclipse\plugins目录,你需要把这个目录加到你的系统PATH变量中
安装. 并且设置M2HOME和M2环境变量,把M2环境变量添加到你的系统PATH变量中。
安装. 确保你安装了windows下的Git,以便可以运行常用的command命令
现在,你已经下载安装了所有的依赖,开始运行
运行Appium
要在windows上运行测试用例,你需要先启动Android模拟器或者连接上一个API Level17以上的android真机。然后在命令行运行appium。
如果你是使用源码运行Appium的,请在你所安装的appium目录下执行node.js命令:
在windows系统下运行appium.app时,需要使用管理员权限;当你通过源码的形式运行Appium时,也需要使用管理员权限启动CMD。
在windows系统下运行Android项目时,启动Appium时请带上--no-reset或--full-reset命令。
有一个硬件加速模拟器用于android,但是它有自己的一些限制,如果你想了解更多,请参考
确保在你的AVD的config.ini中有一个配置项为hw.battery=yes
最简略的安装方式
出于对官方文档的尊重,我按照原文翻译,如下介绍我的安装心得。官方提到的一些工具,其实并不需要安装。
下面介绍我已经测试过的安装和使用过程
安装appium
安装nodejs
使用npm安装appium,npm install -g appium
运行appium
启动appium,直接运行appium 即可。
更新appium
通过npm install -g appium 来更新appium即可
如果有任何疑问,欢迎到来交流
3.10 Appium 故障排除
Appium 故障排除
当你遇到问题时,请不要急着将问题提交到Github,也不用急着发到,也许你可以在本文中找到答案。
常见问题解决办法
确保你的每一个步骤都是遵循
确保你的系统配置正确。(例如:Xcode是否升级到了最新版本,Android SDK是否有设置到环境变量ANDROID_HOME中去。)
确保你的应用存放路径没有错误。
Appium.app运行出现问题的解决办法
升级Appium.app后重新打开即可解决。如果提示你不能升级,则需要重新下载Appium.app,下载地址:
通过源码启用Appium出现问题的解决办法
使用git pull拉取最新源码,确保运行的代码是当前最新版本。
针对你所自动化的平台,运行reset.sh命令:
./reset.sh
./reset.sh --ios
# ios-only
./reset.sh --android
# android-only
./reset.sh --selendroid
# selendroid-only
当你需要下载以及构建测试应用时,运行reset.sh时你需要用到--dev指令。
你也可以使用appium-doctor来自动检测你的环境依赖都是否正常。如果你是使用源码运行,则需要使用到bin/appium-doctor.js或node bin/appium-doctor.js。
当你将Android SDK升级到22后,可能出现如下错误:
{ANDROID_HOME}/tools/ant/uibuild.xml:155: SDK does not have any Build Tools installed.
这是因为在Android SDK 22中,platform 和 build 工具被分拆到他们各自的SDK管理包中去了。你需要确保你的机器上正确安装了build-tools 和 platform-tools。
Android常见问题解决办法
确保 Android 模拟器启动并运行着。
出现设备连接问题时,运行adb kill-server && adb devices是非常有效的。它能够帮助重置和连接Android设备。
请确保环境变量 ANDROID_HOME 指向的是正确的Android SDK的路径。
IOS常见问题解决方案
确保Instruments.app是关闭的。
如果你是使用模拟器运行的,请不要将真机设备连接电脑。
确保模拟器或真机中,设置里面的accessibility辅助功能是关闭状态的。
确保App是编译在当前运行的模拟器上。
确保App是编译在合适的模拟器(或真机)上,不然会出现posix spawn的报错。(比如:运行在debug模式下的模拟器)
如果你曾经用 sudo 运行过 Appium, 你需要先删除/tmp/instruments_sock, 执行sudo rm /tmp/instruments_sock。然后在不适用SUDO的情况下再次启动Appium即可。
第一次运行Appium时,需要对Instruments进行授权。不然的话会经常弹出对话框要求你输入密码。如果你从源代码运行 Appium,你只需在主分支上运行sudo grunt authorize来回避该弹窗。如果用 npm 安装的话,运行 sudo authorize_ios 即可。注意,当你每次安装了新版本的xcode,你都需要重复以上操作。
如果检查路径正确,但仍然报 iOS Simulator failed to install the application.的错误的时候,请尝试重启你的电脑。
Webview/Hybrid/Safari 应用支持
确保真机上的'Web Inspector'为打开状态。
确保打开了Safari的开发模式。(Safari - Advance Preferences- Developer menu for
simulators)
确保由client library提供的Appium命令-context能够正常得对contexts进行切换。
当你尝试打开代理的时候,出现如下错误:select_port() failed,请参考
FirefoxOS常见问题解决办法
确保 Boot-to-Gecko 模拟器启动并运行着。
确保模拟器的屏幕是亮着并无锁屏的(可能需要重启 B2G).
到社区寻求帮助
若通过上述方法你的问题依然没有得到解决,你可以:
如果你的 Appium 无法正常工作,然后错误信息不够清晰,欢迎加入 中发表你的问题,你的问题需要包括以下内容:
你是如何运行Appium的?(Appium.app, npm, source)
你使用的是什么操作系统?
你使用的是什么设备?版本是什么? (i.e. Android 4.4, or iOS 7.1)
你使用的是真机还是模拟器?
给出你得到的客户端和服务端的出错日志 (比如,"我的Python代码中报了如下错误:balabala,在Appium server中的输出内容如链接中所示")
除了上述, 贴出 Appium 服务器端的输出也非常重要,特别是运行在 verbose 模式。这样我们可以分析诊断问题在哪里。
如果你确信你发现的是一个BUG,请到中提交一个issue,并将BUG的内容描述清楚。
如果你从 Node 官网安装的 Node,那需要你使用 sudo 运行 npm。 但这么做并不是非常理想。请尝试从
获取node 或运行brew install node来安装 。
Webview通过代理可以支持iOS真机设备,请参考
有时候, iOS 的 UI 元素在定位到之后几毫秒会突然变得无效。这会导致一个类似(null) cannot be tapped的错误。唯一的解决方法就是把finding-and-acting的代码放到 retry 块里。
如果你是通过MacPorts安装了Node和Npm,你必须确保MacPorts的bin文件夹已经被添加到环境变量PATH中去,不然Appium会出现难以找到可执行node的情况。
特定的错误
Resolution
Running reset.sh
xcodebuild: error: SDK "iphonesimulator6.1" cannot be located
安装 iPhone 6.1 SDK 或者 使用单独的 SDK 构建 待测应用 比如: grunt buildApp:UICatalog:iphonesimulator5.1
Running reset.sh
Warning: Task "setGitRev" not found. Use --force to continue.
使用git submodule update --init更新模块并再次运行reset.sh
Running reset.sh
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project selendroid-server: Compilation failure [ERROR] Failure executing javac, but could not parse the error: [ERROR] [ERROR] [ERROR] The system is out of resources. [ERROR] Consult the following stack trace for details. [ERROR] java.lang.StackOverflowError
export MAVEN_OPTS="-Xms1024m -Xmx2048m -Xss2048k"
Running ios test
[INST STDERR] aborting launch
你的应用没有正确编译在模拟器或真机上。
Running mobile safari test
error: Could not prepare mobile safari with version '7.1'
你可能需要在此运行授权脚本以保证使iOS SDK文件为可写状态。 E.g., sudo authorize_ios
第四章:appium运行
4.1 从源码运行Appium
##从源码运行Appium
你想要从源码运行 Appium 并帮助修复 bug 和添加新的特性么?很好! fork 这个项目,做一点更改,并且发送一个请求吧!
另外,在工作之前请先看下我们的。请在发送请求前,确保单元测试与功能测试都测试通过;
关于如何运行测试的更多信息,请继续阅读!
首先确保你阅读并遵循 README 中的安装说明。
###从源码配置Appium
Appium 的安装,包含在你的测试代码与设备/模拟器之间来回发送消息的 Appium 服务端,和一个用任何存在且兼容Appium的语言编写的测试脚本。
运行一个 Appium 服务器实例,然后进行你的测试。
快速开始的方式:
$ git clone /appium/appium.git
$ cd appium
$ ./reset.sh
$ sudo ./bin/authorize-ios.js # for ios only
Appium 开发环境搭建
确保你安装了 ant,maven,adb 并且将他们加入到了系统环境变量 PATH 中,与此同时你还需要安装 android-16 sdk(Selendroid) 和android-19 sdk。
从你本地仓库的命令行提示,使用下边的命令安装如下包(如果你没有使用homebrew包管理器安装 node,则你可能不得不使用 sudo 权限运行npm):
npm install -g mocha
npm install -g grunt-cli
node bin/appium-doctor.js --dev
./reset.sh --dev
前两个命令安装测试和构建工具(如果你已经通过 Homebrew 包管理器安装了 node.js 就不需要 sudo 了)。
第三个命令验证所有的依赖关系是否设置正确(由于依赖关系构建 Appium 不同于简单的运行 Appium ),
第四个命令安装所有程序依赖关系和构建支持二进制文件和测试应用程序。
reset.sh 也是建议先从 master 上 pull 下改变后的内容再执行命令。
运行 reset.sh 加上 --dev 标志同时安装 git hooks 以确保代码质量在提交时是被保存过的。
此时,你可以启动 Appium 服务:
查看完整的服务文档参数列表
想要实现任务自动化,请检出来构建应用程序,安装程序,生成文档,等等。
搭建iOS运行环境
为了避免启动 iOS apps 时弹出安全警告,你可以通过以下两种方法修改 /etc/authorization 文件:
手动将 /etc/authorization 文件中 &key&system.privilege.taskport&key/& 下紧跟 &allow-root& 的元素改成 &true/&。
运行以下grunt命令来自动修改 /etc/authorization 文件:
sudo ./bin/authorize-ios.js
然后再运行以下命令:
./reset.sh --ios --dev
现在你的 appium 实例已经准备就绪,运行 node . 来启动 appium server.
搭建android运行环境
Bootstrap 通过运行以下命令来启动 android:
./reset.sh --android --dev
如果你想运行 来支持2.3这样的旧的android平台,运行以下命令:
./reset.sh --selendroid --dev
确保你有且只有一个 Android 模拟器或者真机在运行,举个例子,在其它的设备上运行此命令(假设 emulator 命令已经在你的 path 中了)需执行:
emulator -avd &MyAvdName&
现在你可以通过 node . 启动 Appium server 了。
确保更新到最新版本
由于 Appium 使用一些包的开发版本,所以经常安装新的 npm 包和升级不同的包是很有必要的。以下命令可以将所有平台上的包进行更新( --dev 标志会获取 npm dev 依赖和 Appium 测试套件中用到的应用程序)。当Appium提示版本更新时,你也可以用以下命令来更新:
./reset.sh --dev
或者你可以只更新指定的平台:
./reset.sh --ios --dev
./reset.sh --android --dev
./reset.sh --selendroid --dev
运行测试集
首先,看看我们的文档 ,
然后确保你的环境在对应的平台上已经搭建好了且与你所期望的那样。
当你的环境搭建好了之后并且你的代码是最新的,你可以通过以下的方式来运行单元测试:
grunt unit
你可以在所支持的平台上运行一些功能测试(确保后 Appium 用 node . 在另外一个窗口中运行):
bin/test.sh
或者你可以通过运行 test.sh 来对指定的平台环境进行测试:
bin/test.sh --android
bin/test.sh --ios
bin/test.sh --ios7
bin/test.sh --ios71
在提交代码时,请运行 grunt 执行一些基本的测试和核对代码质量标准的更改,请注意,这可能会自动发生的,
如果你已经运行 reset.sh --dev ,这于你预先提交代码的操作所关联起来的。
grunt lint
& Running "newer:jshint" (newer) task
& Running "newer:jshint:files" (newer) task
& No newer files to process.
& Running "newer:jshint:test" (newer) task
& No newer files to process.
& Running "newer:jshint:examples" (newer) task
& No newer files to process.
& Running "jscs:files" (jscs) task
& && 303 files without code style errors.
运行单独的测试
如果你有一个 Appium 服务监听,你可以通过 Mocha 来运行单独的测试文件,例如:
DEVICE=ios71 mocha -t 60000 -R spec test/functional/ios/testapp/simple.js
或者单独的测试集(例如,测试名称中的单词 "alert" )
DEVICE=ios6 mocha -t 60000 -R spec --grep "alert" test/functional/ios/uicatalog
对于 windows 操作系统,你可以用 set DEVICE=android 在 cmd 命令行的方式中运行以上所有测试集,例如:
set DEVICE=android
mocha -t 60000 -R spec test/functional/android/apidemos/alerts-specs.js
注意:对于安卓系统,你将需要一个屏幕大小为4.0(400x800)的模拟器/设备(emulator/device),有些测试集在不同的屏幕大小下可能会失败。
DEVICE 必须设置为一个有效的值:ios71, ios6, android, selendroid
4.2 appium 开发环境搭建
##从源码运行Appium
你想要从源码运行 Appium 并帮助修复 bug 和添加新的特性么?很好! fork 这个项目,做一点更改,并且发送一个请求吧!
另外,在工作之前请先看下我们的。请在发送请求前,确保单元测试与功能测试都测试通过;
关于如何运行测试的更多信息,请继续阅读!
首先确保你阅读并遵循 README 中的安装说明。
###从源码配置Appium
Appium 的安装,包含在你的测试代码与设备/模拟器之间来回发送消息的 Appium 服务端,和一个用任何存在且兼容Appium的语言编写的测试脚本。
运行一个 Appium 服务器实例,然后进行你的测试。
快速开始的方式:
$ git clone /appium/appium.git
$ cd appium
$ ./reset.sh
$ sudo ./bin/authorize-ios.js # for ios only
Appium 开发环境搭建
确保你安装了 ant,maven,adb 并且将他们加入到了系统环境变量 PATH 中,与此同时你还需要安装 android-16 sdk(Selendroid) 和android-19 sdk。
从你本地仓库的命令行提示,使用下边的命令安装如下包(如果你没有使用homebrew包管理器安装 node,则你可能不得不使用 sudo 权限运行npm):
npm install -g mocha
npm install -g grunt-cli
node bin/appium-doctor.js --dev
./reset.sh --dev
前两个命令安装测试和构建工具(如果你已经通过 Homebrew 包管理器安装了 node.js 就不需要 sudo 了)。
第三个命令验证所有的依赖关系是否设置正确(由于依赖关系构建 Appium 不同于简单的运行 Appium ),
第四个命令安装所有程序依赖关系和构建支持二进制文件和测试应用程序。
reset.sh 也是建议先从 master 上 pull 下改变后的内容再执行命令。
运行 reset.sh 加上 --dev 标志同时安装 git hooks 以确保代码质量在提交时是被保存过的。
此时,你可以启动 Appium 服务:
查看完整的服务文档参数列表
想要实现任务自动化,请检出来构建应用程序,安装程序,生成文档,等等。
搭建iOS运行环境
为了避免启动 iOS apps 时弹出安全警告,你可以通过以下两种方法修改 /etc/authorization 文件:
手动将 /etc/authorization 文件中 &key&system.privilege.taskport&key/& 下紧跟 &allow-root& 的元素改成 &true/&。
运行以下grunt命令来自动修改 /etc/authorization 文件:
sudo ./bin/authorize-ios.js
然后再运行以下命令:
./reset.sh --ios --dev
现在你的 appium 实例已经准备就绪,运行 node . 来启动 appium server.
搭建android运行环境
Bootstrap 通过运行以下命令来启动 android:
./reset.sh --android --dev
如果你想运行 来支持2.3这样的旧的android平台,运行以下命令:
./reset.sh --selendroid --dev
确保你有且只有一个 Android 模拟器或者真机在运行,举个例子,在其它的设备上运行此命令(假设 emulator 命令已经在你的 path 中了)需执行:
emulator -avd &MyAvdName&
现在你可以通过 node . 启动 Appium server 了。
确保更新到最新版本
由于 Appium 使用一些包的开发版本,所以经常安装新的 npm 包和升级不同的包是很有必要的。以下命令可以将所有平台上的包进行更新( --dev 标志会获取 npm dev 依赖和 Appium 测试套件中用到的应用程序)。当Appium提示版本更新时,你也可以用以下命令来更新:
./reset.sh --dev
或者你可以只更新指定的平台:
./reset.sh --ios --dev
./reset.sh --android --dev
./reset.sh --selendroid --dev
运行测试集
首先,看看我们的文档 ,
然后确保你的环境在对应的平台上已经搭建好了且与你所期望的那样。
当你的环境搭建好了之后并且你的代码是最新的,你可以通过以下的方式来运行单元测试:
grunt unit
你可以在所支持的平台上运行一些功能测试(确保后 Appium 用 node . 在另外一个窗口中运行):
bin/test.sh
或者你可以通过运行 test.sh 来对指定的平台环境进行测试:
bin/test.sh --android
bin/test.sh --ios
bin/test.sh --ios7
bin/test.sh --ios71
在提交代码时,请运行 grunt 执行一些基本的测试和核对代码质量标准的更改,请注意,这可能会自动发生的,
如果你已经运行 reset.sh --dev ,这于你预先提交代码的操作所关联起来的。
grunt lint
& Running "newer:jshint" (newer) task
& Running "newer:jshint:files" (newer) task
& No newer files to process.
& Running "newer:jshint:test" (newer) task
& No newer files to process.
& Running "newer:jshint:examples" (newer) task
& No newer files to process.
& Running "jscs:files" (jscs) task
& && 303 files without code style errors.
运行单独的测试
如果你有一个 Appium 服务监听,你可以通过 Mocha 来运行单独的测试文件,例如:
DEVICE=ios71 mocha -t 60000 -R spec test/functional/ios/testapp/simple.js
或者单独的测试集(例如,测试名称中的单词 "alert" )
DEVICE=ios6 mocha -t 60000 -R spec --grep "alert" test/functional/ios/uicatalog
对于 windows 操作系统,你可以用 set DEVICE=android 在 cmd 命令行的方式中运行以上所有测试集,例如:
set DEVICE=android
mocha -t 60000 -R spec test/functional/android/apidemos/alerts-specs.js
注意:对于安卓系统,你将需要一个屏幕大小为4.0(400x800)的模拟器/设备(emulator/device),有些测试集在不同的屏幕大小下可能会失败。
DEVICE 必须设置为一个有效的值:ios71, ios6, android, selendroid
4.3 Appium grunt 命令
Appium grunt 命令
是 Node.js 的 Make! 我们用它来自动化所有的 appium 开发任务。 下面就是你能做的:
grunt lint
运行 JSLint
grunt test
运行所有的测试
grunt functional
运行整个功能测试集
运行 iOS 功能测试集
grunt android
运行 Android 功能测试集
grunt selendroid
运行 selendroid 功能测试集
grunt firefoxos
运行 firefoxos 功能测试集
grunt unit
运行所有的单元测试
grunt getSampleCode
下载示例代码和示例app. 接受:hardcore 参数
grunt buildApp:&AppName&:&SDK&
构建一个用于 iPhone 模拟器的 iOS 应用。
我们预计这个应用的路径是 sample-code/apps/&AppName&/build/Release-iphonesimulator/&AppName&.app. 默认的 SDK 是 'iphonesimulator7.1'
grunt signApp:&certName&
使用开发证书的绝对路径,签名测试应用。
grunt authorize
授权模拟器,使它不需要弹框请求权限。
打印 appium.log (运行测试的时候很有用)
grunt configAndroidBootstrap
配置使用 ant 构建 Android 的 bootstrap.jar
grunt buildAndroidBootstrap
使用 ant 构建 bootstrap.jar
grunt buildSelendroidServer
构建 selendroid 服务器
grunt configAndroidApp:&AppName&
配置使用 ant 构建 android 测试应用。 我们期待有一个
sample-code/apps/&AppName& 的 Android 项目
grunt buildAndroidApp:&AppName&
使用 ant 构建项目. 会在 sample-code/apps/&AppName& 下生成应用。
grunt installAndroidApp:&AppName&
将安卓应用安装到模拟器和设备中去
grunt docs
grunt generateAppiumIo
将 README.md 转成 appium.io 的 getting-started.html
grunt setConfigVer:&device&
将 package.json 里面 appium 的版本号和对应设备写入 .appiumconfig.json 文件
grunt buildApp 默认使用 iPhone 6.1 模拟器的 SDK 来构建应用。你可以传其他的 SDK 给 grunt 命令。
(用 xcodebuild -showsdks 找出你所有的 sdk):
grunt buildApp:UICatalog:iphonesimulator6.0
4.4 如何去写文档
如何去写文档
## 被用于写第二级标题。每个文档必须以第二级标题开头。
这是为了支持appium.io文档的生成,不要使用下划线---的方式来创建标题。
不要使用第一级标题或者 === 底线方式来创建标题(其中文件夹名字被用于第一级标题)
### 用于小标题。
#### 用于不会出现在目录中的标题。
不要使用第五级标题 #####, 或者第六级标题 ######。
不要使用分隔线例如 -- 或者 ---。 这会使 Slate 混乱。
链接到 readme:
[readme](../../README.md)
链接到 contributing:
[contributing](../../CONTRIBUTING.md)
链接到其他文档:
[link text](filename.md)
链接到文档的内部, 使用 # 来标记 Slate 链接。
[go direct to json](filename.md#json-wire-protocol-server-extensions)
需要注意的是当标题改变时,哈希链接会损坏。所以链接到文档的开头是最好的( other.md 替换 other.md#something )。
appium.io兼容性在appium.io中心对齐代码
Appium.io中文档使用
来作为文档标准
如果在文件中的代码段不是特定语言或如果你想要代码片段保持与文本中心对齐在 appium.io 文档中,请把代码块放在中心位置
代码片段放在这里
发布文档请在appium.io中查看
4.5 代码风格指南
贡献者的代码风格指南
感谢你们对 Appium 的贡献! 这些是我们书写 javascript 代码时使用的基本原则。
请遵守这些,避免风格的来回修改,以便我们可以合并你的 pull 请求。
基本原则就是:让你的代码看起来和周围的代码一致。
衍合(Rebasing)
每个 pull 请求中的提交(commits)必须包括 。
如果有多个作者,确认每个作者有自己的提交。最好不要修改作者信息。
合并(merge)提交必须从 pull 请求中 rebase 。
检错(Linting)
所有的代码 (除了 bootstrap.js 的代码,它使用了 Apple 的私有方法) 必须通过 JSLint。
为了检查你的代码,你可以在 Appium 存储目录下,简单地运行 grunt lint。
如果你已创建一个新的 .js 文件,请确认它在 grunt.js 中被通配符覆盖,或者被专门添加。
边输入边检错你的代码是容易实现的,使得整个进程更加顺利。
我们喜欢 , 因为它有与许多源代码编辑器的集成。
文件 .jshintrc 加入到仓库中,它的内容是:
"laxcomma": true,
"strict": true,
"undef": true,
"unused": true,
"trailing": true,
"node": true,
"es5": true,
"white": true,
"indent": 2
因为jshint不再执行代码风格,我们也使用 ,它其中也存在许多源代码编辑器的集成。配置文件是:
"excludeFiles": ["submodules/**", "node_modules/**",
"./lib/server/static/**", "./lib/devices/firefoxos/atoms/*.js",
"./test/harmony/**/*.js", "./sample-code/examples/node/**/*-yiewd.js",
"./sample-code/apps/**", "./sample-code/examples/php/vendor/**"],
"requireCurlyBraces": ["for", "while", "do", "try", "catch"],
"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch",
"return", "try", "catch", "function"],
"disallowMixedSpacesAndTabs": true,
"disallowTrailingWhitespace": true,
"requireSpacesInFunctionExpression": {
"beforeOpeningCurlyBrace": true
你将在你喜欢的编辑器中看到这些在配置文件中定义的警告类型,查看 和
,编辑器和平台列表,找到使你的编辑器自动化检错的设置方法。
风格注意点
使用两个空格来缩进, 不要使用 tabs
在运算符两边,分别添加一个空格:
var x = 1;
在 lists, objects, function calls 等中,逗号和冒号后面需要添加一个空格:
var x = myFunc("lol", {foo: bar, baz: boo});
var x = myFunc("lol",{foo:bar,baz:boo});
代码语句一般以分号结尾
以逗号开头:
foo: 'bar'
, baz: 'boo'
, wuz: 'foz'
左花括号应该和 function, if 等 写在同一行, else 被夹在两个花括号中间:
if (foo === bar) {
// do something
// do something else
if, for, 和 function 之后需要添加空格:
if (foo === bar) {
for (var i = 0; i & 10; i ++) {
var lol = function (foo) {
if(foo === bar) {
for(var i = 0; i & 10; i ++) {
var lol = function(foo) {
只有一行代码时,花括号也应该添加上:
if (foo === bar) {
if (foo === bar)
一般情况下,使用 ===, 而不是 ==; 使用 !==, 而不是 !=
单行长度不应超过79个字符
截断长字符串,方法如下:
myFunc("This is a really long string that's longer " +
"than 79 characters so I broke it up, woo");
注释需要和上一行代码左对齐:
if (foo === 5) {
myFunc(foo);
if (foo === 5) {
myFunc(foo);
除了出错后直接调用回调函数(callback)处理错误(error)的语句
if (err) return cb(err);
通过拓展原型,来创建子类:
var _ = require('underscore');
var SuperClass = function () {
this.init();
SuperClass.prototype.init = function () {
// initialize
// Create a subclass
var SubClass = function () {
this.init();
_.extend(SubClass.prototype, SuperClass.prototype);
函数定义中,最后使用回调函数:
var foo = function (arg1, arg2, cb) {
使用变量来定义函数:
var myFunc = function (a, b, c) {};
function myFunc (a, b, c) {}
变量名应该是驼峰式大小写风格:
var myVariable = 42;
var my_variable = 42;
检查是否有未定义的变量:
typeof myVariable === "undefined"
myVariable === undefined
试验风格:
在代码语义通顺和长度许可下,可以保持在同一行:
driver.elementByTagName('el1').should.become("123")
.nodeify(done);
.elementsByTagName('el1').should.eventually.have.length(0)
.nodeify(done);
或者使用缩进来提高代码的可读性:
.elementById('comments')
.keys("hello world")
.getValue()
.should.become("hello world")
.elementById('comments')
.getValue().should.become("hello world")
.nodeify(done);
.execute("'nan'--")
.should.be.rejectedWith("status: 13")
.nodeify(done);
第五章:appium使用
5.1 Appium 客户端库
Appium 客户端库
Appium 有对应以下语言的客户端库:
请注意:有些方法,比如 endTestCoverage() 目前不能提供完整支持。
只有修复, 完整的覆盖率支持才会被添加。
如果你一定要用这些方法,请先查看 Github 上关于 bindings 的文档。
driver.lock(5)
driver.lockScreen(3);
// javascript
driver.lock(3)
$this-&lock(3);
driver.LockDevice(3);
// objective c
[driver lockDeviceScreen:3];
将 app 置于后台
把当前应用放到后台去
background_app 5
driver.background_app(5)
driver.runAppInBackground(5);
// javascript
driver.backgroundApp(5)
$this-&backgroundApp(5);
driver.BackgroundApp(5);
// objective c
[driver runAppInBackground:3];
hide_keyboard
driver.hide_keyboard()
driver.hideKeyboard();
// javascript
driver.hideKeyboard()
$this-&hideKeyboard();
$this-&hideKeyboard(array('strategy' =& 'pressKey', 'key' =& 'Done'));
driver.HideKeyboard("Done");
// objective c
[driver hideKeyboard];
启动 Activity
在当前应用中打开一个 activity 或者启动一个新应用并打开一个 activity 。 只能在 Android 上使用
driver.startActivity("appPackage","com.example.android.apis", null, null);
// javascript
driver.startActivity({appPackage: 'com.example.android.apis', appActivity: '.Foo'}, cb);
driver.start_activity('com.example.android.apis', '.Foo')
start_activity app_package: 'io.appium.android.apis', app_activity: '.accessibility.AccessibilityNodeProviderActivity'
driver.StartActivity("com.example.android.apis", ".Foo");
$this-&startActivity(array("appPackage" =& "com.example.android.apis",
"appActivity" =& ".Foo"));
// objective c
[driver startActivity:@"com.example.android.apis" package:@".Foo"];
打开通知栏 (Notifications)
打开下拉通知栏 只能在 Android 上使用
driver.openNotifications();
// javascript
driver.openNotifications(cb);
driver.open_notifications()
openNotifications
driver.OpenNotifications();
$this-&openNotifications();
// objective c
[driver openNotifications];
是否已经安装
检查应用是否已经安装
is_installed? "com.example.android.apis"
driver.is_app_installed('com.example.android.apis')
driver.isAppInstalled("com.example.android.apis")
// javascript
driver.isAppInstalled("com.example.android.apis")
.then(function (isAppInstalled) { /*...*/ })
$this-&isAppInstalled('com.example.android.apis');
driver.IsAppInstalled("com.example.android.apis-");
// objective c
[driver isAppInstalled:@"com.example.android.apis-"];
安装应用到设备中去
install 'path/to/my.apk'
driver.install_app('path/to/my.apk')
driver.installApp("path/to/my.apk")
// javascript
driver.installApp("path/to/my.apk")
$this-&installApp('path/to/my.apk');
driver.InstallApp("path/to/my.apk");
// objective c
[driver installAppAtPath:@"path/to/my.apk"];
从设备中删除一个应用
remove 'com.example.android.apis'
driver.remove_app('com.example.android.apis')
driver.removeApp("com.example.android.apis")
// javascript
driver.removeApp("com.example.android.apis")
$this-&removeApp('com.example.android.apis');
driver.RemoveApp("com.example.android.apis");
// objective c
[driver removeApp:@"com.example.android.apis"];
摇晃 (Shake)
模拟设备摇晃
driver.shake()
driver.shake()
// javascript
driver.shake()
$this-&shake();
driver.ShakeDevice();
// objective c
[driver shakeDevice];
driver.close_app();
driver.closeApp()
// javascript
driver.closeApp()
$this-&closeApp();
driver.CloseApp();
// objective c
[driver closeApp];
启动 (Launch)
根据服务关键字 (desired capabilities) 启动会话 (session) 。请注意这必须在设定 autoLaunch=false 关键字时才能生效。这不是用于启动指定的 app/activities ————你可以使用 start_activity 做到这个效果————这是用来继续进行使用了 autoLaunch=false 关键字时的初始化 (Launch) 流程的。
driver.launch_app()
driver.launchApp()
// javascript
driver.launchApp()
$this-&launchApp();
driver.LaunchApp();
// objective c
[driver launchApp];
重置 (Reset)
(翻译者注:相当于卸载重装应用)
driver.reset()
driver.resetApp()
// javascript
driver.resetApp()
$this-&reset();
driver.ResetApp();
// objective c
[driver resetApp];
可用上下文 (context)
列出所有的可用上下文
翻译备注:context可以理解为 可进入的窗口 。例如,对于原生应用,可用的context和默认context均为NATIVE_APP。详情可查看
context_array = available_contexts
driver.contexts
driver.getContextHandles()
// javascript
driver.contexts().then(function (contexts) { /*...*/ })
$this-&contexts();
driver.GetContexts()
// objective c
NSArray *contexts = driver.allC
当前上下文 (context)
列出当前上下文
context = current_context
driver.current_context
driver.getContext()
// javascript
driver.currentContext().then(function (context) { /*...*/ })
$this-&context();
driver.GetContext()
// objective c
NSString *context = driver.
切换到默认的上下文 (context)
将上下文切换到默认上下文
switch_to_default_context
driver.switch_to.context(None)
driver.context();
// javascript
driver.context()
$this-&context(NULL);
driver.SetContext();
// objective c
[driver setContext:nil];
应用的字符串 (App Strings)
获取应用的字符串
strings = app_strings
driver.app_strings
driver.getAppStrings();
// javascript
driver.getAppStrings().then(function (appStrings) { /*...*/ })
$this-&appStrings();
$this-&appStrings('ru');
driver.GetAppStrings();
// objective c
[driver appStrings];
[driver appStringsForLanguage:"@ru"];
按键事件 (Key Event)
给设备发送一个按键事件
key_event 176
driver.keyevent(176)
driver.sendKeyEvent(AndroidKeyCode.HOME);
// javascript
driver.deviceKeyEvent(wd.SPECIAL_KEYS.Home)
$this-&keyEvent('176');
driver.KeyEvent("176");
// objective c
[driver triggerKeyEvent:176 metastate:0 error:&err];
当前 Activity
获取当前 activity。只能在 Android 上使用
current_activity
driver.current_activity
driver.currentActivity();
// javascript
driver.getCurrentActivity().then(function (activity) { /*...*/ })
$this-&currentActivity();
driver.GetCurrentActivity();
// objective c
[driver currentActivity];
触摸动作(TouchAction) / 多点触摸动作(MultiTouchAction)
生成触摸动作的接口。这部分文档很快将会补充更多的内容进来。
touch_action = Appium::TouchAction.new
= find_element :name, 'Buttons, Various uses of UIButton'
touch_action.press(element: element, x: 10, y: 10).perform
action = TouchAction(driver)
action.press(element=el, x=10, y=10).release().perform()
TouchAction action = new TouchAction(driver)
.press(mapview, 10, 10)
.release().
perform();
// javascript
var action = new wd.TouchAction(driver);
.tap({el: el, x: 10, y: 10})
.release();
return action.perform(); // returns a promise
$action = $this-&initiateTouchAction();
-&press(array('element' =& $el))
-&release()
-&perform();
$action1 = $this-&initiateTouchAction();
$action1-&press(array('element' =& $els[0]))
-&moveTo(array('x' =& 10, 'y' =& 0))
-&moveTo(array('x' =& 10, 'y' =& -75))
-&moveTo(array('x' =& 10, 'y' =& -600))
-&release();
$action2 = $this-&initiateTouchAction();
$action2-&press(array('element' =& $els[1]))
-&moveTo(array('x' =& 10, 'y' =& 10))
-&moveTo(array('x' =& 10, 'y' =& -300))
-&moveTo(array('x' =& 10, 'y' =& -600))
-&release();
$multiAction = $this-&initiateMultiAction();
$multiAction-&add($action1);
$multiAction-&add($action2);
$multiAction-&perform();
ITouchAction action = new TouchAction(driver);
action.Press(el, 10, 10).Release();
action.Perform ();
滑动(Swipe)
模拟用户滑动
swipe start_x: 75, start_y: 500, end_x: 75, end_y: 0, duration: 0.8
driver.swipe(start=75, starty=500, endx=75, endy=0, duration=800)
driver.swipe(75, 500, 75, 0, 0.8)
// javascript
function swipe(opts) {
var action = new wd.TouchAction(this);
.press({x: opts.startX, y: opts.startY})
.wait(opts.duration)
.moveTo({x: opts.endX, y: opts.endY})
.release();
return action.perform();
wd.addPromiseChainMethod('swipe', swipe);
return driver.swipe({ startX: 75, startY: 500,
endY: 0, duration: 800 });
$this-&swipe(75, 500, 75, 0, 800);
捏 (Pinch)
捏屏幕 (双指往内移动来缩小屏幕)
driver.pinch(element=el)
driver.pinch(element);
// javascript
function pinch(el) {
return Q.all([
el.getSize(),
el.getLocation(),
]).then(function(res) {
var size = res[0];
var loc = res[1];
var center = {
x: loc.x + size.width / 2,
y: loc.y + size.height / 2
var a1 = new wd.TouchAction(this);
a1.press({el: el, x: center.x, y:center.y - 100}).moveTo({el: el}).release();
var a2 = new wd.TouchAction(this);
a2.press({el: el, x: center.x, y: center.y + 100}).moveTo({el: el}).release();
var m = new wd.MultiAction(this);
m.add(a1, a2);
return m.perform();
}.bind(this));
wd.addPromiseChainMethod('pinch', pinch);
wd.addElementPromiseChainMethod('pinch', function() {
return this.browser.pinch(this);
return driver.pinch(el);
return el.pinch();
$this-&pinch($el);
driver.Pinch(25, 25)
放大 (Zoom)
放大屏幕 (双指往外移动来放大屏幕)
driver.zoom(element=el)
driver.zoom(element);
// javascript
function zoom(el) {
return Q.all([
this.getWindowSize(),
this.getLocation(el),
]).then(function(res) {
var size = res[0];
var loc = res[1];
var center = {
x: loc.x + size.width / 2,
y: loc.y + size.height / 2
var a1 = new wd.TouchAction(this);
a1.press({el: el}).moveTo({el: el, x: center.x, y: center.y - 100}).release();
var a2 = new wd.TouchAction(this);
a2.press({el: el}).moveTo({el: el, x: center.x, y: center.y + 100}).release();
var m = new wd.MultiAction(this);
m.add(a1, a2);
return m.perform();
}.bind(this));
wd.addPromiseChainMethod('zoom', zoom);
wd.addElementPromiseChainMethod('zoom', function() {
return this.browser.zoom(this);
return driver.zoom(el);
return el.zoom();
$this-&zoom($el);
driver.Zoom(100, 200);
滑动到 (Scroll To)
滑动到某个元素。
element = find_element :name, 'Element Name'
execute_script "mobile: scrollTo", :element =& element.ref
todo: python
WebElement element = driver.findElement(By.name("Element Name"));
HashMap&String, String& arguments = new HashMap&String, String&();
arguments.put("element", element.getId());
(JavascriptExecutor)driver.executeScript("mobile: scrollTo", arguments);
// javascript
return driver.elementByName().then(function (el) {
return driver.execute('mobile: scrollTo', {element: el.value});
$els = $this-&elements($this-&using('class name')-&value('android.widget.TextView'));
$this-&scroll($els[count($els) - 1], $els[0]);
todo: csharp
拉出文件 (Pull File)
从设备中拉出文件
pull_file 'Library/AddressBook/AddressBook.sqlitedb'
driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')
driver.pullFile("Library/AddressBook/AddressBook.sqlitedb");
// javascript
driver.pullFile("Library/AddressBook/AddressBook.sqlitedb")
.then(function (base64File) { /*...*/ })
$this-&pullFile('Library/AddressBook/AddressBook.sqlitedb');
driver.PullFile("Library/AddressBook/AddressBook.sqlitedb");
推送文件(Push file)
推送文件到设备中去
data = "some data for the file"
path = "/data/local/tmp/file.txt"
push_file path, data
data = "some data for the file"
path = "/data/local/tmp/file.txt"
driver.push_file(path, data.encode('base64'))
byte[] data = Base64.encodeBase64("some data for the file".getBytes());
String path = "/data/local/tmp/file.txt";
driver.pushFile(path, data)
// javascript
driver.pushFile(path, data)
$path = 'data/local/tmp/test_push_file.txt';
$data = 'This is the contents of the file to push to the device.';
$this-&pushFile($path, base64_encode($data));
driver.PushFile("/data/local/tmp/file.txt", "some data for the file");
从这里你可以获取/设置 appium 的服务器设置。
想知道它如何工作,以及它支持哪些设置,请查看
current_settings = get_settings
update_settings someSetting: true
current_settings = driver.get_settings()
driver.update_settings({"someSetting": true})
JsonObject settings = driver.getSettings()
// java-client doesn't support setting arbitrary settings, just settings which are already provided by appium.
// So for the 'ignoreUnimportantViews' setting, the following method exists:
driver.ignoreUnimportantViews(true);
var settings = driver.settings();
browser.updateSettings({'someSetting': true});
$settings = $this-&getSettings();
$this-&updateSettings(array('cyberdelia' =& "open"));
Dictionary&String, Object&settings = driver.GetSettings();
// dotnet-driver doesn't support setting arbitrary settings, just settings which are already provided by appium.
// So for the 'ignoreUnimportantViews' setting, the following method exists:
driver.IgnoreUnimportantViews(true);
Appium 桌面应用
Appium 的桌面应用支持 OS X 和 Windows.
5.2 Appium 服务关键字
Appium 服务关键字
automationName
你想使用的自动化测试引擎
Appium (默认) 或 Selendroid
platformName
你要测试的手机操作系统
iOS, Android, 或 FirefoxOS
platformVersion
手机操作系统版本
例如: 7.1, 4.4
deviceName
使用的手机类型或模拟器类型
iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, 等。在 iOS 上,这个关键字的值必须是使用 instruments -s devices 得到的可使用的设备名称之一。在 Android 上,这个关键字目前不起作用。
.ipa or .apk文件所在的本地绝对路径或者远程路径,也可以是一个包括两者

我要回帖

更多关于 小米怎么设置铃声 的文章

 

随机推荐