diff --git a/docs/cn/README.md b/docs/cn/README.md
index 1313e4f5a..09b85d123 100644
--- a/docs/cn/README.md
+++ b/docs/cn/README.md
@@ -1,140 +1 @@
-## Appium
-
-[](https://npmjs.org/package/appium)
-[](https://david-dm.org/appium/appium)
-[](https://david-dm.org/appium/appium#info=devDependencies)
-
-[](https://team-appium.ci.cloudbees.com/job/appium-master/)
-
-Appium 是一个开源的,跨平台的自动化测试工具。
-它支持模拟器(iOS,FirefoxOS,Android)和真机(iOS, Android, FirefoxOS)上的原生应用,混合应用和移动 web 应用。
-
-**Note:** 我们最近发布了Appium 1.0。如果已有 Appium 测试脚本,你可以参考这个文件[迁移到 1.0](advanced-concepts/migrating-to-1-0.cn.md)!
-
-### 支持平台
-
-* iOS
-* Android
-* FirefoxOS
-
-### 详细请参见[文档网站](http://appium.io/documentation.html?lang=zh)
-
-### 为什么选择appium ?
-
-1. 因为 Appium 在所有平台上都使用了标准的自动化接口,
-所以你不需要以重新编译或者修改你的 app。
-2. 你可以用你喜欢的开发工具,使用任何 [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) 兼容的语言来编写测试用例。比如
-Java, [Objective-C](https://github.com/appium/selenium-objective-c),
- JavaScript with Node.js (in both [callback](https://github.com/admc/wd) and [yield-based](https://github.com/jlipps/yiewd) flavours),
- PHP, Python, [Ruby](https://github.com/appium/ruby_lib), C#, Clojure, 或者 Perl。
- 可以使用标准的Selenium WebDriver API和特定语言的客户端库。
-3. 你可以使用任何测试框架。
-
-投资 [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) 意味着你可以押宝在一个已经成为标准的独立,自由和开放的协议。你不会被任何专利限制。
-
-
-如果没有 Appium,你就只能用 Javascript 来写 Apple 的 UIAutomation 脚本,并且只能通过Instruments 应用来运行你的测试。同样的,在 Google 的UiAutomator体系下,你只能用 Java 写你的测试案例。Appium 最终开启了跨平台原生移动自动化的可能。
-
-### 我还是不太明白……
-
-如果你第一次接触 Appium 或者想要一个完整的描述,请通读我们的 [Introduction to Appium Concepts](about-appium/intro.cn.md)。
-
-
-### 依赖
-
-为了运行测试,针对不同的移动平台,你需要配置下环境,下面列出相关的依赖平台的需求。
-
-如果你想通过 `npm install` 安装的 appium 来运行 Appium 或者研究 Appium 或者为 Appium 贡献力量。你需要安装 [node.js 和 npm](http://nodejs.org) 0.10 或者更高版本 (使用 [n](https://github.com/visionmedia/n)或者`brew install node`来安装 Nodejs,确保安装过程中,你没有使用任何 sudo,否则你会遇到很多问题)。我们推荐最新的稳定版本。
-
-你可以使用 `appium-doctor` 来验证 Appium 的所有依赖。运行 `appium-doctor`,然后提供 `--ios` 或者 `--android` 参数来验证两个平台的依赖是否配置正确。如果从源代码运行,你可以使用 `bin/appium-doctor.js` 或者 `node bin/appium-doctor.js`
-
-#### iOS 需求
-
-* Mac OS X 10.7 或者更高,推荐 10.9.2
-* XCode >= 4.6.3,推荐 5.1.1
-* Apple Developer Tools (iPhone simulator SDK, command line tools)
-* [确保你已经读了我们写的如何配置 iOS 测试环境的文档](appium-setup/running-on-osx.cn.md)
-
-
-#### Android 需求
-
-* [Android SDK](http://developer.android.com) API >= 17 (额外的特性需要 18/19)
-* Appium 支持OS X,Linux,Windows 上的 Android,确保你是按照如下文档的指示来配置不同的测试环境的。
- * [linux](appium-setup/running-on-linux.cn.md)
- * [osx](appium-setup/running-on-osx.cn.md)
- * [windows](appium-setup/running-on-windows.cn.md)
-
-#### FirefoxOS 需求
-
-* [Firefox OS Simulator](https://developer.mozilla.org/en/docs/Tools/Firefox_OS_Simulator)
-
-### 快速开始
-启动 Appium server,并运行用你喜欢的 [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) 兼容的语言编写的测试用例。
-你可以用 node.js 或者下面的应用程序来运行 Appium
-
-#### 使用 Node.js
-
-```center
- $ npm install -g appium
- $ appium &
-```
-
-#### 使用 app
-
-* [下载 Appium app](https://github.com/appium/appium/releases)
-* 运行它!
-
-### 为Appium编写测试
-
-如何开始写测试用例,运行测试用例,可以看[the running tests](writing-running-appium/running-tests.cn.md),这个文档描述了iOS,Android 和老版本的 Android 机器的情况。如果你想在实体机上运行测试的话,
-你可能会对[真机指南](appium-setup/real-devices.cn.md)感兴趣。
-
-我们支持 [Selenium WebDriver JSON Wire Protocol](https://github.com/appium/appium/wiki/JSON-Wire-Protocol:-Supported-Methods) 的一个子集,而且在此之上扩展了移动平台相关的特性。所以你可以
-指定特定移动平台[desired capabilities](writing-running-appium/caps.cn.md) 来运行你的测试。
-
-你可以通过 [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) 元素定位策略的子集来定位元素。更多信息请参考 [finding elements](writing-running-appium/finding-elements.cn.md)
-为了支持移动手势[automating mobile gestures](writing-running-appium/touch-actions.cn.md),比如
- tap,flick 和 swipe,我们扩展了JSON Wire Protocolor。
-
-你也可以对混合应用中的webview进行自动化 [hybrid app guide](advanced-concepts/hybrid.cn.md)
-
-该代码库有 [很多不同语言的测试例子](https://github.com/appium/sample-code)!
-
-### 工作原理
-
-Appium 可以驱动多种原生自动化框架,同时也提供基于 Selenium 的 [WebDriver JSON wire protocol](https://w3c.github.io/webdriver/webdriver-spec.html) api。
-
-基于[Dan Cuellar's](http://github.com/penguinho) 在 iOS 自动化上的成果,Appium 通过驱动 Apple 的 UIAutomation 库来提供 iOS 支持。
-
-而在新版本的 Android 上,我们使用 Uiautomator 框架,老版本的 Android,则使用了
-[Selendroid](http://github.com/DominikDary/selendroid)
-
-FirefoxOS 的支持依赖一个基于 Gecko 平台并且兼容 WebDriver 的自动化驱动[Marionette](https://developer.mozilla.org/en-US/docs/Marionette)。
-
-
-### 如何贡献代码
-可以看下我们的文档 [contribution documentation](../../CONTRIBUTING.md)
-以了解如何从源代码中进行编译,测试和运行
-
-
-## 其他项目的授权和灵感来源
-
-[Credits](contributing-to-appium/credits.cn.md)
-
-### 邮件列表
-
-声明和公告经常放到讨论组 [Discussion Group](https://groups.google.com/d/forum/appium-discuss), 需要注册
-
-### 问题定位
-
-我们增加了一个 [问题定位指南](appium-setup/troubleshooting.cn.md)。
-如果你遇到一些问题,请看下这个问的那个。它包含了一些常见的错误说明,以及在无法解决的情况如何和社区联系。
-
-
-### 使用Robots扩展
-可以使用 appium 的一些 robots 扩展。或者其他的 robots。想了解更多可以看看 [Appium Robots](https://github.com/appium/robots)
-
-
-### 翻译工作
-文档翻译工作由[testerhome](http://testerhome.com)在推动, 我们会不断补充更多的文档和测试用例.
-欢迎对 Appium 感兴趣的同学加入我们, 为开源社区贡献中国人的力量.
+The latest doc in Chinese, maintained by [TesterHome Appium 中文文档小组](https://testerhome.com/appium-doc-cn).
diff --git a/docs/cn/about-appium/appium-clients.cn.md b/docs/cn/about-appium/appium-clients.cn.md
deleted file mode 100644
index 023caf0d6..000000000
--- a/docs/cn/about-appium/appium-clients.cn.md
+++ /dev/null
@@ -1,19 +0,0 @@
-## 客户端类库列表及Appium服务端支持
-
-这些类库封装了标准Selenium客户端类库,为用户提供所有常见的[JSON](https://w3c.github.io/webdriver/webdriver-spec.html) 格式selenium命令以及额外的移动设备控制相关的命令,如多点**触控手势**和**屏幕朝向**。
-
-Appium客户端类库实现了[Mobile JSON Wire Protocol](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)(一个标准协议的官方扩展草稿)和[W3C Webdriver spec](https://dvcs.w3.org/hg/webdriver/raw-file/default/webdriver-spec.html)(一个传输不可预知的自动化协议,该协议定义了MultiAction 接口)的元素。
-
-Appium 服务端定义了官方协议的扩展,为Appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载app。这就是为什么我们需要Appium 特定的客户端,而不是通用的Selenium 客户端。当然,Appium 客户端类库只是增加了一些功能,而实际上这些功能就是简单的扩展了Selenium 客户端,所以他们仍然可以用来运行通用的selenium会话。
-
-
-语言/框架 | Github版本库以及安装指南 |
------ | ----- |
-Ruby | [https://github.com/appium/ruby_lib](https://github.com/appium/ruby_lib)
-Python | [https://github.com/appium/python-client](https://github.com/appium/python-client)
-Java | [https://github.com/appium/java-client](https://github.com/appium/java-client)
-JavaScript (Node.js) | [https://github.com/admc/wd](https://github.com/admc/wd)
-Objective C | [https://github.com/appium/selenium-objective-c](https://github.com/appium/selenium-objective-c)
-PHP | [https://github.com/appium/php-client](https://github.com/appium/php-client)
-C# (.NET) | [https://github.com/appium/appium-dotnet-driver](https://github.com/appium/appium-dotnet-driver)
-RobotFramework | [https://github.com/jollychang/robotframework-appiumlibrary](https://github.com/jollychang/robotframework-appiumlibrary)
diff --git a/docs/cn/about-appium/appium-clients.md b/docs/cn/about-appium/appium-clients.md
new file mode 100644
index 000000000..dcc570ee0
--- /dev/null
+++ b/docs/cn/about-appium/appium-clients.md
@@ -0,0 +1,22 @@
+## 支持 Appium 服务器的客户端程序库列表
+
+这些库封装了标准的 Selenium 客户端,提供了所有 [JSON Wire protocol](https://w3c.github.io/webdriver/webdriver-spec.html) 指定的常规 selenium 命令,额外添加操控移动设备相关的命令,例如 **多点触控手势** 和 **屏幕方向**。
+
+Appium 客户端程序库实现了 [Mobile JSON Wire Protocol](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)(一个基于标准官方协议的扩展草案)和 [W3C Webdriver 规格](https://dvcs.w3.org/hg/webdriver/raw-file/default/webdriver-spec.html)(一个无关传输的自动化规格;定义 MultiAction API 的地方)中的元素。
+
+Appium 服务端自定义了基于官方协议的扩展,帮助 Appium 用户使用各种设备操作(例如在测试会话过程中安装/卸载应用)。这就是为什么我们需要 Appium 特定的客户端,而不只是“原味”的 Selenium 客户端。当然,Appium 客户端程序库只增加功能(其实它们只是扩展了标准 Selenium 客户端),所以它们仍然适用于常规的 Selenium 会话。
+
+语言/框架 | Github 仓库和安装指南 |
+----- | ----- |
+Ruby | [https://github.com/appium/ruby_lib](https://github.com/appium/ruby_lib)
+Python | [https://github.com/appium/python-client](https://github.com/appium/python-client)
+Java | [https://github.com/appium/java-client](https://github.com/appium/java-client)
+JavaScript (Node.js) | [https://github.com/admc/wd](https://github.com/admc/wd)
+Objective C | [https://github.com/appium/selenium-objective-c](https://github.com/appium/selenium-objective-c)
+PHP | [https://github.com/appium/php-client](https://github.com/appium/php-client)
+C# (.NET) | [https://github.com/appium/appium-dotnet-driver](https://github.com/appium/appium-dotnet-driver)
+RobotFramework | [https://github.com/jollychang/robotframework-appiumlibrary](https://github.com/jollychang/robotframework-appiumlibrary)
+
+由 @黑水 翻译,TesterHome 社区 id:sanlengjingvv
+
+@lihuazhang 校验
\ No newline at end of file
diff --git a/docs/cn/about-appium/intro.cn.md b/docs/cn/about-appium/intro.cn.md
deleted file mode 100644
index 47142d224..000000000
--- a/docs/cn/about-appium/intro.cn.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# Appium 介绍
-
-Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用。
-
-所谓的“移动原生应用”是指那些用 iOS 或者 Android SDK 写的应用。所谓的“移动 web 应用”是指使用移动浏览器访问的应用(Appium 支持 iOS 上的 Safari 和 Android 上的 Chrome)。所谓的“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。比如,像 [Phonegap](http://phonegap.com/),可以帮助开发者使用网页技术开发应用,然后用原生代码封装,这些就是混合应用。
-
-重要的是,Appium 是一个跨平台的工具:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了 iOS 和 Android 测试套件间代码的复用性。
-
-想知道 Appium 如何支持平台,版本和自动化形态的详细信息,请参见[platform support doc](/docs/cn/appium-setup/platform-support.cn.md)。
-
-## Appium 的理念
-
-为了满足移动自动化需求,Appium 遵循着一种哲学,重点体现于以下4个需求:
-
-1. 你无需为了自动化,而重新编译或者修改你的应用。
-2. 你不必局限于某种语言或者框架来写和运行测试脚本。
-3. 一个移动自动化的框架不应该在接口上重复造轮子。(移动自动化的接口应该统一)
-4. 无论是精神上,还是名义上,都必须开源。
-
-## Appium 设计
-
-那么 Appium 架构是如何实现这个哲学呢?为了满足第一条,Appium 真正的工作引擎其实是第三方自动化框架。这样,我们就不需在你的应用里植入 Appium 相关或者第三方的代码。这意味着你测试使用的应用与最终发布的应用并无二致。我们使用以下的第三方框架:
-
-* iOS: 苹果的 [UIAutomation](https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef)
-* Android 4.2+: Google's [UiAutomator](http://developer.android.com/tools/help/uiautomator/index.html)
-* Android 2.3+: Google's [Instrumentation](http://developer.android.com/reference/android/app/Instrumentation.html). (Instrumentation由单独的项目[Selendroid](http://selendroid.io)提供支持 )
-
-为了满足第二点,我们把这些第三方框架封装成一套 API,[WebDriver](http://docs.seleniumhq.org/projects/webdriver/) API.WebDriver(也就是 "Selenium WebDriver") 指定了客户端到服务端的协议。
-(参见 [JSON Wire Protocol](https://w3c.github.io/webdriver/webdriver-spec.html))。使用这种客户端-服务端的架构,我们可以使用任何语言来编写客户端,向服务端发送恰当的 HTTP 请求。
-目前已经实现了大多数流行语言版本的客户端,这意味着你可以使用任何测试套件或者测试框架。客户端库就是简单的HTTP 客户,可以以任何你喜欢的方式潜入你的代码。换句话说,Appium 和 WebDriver 客户端不是技术意义上的“测试框架”,而是“自动化库”。你可以在你的测试环境中随意使用这些自动化库!
-
-事实上 WebDriver 已经成为 web 浏览器自动化的标准,也成了 W3C 的标准 —— [W3C Working Draft](https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html)。我们又何必为移动做一个完全不同的呢?所以我们扩充了[WebDriver 的协议](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md),在原有的基础上添加移动自动化相关的 API 方法,这也满足了第三条理念。
-
-第四条就不用说了,[Appium 是开源的](https://github.com/appium/appium)。
-
-## Appium 概念
-
-**C/S 架构**
-Appium 的核心是一个 web 服务器,它提供了一套 REST 的接口。它收到客户端的连接,监听到命令,接着在移动设备上执行这些命令,然后将执行结果放在 HTTP响应中返还给客户端。事实上,这种客户端/服务端的架构给予了许多的可能性:比如我们可以使用任何实现了该客户端的语言来写我们的测试代码。比如我们可以把服务端放在不同
-的机器上。比如我们可以只写测试代码,然后使用像 [Sauce Labs](https://saucelabs.com/mobile) 这样的云服务来解释命令。
-
-**Session**
-自动化始终围绕一个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 文档](/docs/cn/writing-running-appium/caps.cn.md),查看完整的 capabilities 列表。
-
-**Appium Server**
-Appium server 是用 Node.js 写的。我们可以用源码编译或者从 NPM 直接安装。
-
-**Appium 服务端**
-
-Appium 服务端有很多语言库 Java, Ruby, Python, PHP, JavaScript 和 C#,这些库都实现了
-Appium 对 WebDriver 协议的扩展。当使用 Appium 的时候,你只需使用这些库代替常规的 WebDriver 库就可以了。
-你可以从[这里](appium-clients.cn.md)看到所有的库的列表。
-
-**[Appium.app](https://github.com/appium/appium-dot-app), [Appium.exe](https://github.com/appium/appium-dot-exe)**
-
-我们提供了 GUI 封装的 Appium 服务端下载,它封装了运行 Appium服务端的所有依赖,而不需要担心怎样安装Node.js。其中还包括一个Inspector工具,可以帮助你检查应用的界面层级,这样写测试用例时更方便。
-
-## Getting Started
-
-恭喜!你现在有足够的知识来使用 Appium 了。 来我们回到 [getting started doc](/docs/cn/README.md) 继续了解更加
-细节的需求和指南。
diff --git a/docs/cn/about-appium/intro.md b/docs/cn/about-appium/intro.md
new file mode 100644
index 000000000..b16e15e20
--- /dev/null
+++ b/docs/cn/about-appium/intro.md
@@ -0,0 +1,64 @@
+## Appium 介绍
+
+Appium 是一个开源工具,用于自动化 iOS 手机 、 Android 手机和 Windows 桌面平台上的原生、移动 Web 和混合应用。“原生应用”指那些用 iOS 、 Android 或者 Windows SDK 编写的应用。“移动 web 应用”是用移动端浏览器访问的应用(Appium 支持 iOS 上的 Safari 、Chrome 和 Android 上的内置浏览器)。“混合应用”带有一个 "webview" 的包装器——用来和 Web 内容交互的原生控件。类似 [Phonegap](http://phonegap.com/) 的项目,让用 Web 技术开发然后打包进原生包装器创建一个混合应用变得容易了。
+
+重要的是,Appium 是跨平台的:它允许你用同样的 API 对多平台写测试,做到在 iOS 、Android 和 Windows 测试套件之间复用代码。
+
+了解 Appium “支持”这些平台意味着什么、有哪些自动化方式的详细信息,请参见[ Appium 支持的平台](/docs/cn/appium-setup/platform-support.md)。
+
+### Appium 的理念
+
+Appium 旨在满足移动端自动化需求的理念,概述为以下四个原则:
+1. 你没有必要为了自动化而重新编译你的应用或者以任何方式修改它。
+2. 你不应该被限制在特定的语言或框架上来编写运行测试。
+3. 移动端自动化框架在自动化接口方面不应该重造轮子。
+4. 移动端自动化框架应该开源,不但在名义上而且在精神和实践上都要实至名归。
+
+### Appium 的设计
+
+那么 Appium 项目的架构如何实现这一理念呢?为了实现第一点要求,我们其实使用了系统自带的自动化框架。这样,我们不需要把 Appium 特定的或者第三方的代码编译进你的应用。这意味着你测试使用的应用与最终发布的应用并无二致。我们使用以下系统自带的自动化框架:
+
+* iOS 9.3 及以上:苹果的 [XCUITest](https://developer.apple.com/reference/xctest)
+* iOS 9.3 及以下:苹果的 [UIAutomation](https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/)
+* Android 4.2+: 谷歌的 [UiAutomator](http://developer.android.com/tools/help/uiautomator/index.html)
+* Android 2.3+: 谷歌的 [Instrumentation](http://developer.android.com/reference/android/app/Instrumentation.html)(通过绑定另外的项目——[ Selendroid ](http://selendroid.io)提供 Instrumentation 的支持)
+* Windows: 微软的 [WinAppDriver](http://github.com/microsoft/winappdriver)
+
+为了实现第二点要求,我们把这些(系统本身的)供应商提供的框架包装进一套 API —— [WebDriver](http://docs.seleniumhq.org/projects/webdriver/) API 中。WebDriver(也叫 "Selenium WebDriver")规定了一个客户端-服务器协议(称为 [JSON Wire Protocol](https://w3c.github.io/webdriver/webdriver-spec.html)),按照这种客户端-服务器架构,可以使用任何语言编写的客户端向服务器发送适当的 HTTP 请求。已经有[各个流行编程语言编写的客户端](http://appium.io/downloads)了。这也意味着你可以自由使用任何你想要的测试运行器和测试框架;客户端程序库不过是 HTTP 客户端,可以以任何你喜欢的方式混入你的代码。换句话说,Appium 和 WebDriver 客户端不是严格意义上的“测试框架”,而是“自动化程序库”。你可以以任何你喜欢的方式管理你的测试环境!
+
+我们以同样的方式实现第三点要求:WebDriver 已经成为 Web 浏览器自动化事实上的标准,并且是一个[ W3C 工作草案](https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html)。何必在移动端做完全不同的尝试?我们通过附加可用于移动端自动化的 API 方法[扩展了协议](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md)。
+
+显然第 4 点是你在阅读的前提——[ Appium 是开源的](https://github.com/appium/appium)
+
+### Appium 概念
+
+**客户端/服务器架构**
+Appium 的核心是暴露 REST API 的网络服务器。它接受来自客户端的连接,监听命令并在移动设备上执行,答复表示执行结果的 HTTP 响应。客户端/服务器架构实际给予了许多可能性:我们可以使用任何有 http 客户端 API 的语言编写我们的测试代码,不过选一个[ Appium 客户端程序库
+](http://appium.io/downloads)用更容易。我们可以把服务器放在另一台机器上,而不是执行测试的机器。我们可以编写测试代码,并依靠类似 [Sauce Labs](https://saucelabs.com/mobile) 的云服务接收和解释命令。
+
+**会话(session)**
+自动化始终在一个会话的上下文中执行,这些客户端程序库以各自的方式发起与服务器的会话,但都以发给服务器一个 `POST /session` 请求结束,请求中包含一个被称作 'desired capabilities' 的 JSON 对象。这时服务器就会开启这个自动化会话,并返回一个用于发送后续命令的会话 ID。
+
+**Desired Capabilities**
+Desired capabilities 是一些发送给 Appium 服务器的键值对集合 (比如 map 或 hash),告诉服务器我们想要启动什么类型的自动化会话。也有各种可以在自动化运行时修改服务器行为的 capabilities。例如,我们可以把 `platformName` capability 设置为 `iOS`,告诉 Appium 我们想要 iOS 会话,而不是 Android 或者 Windows 会话。我们也可以设置 `safariAllowPopups` capability 为 `true` ,确保我们在 Safari 自动化会话中可以使用 javascript 打开新窗口。有关 Appium capabilities 的完整列表,请参阅 [capabilities doc](/docs/cn/writing-running-appium/caps.md) 。
+
+**Appium 服务器**
+Appium 是用 Node.js 写的服务器。它可以从[源码](https://github.com/appium/appium/blob/master/docs/en/contributing-to-appium/appium-from-source.md)构建安装或者从 NPM 直接安装:
+```
+$ npm install -g appium
+$ appium
+```
+
+**Appium 客户端**
+有多个客户端程序库(Java、Ruby、Python、PHP,、JavaScript 和 C# 的)支持 Appium 对 WebDriver 协议的扩展,你需要用这些客户端程序库代替通常的 WebDriver 客户端。在[这里](appium-clients.md)浏览所有程序库的列表。
+
+**[Appium.app](https://github.com/appium/appium-dot-app), [Appium.exe](https://github.com/appium/appium-dot-exe)**
+有 Appium 服务器的图形界面包装器可以下载。它们打包了 Appium 服务器运行需要的所有东西,所以你不需要为 Node 而烦恼。它们还提供一个 Inspector 使你可以查看你应用的层级结构,这在写测试时很方便。
+
+### 入门指南
+
+恭喜!你现在有足够的知识来使用 Appium 了。 为什么不前往 [入门指南](/docs/cn/README.md) 了解更多详细的要求和指南呢?
+
+由 @黑水 翻译,TesterHome 社区 id:sanlengjingvv
+
+@lihuazhang 校验
\ No newline at end of file
diff --git a/docs/cn/advanced-concepts/chromedriver.md b/docs/cn/advanced-concepts/chromedriver.md
new file mode 100644
index 000000000..e349a9277
--- /dev/null
+++ b/docs/cn/advanced-concepts/chromedriver.md
@@ -0,0 +1,77 @@
+## Chromedriver
+
+Appium 支持对基于 Chrome 内核的 H5 应用(混合应用)或者网页(Chrome 中的网页或者内建的浏览器中的网页)进行自动化。Appium 管理维护着一个 [Chromedriver](https://sites.google.com/a/chromium.org/chromedriver/) 实例,当需要的时候,使用代理模式,将命令传递给这个实例。这和[最新版本的 Chromedriver](https://chromedriver.storage.googleapis.com/LATEST_RELEASE)是绑定的。我们可以通过 npm 包来安装[appium-chromedriver](https://www.npmjs.com/package/appium-chromedriver)。(Github: [appium-chromedriver](https://github.com/appium/appium-chromedriver))
+
+不幸的是,每次 Chromedriver 升级,支持的 Chrome 的最小版本都会升级,这就导致了老设备上经常无法在绑定的版本上自动化。在 Appium 的服务端就会有这样的错误日志:
+```
+An unknown server-side error occurred while processing the command.
+Original error: unknown error: Chrome version must be >= 55.0.2883.0
+```
+
+为了解决这个问题,Appium 可以指定特定的 Chromedriver 版本。或者在安装的时候指定版本,比如 `npm install appium --chromedriver_version="2.16"`
+或者 `CHROMEDRIVER_VERSION=2.20 npm install appium`,也可以使用 `LATEST` 作为 `CHROMEDRIVER_VERSION` 的版本号,表示使用最新的 Chromedriver。或者可以在 Appium 运行的时候指定 `--chromedriver-executable` 为你自己下载的版本的路径,比如 `appium --chromedriver-executable /path/to/my/chromedriver`。
+
+以下就是 Chromedriver 版本和支持的 Chrome 的最小版本的信息:
+
+
+| Version | Minimum Chrome Version | Link to Chromedriver |
+|---------|------------------------|---------------------------------------------------------------------------|
+| 2.29 | 57.0.2987.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.29/) |
+| 2.28 | 55.0.2883.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.28/) |
+| 2.27 | 54.0.2840.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.27/) |
+| 2.26 | 53.0.2785.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.26/) |
+| 2.25 | 53.0.2785.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.25/) |
+| 2.24 | 52.0.2743.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.24/) |
+| 2.23 | 51.0.2704.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.23/) |
+| 2.22 | 49.0.2623.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.22/) |
+| 2.21 | 46.0.2490.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.21/) |
+| 2.20 | 43.0.2357.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.20/) |
+| 2.19 | 43.0.2357.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.19/) |
+| 2.18 | 43.0.2357.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.18/) |
+| 2.17 | 42.0.2311.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.17/) |
+| 2.16 | 42.0.2311.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.16/) |
+| 2.15 | 40.0.2214.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.15/) |
+| 2.14 | 39.0.2171.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.14/) |
+| 2.13 | 38.0.2125.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.13/) |
+| 2.12 | 36.0.1985.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.12/) |
+| 2.11 | 36.0.1985.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.11/) |
+| 2.10 | 33.0.1751.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.10/) |
+| 2.9 | 31.0.1650.59 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.9/) |
+| 2.8 | 30.0.1573.2 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.8/) |
+| 2.7 | 30.0.1573.2 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.7/) |
+| 2.6 | | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.6/) |
+| 2.5 | | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.5/) |
+| 2.4 | 29.0.1545.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.4/) |
+| 2.3 | 28.0.1500.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.3/) |
+| 2.2 | 27.0.1453.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.2/) |
+| 2.1 | 27.0.1453.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.1/) |
+| 2.0 | 27.0.1453.0 | [link](https://chromedriver.storage.googleapis.com/index.html?path=2.0/) |
+
+
+我们可以在[这里](https://chromedriver.storage.googleapis.com/index.html) 可以找到完整的 Chromedriver release 列表。任何一个 Chromedriver 支持的 Chrome 最小版本都可以在 [Chromium](https://www.chromium.org/Home) 项目的[源码](https://chromium.googlesource.com/chromium/src/+/master/docs/get_the_code.md)中找到。把发布那个提交给拉出来,然后在 `src/chrome/test/chromedriver/chrome/version.cc` 里找到 `kMinimumSupportedChromeVersion` 这个变量。
+
+### 安装遇到的网络问题
+
+Appium 安装的时候需要下载 Chromedriver,所以经常会遇到网络问题,尤其在有长城防火墙的中国。
+
+Chromedriver 默认是从 `https://chromedriver.storage.googleapis.com/` 下载。如果要使用镜像的话,需要配置npm的参数 `chromedriver_cdnurl`
+
+```bash
+npm install appium-chromedriver --chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
+```
+
+或者把这个参数加到你的 [`.npmrc`](https://docs.npmjs.com/files/npmrc) 文件中去.
+
+```bash
+chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver
+```
+
+也可以使用环境变量 `CHROMEDRIVER_CDNURL`.
+
+```bash
+CHROMEDRIVER_CDNURL=http://npm.taobao.org/mirrors/chromedriver npm install appium-chromedriver
+```
+
+当然最好开着代理或者vpn来下载更好。
+
+本文由 [lihuazhang](https://github.com/lihuazhang) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
diff --git a/docs/cn/advanced-concepts/cross-domain-iframes.md b/docs/cn/advanced-concepts/cross-domain-iframes.md
new file mode 100644
index 000000000..51181b733
--- /dev/null
+++ b/docs/cn/advanced-concepts/cross-domain-iframes.md
@@ -0,0 +1,36 @@
+## 跨域 iFrame 的自动化
+
+[同源策略](https://en.wikipedia.org/wiki/Same-origin_policy) 会阻止 Appium 对和父页面不同域的 iFrame 进行自动化测试。
+
+### 子域名的解决方案
+如果父页面和 iFrame 使用同一个 domain (比如 `site.com` 和 `shop.site.com`),你可以在父页面和 iFrame 里将 `document.domain` 设置为一个共同的domain。这就解决了同源问题。
+
+父页面:
+```
+
+
This is an iFrame!
+ + +``` + +本文由 [lihuazhang](https://github.com/lihuazhang) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。 \ No newline at end of file diff --git a/docs/cn/advanced-concepts/event-timings.md b/docs/cn/advanced-concepts/event-timings.md new file mode 100644 index 000000000..2161a7588 --- /dev/null +++ b/docs/cn/advanced-concepts/event-timings.md @@ -0,0 +1,45 @@ + +## Appium 事件计时 + +Appium 提供了一个能力,可以获取关于启动信息和命令执行时间的计时信息。这是由 `eventTimings` 这个初始化参数控制的高级功能(把这个参数设置为 `true` 来记录事件的计时信息) + +打开这个参数,`GET /session/:id` 这个接口的响应结果(也就是,`driver.getSessionDetails()` 的响应结果,或者类似的,取决于客户端实现)中会包含 `events` 属性。下面是 `events` 属性的结构 + +```json +{ + "'
-
-# 选项3:你需要设置和
-$ ./reset.sh --ios --real-safari --code-sign '' --profile ''
-
-# 设置成功之后,就可以像往常一样启动服务
-$ node /lib/server/main.js -U
-```
-
-### 执行测试
-如果要在safari下的运行你的测试, 只需要简单的配置**"browserName"**为safari即可
-
-
-### Java 范例
-
-```java
-// java
-// 配置web driver并启动webview应用
-DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
-desiredCapabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
-URL url = new URL("http://127.0.0.1:4723/wd/hub");
-AppiumDriver driver = new AppiumDriver(url, desiredCapabilities);
-
-// 跳转到指定页面并在该页面所以用元素id进行交互
-driver.get("http://saucelabs.com/test/guinea-pig");
-WebElement div = driver.findElement(By.id("i_am_an_id"));
-Assert.assertEquals("I am a div", div.getText()); //跳转到指定页面并在该页面所以用元素id进行交互
-driver.findElement(By.id("comments")).sendKeys("My comment"); //通过id查找评论框并输入
-
-// 关闭应用
-driver.quit();
-```
-
-### Python 范例
-
-```python
-# python
-# 配置web driver并启动webview应用
-capabilities = { 'browserName': 'Safari' }
-driver = webdriver.Remote('http://localhost:4723/wd/hub', capabilities)
-
-# 跳转到指定页面并在该页面所以用元素id进行交互
-driver.get('http://saucelabs.com/test/guinea-pig');
-div = driver.find_element_by_id('i_am_an_id')
-# 检查文本是否符合预期
-assertEqual('I am a div', div.text)
-
-# 通过id查找评论框并输入
-driver.find_element_by_id('comments').send_keys('My comment')
-
-# 关闭应用
-driver.quit()
-```
-
-```php
-// php
-class ContextTests extends PHPUnit_Extensions_AppiumTestCase
-{
- public static $browsers = array(
- array(
- 'desiredCapabilities' => array(
- 'platformName' => 'iOS',
- 'platformVersion' => '7.1',
- 'browserName' => 'Safari',
- 'deviceName' => 'iPhone Simulator'
- )
- )
- );
-
- public function testThings()
- {
- $this->get('http://saucelabs.com/test/guinea-pig');
-
- $div = $this->byId('i_am_an_id');
- $this->assertEquals('I am a div', $div->text());
-
- $this->byId('comments')->sendKeys('My comment');
- }
-}
-```
-
-### 在真机或模拟器上的Chrome执行测试
-
-需要做的准备:
-
-* 确认Chrome已经安装在了你的真机或模拟器上 (应用的包名是`com.android.chrome`) 。在不编译Chromium的情况下, 不可能得到模拟器上的x86版本的chrome,你可以运行一个ARM的模拟器然后从真机上获取一个Chrome的APK安装在模拟器上。
-* 如果你是使用[NPM](https://www.npmjs.org/package/appium)下载的,
-或者是在[.app](https://github.com/appium/appium-dot-app)运行的话,那你不需要其他额外的工作。如果你是使用源码运行,`reset`会下载ChromeDriver并放在`build`。
-使用 `--chromedriver-version` 选项可以指定chromedriver的版本 (例如 `./reset.sh --android --chromedriver-version 2.8`),
-否则使用最新版。
-
-接着,像这样设置就可以在Chrome上执行测试了:
-
-```javascript
-// javascript
-{
- platformName: 'Android'
- , platformVersion: '4.4'
- , deviceName: 'Android Emulator'
- , browserName: 'Chrome'
-};
-```
-
-```python
-# python
-{
- 'platformName': 'Android',
- 'platformVersion': '4.4',
- 'deviceName': 'Android Emulator',
- 'browserName': 'Chrome'
-}
-```
-
-```php
-// php
-public static $browsers = array(
- array(
- 'desiredCapabilities' => array(
- 'platformName' => 'Android',
- 'platformVersion' => '4.4',
- 'browserName' => 'Chrome',
- 'deviceName' => 'Android Emulator'
- )
- )
-);
-```
-
-```java
-// java
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome");
-```
-
-在4.4以上的版本,你也可以用'Browser' `browserName` 来对内置浏览器进行自动化。
-在所有版本你都可以用'Chromium' `browserName`来对Chromium进行自动化。
-
-
-#### chromedriver故障排查
-
-从Chrome 33开始,不再必须将设备root。在之前的版本,设备必须按要求进行root (ChromeDriver需要写 /data/local 目录来设定Chrome的命令行参数) 。
-
-如果在版本33之前在Chrome上测试app,确保adb shell拥有设备中/data/local目录的读写权限:
-
-```center
-$ adb shell su -c chmod 777 /data/local
-```
-
-更多关于chromedriver的文档详见[ChromeDriver documentation](https://sites.google.com/a/chromium.org/chromedriver/getting-started/getting-started---android)。
-
diff --git a/docs/cn/writing-running-appium/mobile-web.md b/docs/cn/writing-running-appium/mobile-web.md
new file mode 100644
index 000000000..ec1f9c48e
--- /dev/null
+++ b/docs/cn/writing-running-appium/mobile-web.md
@@ -0,0 +1,212 @@
+## 自动化测试移动网络应用
+
+如果你有兴趣在 iOS 系统上的 Safari 浏览器或者 Android 系统上的 Chrome 浏览器进行网页自动化的话
+,Appium可以帮助你。你只要正常地写 WebDriver 测试,通过特别的设置,可以把 Appium 当成 Selenium 服务来运行。
+
+### 模拟器上的移动端Safari浏览器
+
+首先,确定你的 Safari 开发者模式开启,移动调试端口打开。
+
+如果你需要用模拟器或真实设备,你必须在用 Appium 之前打开 Safari 浏览器。
+
+然后,想在移动端 Safari 上运行你的测试,就需要按如下设置 desired capabilities:
+
+```javascript
+// javascript
+{
+ platformName: 'iOS'
+ , platformVersion: '7.1'
+ , browserName: 'Safari'
+ , deviceName: 'iPhone Simulator'
+}
+```
+
+```python
+# python
+{
+ 'platformName': 'iOS',
+ 'platformVersion': '7.1',
+ 'browserName': 'Safari',
+ 'deviceName': 'iPhone Simulator'
+}
+```
+
+```php
+// php
+public static $browsers = array(
+ array(
+ 'desiredCapabilities' => array(
+ 'platformName' => 'iOS',
+ 'platformVersion' => '7.1',
+ 'browserName' => 'Safari',
+ 'deviceName' => 'iPhone Simulator'
+ )
+ )
+);
+```
+
+```java
+// java
+DesiredCapabilities capabilities = new DesiredCapabilities();
+capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
+capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "7.1");
+capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
+capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");
+```
+
+### iOS 真机上的移动端 Safari
+
+在iOS 9.3及以下(pre-XCUITest)版本系统,我们借助 SafariLauncher 应用在移动端Safari运行测试。
+这是因为Safari是苹果公司的应用,Instruments 不能在真机上拉起 Safari。SafariLuncher 可以帮助打开 Safari 浏览器,浏览器一旦打开,Remote Debugger 会通过 [ios-webkit-debug-proxy](https://github.com/google/ios-webkit-debug-proxy) 自动连接。在 `ios-webkit-debug-proxy` 运行时,
+必须在你的iOS设备测试前,信任这台设备
+
+指导如何安装和运行 ios-webkit-debugger-proxy ,可以查阅 [iOS WebKit debug proxy](/docs/cn/advanced-concepts/ios-webkit-debug-proxy.md)
+
+### 安装
+
+在真实上运行测试前,你需要:
+
+* 安装好 **ios-webkit-debug-proxy**,运行并在 27753 接口开启监听。(查阅 [hybrid 文档](/docs/cn/advanced-concepts/hybrid.md#execution-against-a-real-ios-device) 作为指导)
+* 在 iOS 设备上开启 **web inspector**(设置>safari>高级)
+* 确保 `SafariLauncher` 正常工作 (参考 [SafariLauncher docs](safari-launcher.md))
+
+
+### 运行你的测试
+
+在 safari 运行你的测试,只需简单地设置 **"browserName"** 为 **"Safari"**
+
+### Java示例
+
+```java
+// java
+//setup the web driver and launch the webview app.
+DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
+desiredCapabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Safari");
+URL url = new URL("http://127.0.0.1:4723/wd/hub");
+AppiumDriver driver = new AppiumDriver(url, desiredCapabilities);
+
+// 浏览网页和定位页面元素取得id。
+driver.get("http://saucelabs.com/test/guinea-pig");
+WebElement div = driver.findElement(By.id("i_am_an_id"));
+Assert.assertEquals("I am a div", div.getText()); //check the text retrieved matches expected value
+driver.findElement(By.id("comments")).sendKeys("My comment"); //populate the comments field by id.
+
+//关闭浏览器
+driver.quit();
+```
+
+### Python Example
+
+```python
+# python
+# 建立web driver,开启浏览器app。
+capabilities = { 'browserName': 'Safari' }
+driver = webdriver.Remote('http://localhost:4723/wd/hub', capabilities)
+
+# 浏览网页和定位页面元素取得id。
+driver.get('http://saucelabs.com/test/guinea-pig');
+div = driver.find_element_by_id('i_am_an_id')
+# 检查文本是否匹配值
+assertEqual('I am a div', div.text)
+
+# 通过元素id填值。
+driver.find_element_by_id('comments').send_keys('My comment')
+
+# 关闭浏览器。
+driver.quit()
+```
+
+```php
+// php
+class ContextTests extends PHPUnit_Extensions_AppiumTestCase
+{
+ public static $browsers = array(
+ array(
+ 'desiredCapabilities' => array(
+ 'platformName' => 'iOS',
+ 'platformVersion' => '7.1',
+ 'browserName' => 'Safari',
+ 'deviceName' => 'iPhone Simulator'
+ )
+ )
+ );
+
+ public function testThings()
+ {
+ $this->get('http://saucelabs.com/test/guinea-pig');
+
+ $div = $this->byId('i_am_an_id');
+ $this->assertEquals('I am a div', $div->text());
+
+ $this->byId('comments')->sendKeys('My comment');
+ }
+}
+```
+
+### 在模拟器和真机上的移动端 Chrome
+
+前提设置:
+
+* 确保 Chrome (应用包名 `com.android.chrome`) 在设备或者模拟器上安装好了。不编译 Chromium,在 x86 版本的模拟器上安装 Chrome 已经不可能了。所以你需要运行一个 ARM 版本的模拟器,然后从真机上复制一个 Chrome APK 到模拟器上。
+* 在特定版本的 Chrome 上进行自动化,需要安装和配置不同版本的 Chromedriver,更多信息参考[文档](/docs/cn/advanced-concepts/chromedriver.md)
+
+然后,使用如下设置,在你的Chrome下运行你的测试:
+
+```javascript
+// javascript
+{
+ platformName: 'Android'
+ , platformVersion: '4.4'
+ , deviceName: 'Android Emulator'
+ , browserName: 'Chrome'
+};
+```
+
+```python
+# python
+{
+ 'platformName': 'Android',
+ 'platformVersion': '4.4',
+ 'deviceName': 'Android Emulator',
+ 'browserName': 'Chrome'
+}
+```
+
+```php
+// php
+public static $browsers = array(
+ array(
+ 'desiredCapabilities' => array(
+ 'platformName' => 'Android',
+ 'platformVersion' => '4.4',
+ 'browserName' => 'Chrome',
+ 'deviceName' => 'Android Emulator'
+ )
+ )
+);
+```
+
+```java
+// java
+DesiredCapabilities capabilities = new DesiredCapabilities();
+capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
+capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");
+capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
+capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Chrome");
+```
+
+注意:在 4.4+ 版本的设备上,你也可以将 `browserName` 设置为'Browser' 在内建的浏览器上运行自动化。设置浏览器为'Chromium'是在所有设备可以运行的。在所有设备上,你可以将 `browserName` 设置为 'Chromium' 来对Chromium的某个版本进行自动化。
+
+#### Chromedriver 的障碍排除
+
+截止 Chrome Version 33,设备不在需要被 root。在这之前,设备需要被 root,因为 ChromeDriver 设置启动Chrome的命令行参数需要在 /data/local 目录的写入权限。
+
+如果在 Chrome 低于 33 版本上测试,请确保 adb shell 有设备读取/写入 /data/local 权限。
+
+```center
+$ adb shell su -c chmod 777 /data/local
+```
+
+更多chroomedriver文档参见(https://sites.google.com/a/chromium.org/chromedriver/getting-started/getting-started---android)
+
+本文由 [testly](https://github.com/testly) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/network_connection.cn.md b/docs/cn/writing-running-appium/network_connection.cn.md
deleted file mode 100644
index 9f495039d..000000000
--- a/docs/cn/writing-running-appium/network_connection.cn.md
+++ /dev/null
@@ -1,61 +0,0 @@
-## 调整网络设置
-
-Selenium 的 [Mobile JSON Wire Protocol Specification](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md) 支持一个获取和设置设备网络连接的 [API](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#104) 。这个 API 通过位掩码(bitmask)工作,把所有可能的状态用一个整型数据表示:
-
-| 值 (别名) | 数据连接 | Wifi 连接 | 飞行模式 |
-| ------------------ | ---- | ---- | ------------- |
-| 0 (什么都没有) | 0 | 0 | 0 |
-| 1 (飞行模式) | 0 | 0 | 1 |
-| 2 (只有Wifi) | 0 | 1 | 0 |
-| 4 (只有数据连接) | 1 | 0 | 0 |
-| 6 (开启所有网络) | 1 | 1 | 0 |
-
-翻译备注:数据链接即2g, 3g, 4g的网络连接。
-
-### iOS
-
-很不幸,目前 Appium 在 iOS 下不支持 Selenium 的网络连接 API。
-
-### Android
-
-选择你想使用的设置,然后根据上面的表格发送正确的位掩码(bitmask)。
-
-```javascript
-// javascript
-// 设置网络连接为飞行模式
-driver.setNetworkConnection(1)
-
-// 设置网络连接为仅启用Wifi
-driver.setNetworkConnection(2)
-
-// 设置网络连接为仅启用数据连接
-driver.setNetworkConnection(4)
-
-// 设置网络连接为启用数据连接和Wifi
-driver.setNetworkConnection(6)
-```
-
-获取网络连接设置会返回基于同样规则的位掩码,你可以将其解码来获得网络设置。
-
-```javascript
-// javascript
-driver.getNetworkConnection().then(function (connectionType) {
- switch (connectionType) {
- case 0:
- // 无网络
- break;
- case 1:
- // 飞行模式
- break;
- case 2:
- // wifi
- break;
- case 4:
- // 数据连接
- break;
- case 6:
- // wifi和数据连接
- break;
- }
-});
-```
diff --git a/docs/cn/writing-running-appium/network_connection.md b/docs/cn/writing-running-appium/network_connection.md
new file mode 100644
index 000000000..b5a5c06c3
--- /dev/null
+++ b/docs/cn/writing-running-appium/network_connection.md
@@ -0,0 +1,77 @@
+## 调整网络连接
+
+Selenium [移动 JSON 协议规范](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md) 支持一个获取和设置网络连接的[API](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md#104)。这个 API 会设置一个掩码,每一个可能的网络状态对应一个掩码
+
+| 值 (名称) | 数据 | Wifi | 飞行模式 |
+| ------------------ | ---- | ---- | ------------- |
+| 0 (无网) | 0 | 0 | 0 |
+| 1 (飞行模式) | 0 | 0 | 1 |
+| 2 (Wifi) | 0 | 1 | 0 |
+| 4 (移动数据) | 1 | 0 | 0 |
+| 6 (所有网络) | 1 | 1 | 0 |
+
+### iOS
+
+不幸的是,目前 Appium 不支持这个 API。
+
+### Android
+
+Android 上有如下限制:
+
+#### 真机
+
+* 只能在 Android 6 或者以下,改变飞行模式
+* 只能在 Android 4.4 或者以下改变数据连接状态。5.0 或者以上必须 root 了之后才能工作。(比如,可以运行 _su_ )
+* 所有的 Android 版本都能改变 WI-FI 连接状态
+
+#### 模拟器
+
+* 只能在 Android 6 或者以下,改变飞行模式
+* 所有的 Android 版本都能改变数据连接
+* 所有的 Android 版本都能改变 WI-FI 连接状态
+
+### Windows
+
+不幸的是,目前 Appium 测试 Windows 应用,不支持这个 API。
+
+```javascript
+// javascript
+// set airplane mode
+driver.setNetworkConnection(1)
+
+// set wifi only
+driver.setNetworkConnection(2)
+
+// set data only
+driver.setNetworkConnection(4)
+
+// set wifi and data
+driver.setNetworkConnection(6)
+```
+
+检索网络连接设置返回相同的掩码,其中状态可以解码。
+
+```javascript
+// javascript
+driver.getNetworkConnection().then(function (connectionType) {
+ switch (connectionType) {
+ case 0:
+ // no network connection
+ break;
+ case 1:
+ // airplane mode
+ break;
+ case 2:
+ // wifi
+ break;
+ case 4:
+ // data
+ break;
+ case 6:
+ // wifi and data
+ break;
+ }
+});
+```
+
+本文由 [testly](https://github.com/testly) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/reset-strategies.md b/docs/cn/writing-running-appium/reset-strategies.md
new file mode 100644
index 000000000..48c24e187
--- /dev/null
+++ b/docs/cn/writing-running-appium/reset-strategies.md
@@ -0,0 +1,8 @@
+# 重置策略
+
+| 自动化平台 | 默认 | fullReset | noReset |
+| --------------- | ------- | --------- | ------- |
+| iOS (包括XCUITest) | 测试完成后关闭模拟器。不销毁模拟器。不从真机上卸载应用。 | 测试完成后卸载应用, 模拟器测试结束后销毁模拟器。 | 测试结束后不销毁或者关闭模拟器。启动测试运行在任意正在运行的模拟器或者插入的真机。 |
+| Android | 测试结束后停止应用,清理应用数据,不卸载应用包。 | 测试结束后停止应用,清理应用数据,卸载应用包。 | 不停止应用,不清理应用数据,不卸载应用包。 |
+
+本文由 yanqiang@douban.com 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/running-tests.cn.md b/docs/cn/writing-running-appium/running-tests.cn.md
deleted file mode 100644
index 988d27b09..000000000
--- a/docs/cn/writing-running-appium/running-tests.cn.md
+++ /dev/null
@@ -1,246 +0,0 @@
-# 执行测试
-
-## 准备被测应用 (iOS)
-
-在模拟器上测试apps必须要用模拟器专用的编译器,例如使用下列的命令来编译Xcode项目:
-
-```
- > xcodebuild -sdk iphonesimulator6.0
-```
-
-这行指令在Xcode项目底下创建了一个`build/Release-iphonesimulator`目录,并且生成一个可以透过Appium服务器来通讯的的`.app`封包。
-
-如果需要,你可以把.app 目录压缩成一个zip压缩档! Appium 会自行解压缩。让你能方便在非本地运行Appium。
-
-## 准备被测应用 (Android)
-
-用Appium去执行你的.apk档其实没什么特别需要注意的事项。如果需要,你可以把它压缩成zip压缩档。
-
-## 用Appium测试你的app (iOS)
-
-想知道如何编写测试脚本,请参照测试范例:
-
-[Node.js](https://github.com/appium/sample-code/tree/master/sample-code/examples/node) | [Python](https://github.com/appium/sample-code /tree/master/sample-code/examples/python) | [PHP](https://github.com/appium/sample-code/tree/master/sample-code/examples/php) | [Ruby](https://github.com/appium/sample-code/tree/master/sample-code/examples/ruby) | [Java](https://github.com/appium/sample-code/tree/master/sample-code/examples/java)
-
-基本上来说,首先先确定你启动了Appium:
-
-```
- node .
-```
-
-然后执行你的WebDriver测试脚本,脚本必须包含下列的环境参数:
-```javascript
-// javascript
-{
- platformName: 'iOS',
- platformVersion: '7.1',
- deviceName: 'iPhone Simulator',
- app: myApp
-}
-```
-
-```python
-# python
-{
- 'platformName': 'iOS',
- 'platformVersion': '7.1',
- 'deviceName': 'iPhone Simulator',
- 'app': myApp
-}
-```
-
-```php
-// php
-public static $browsers = array(
- array(
- 'desiredCapabilities' => array(
- 'platformName' => 'iOS',
- 'platformVersion' => '7.1',
- 'deviceName' => 'iPhone Simulator',
- 'app' => $myApp
- )
- )
-);
-```
-
-```java
-// java
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "7.1");
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");
-capabilities.setCapability(MobileCapabilityType.APP, myApp);
-```
-
-在这个脚本集里,`myApp`必须是下列其中之一:
-
-* 一个模拟器编译过的.app 目录或者.zip 文件的本地绝对路径
-* 一个包含着你的.app封包的zip档的url
-* appium安装根目录下的一个示例app的相对路径
-
-在你选择的WebDriver库里,设定remote session使用上述的环境参数然后使用端口4723来连接本地服务器(或者使用你在Appium启动时所设定的端口)。现在你已经完成设置了!
-
-## 用Appium测试你的app (Android)
-
-首先,先确定你有一个而且必须是只能一个Android模拟器或者设备连接着。如果你输入`adb devices`,你应该只看到一个设备连接着。这将是Appium所用来测试的设备。当然,要连接一个设备,你需要准备好一个Android AVD (参考([Windows](../appium-setup/running-on-windows.cn.md),[Mac](../appium-setup/running-on-osx.cn.md),或者[Linux](../appium-setup/running-on-linux.cn.md))以了解更多)。 如果Android SDK工具在你的环境变量path下,你可以简单的执行:
-
-```
- emulator -avd <我的Avd名称>
-```
-
-然后等android模拟器启动。有时候,因为某些原因,`adb`会卡住。如果它没有显示任何的设备或其他故障,你可以使用下列指令来重启:
-
-```
- adb kill-server && adb devices
-```
-
-现在,确认Appium已经启动:
-
-```
- node .
-```
-
-有几种方法来启动一个Appium程序(效果和通过adb启动一模一样):
-
-- 只有apk或者zip,默认activity将会被启动。 (只设置了'app'环境参数)
-- apk + activity ('app' + 'appActivity' 环境参数)
-- apk + activity + intent ('app' + 'appActivity' + 'appIntent' 环境参数)
-- ...
-
-Activities 可以通过以下方式来指定:
-
-- 名称 (如 appActivity: 'com.helloworld.SayHello')。
-- 相对于 appPackage的路径 (如 appPackage: 'com.helloworld', appActivity='.SayHello')
-
-如果“appWaitPackage'和'appWaitActivity”被指定,Appium
-将自动等待,直到这些活动的被启动。你可以为实例指定多个等待的activity:
-
-- appActivity: 'com.splash.SplashScreen'
-- appPackage: 'com.splash' appActivity: '.SplashScreen'
-- appPackage: 'com.splash' appActivity: '.SplashScreen,.LandingPage,com.why.GoThere'
-
-如果你不是很清楚在apk中有哪些activity,你可以通过以下方式来查看:
-
-- Mac/Linux: 'adb shell dumpsys window windows | grep mFocusedApp'
-- 在 Ruby 控制台运行: 'adb shell dumpsys window windows\`.each_line.grep(/mFocusedApp/).first.strip'
-- 在 Windows 终端运行 'adb shell dumpsys window windows' 然后去看mFocusedApp这一行的内容。
-
-然后执行你的WebDriver测试脚本,脚本必须包含下列的环境参数:
-
-```javascript
-// javascript
-{
- platformName: 'Android',
- platformVersion: '4.4',
- deviceName: 'Android Emulator',
- app: myApp
-}
-```
-
-```python
-# python
-{
- 'platformName': 'Android',
- 'platformVersion': '4.4',
- 'deviceName': 'Android Emulator',
- 'app': myApp
-}
-```
-
-```php
-// php
-public static $browsers = array(
- array(
- 'desiredCapabilities' => array(
- 'platformName' => 'Android',
- 'platformVersion' => '4.4',
- 'deviceName' => 'Android Emulator',
- 'app' => $myApp
- )
- )
-);
-```
-
-```java
-// java
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-capabilities.setCapability(MobileCapabilityType.APP, myApp);
-```
-
-在这个脚本集里,`myApp`必须是下列其中之一:
-
-* 一个.apk 或者.zip 档的本地绝对路径
-* 一个包含着你的.apk档的zip压缩档的url
-* appium安装根目录下的一个示例app的路径
-
-`myAppPackage` 必须是你的应用的java package,例如, `com.example.android.myApp`。
-
-`myAppActivity` 必须是你的希望测试的Android activity, 例如, `MainActivity`。
-
-在你选择的WebDriver库里,设定remote session使用上述的环境参数然后使用端口4723来连接本地服务器(或者是使用你在Appium启动时所设定的任意端口)。现在你已经设置完成了!
-
-## 用Appium测试你的app (Android 设备 < 4.2, 以及混合app测试)
-
-低于4.2版本的Android设备(API Level 17) 没有安装 Google 的[UiAutomator framework](http://developer.android.com/tools/help/uiautomator/index.html).下面的范例是早期Appium在这些设备上的测试方法。对于早期的设备以及使用混合模式(webview-based)制作的apps, Appium 包含了另一种自动化测试工具[Selendroid](http://selendroid.io/)。
-
-要使用Selendroid, 只需要在之前提到的环境参数上稍作修改即可,添加 `automationName` 参数并指定Seledroid作为测试工具。通常你还需要在你的activity名称前加上`.` (如:在`appActivity`参数中使用`.MainActivity` 而不是 `MainActivity`) :
-
-```javascript
-// javascript
-{
- automationName: 'Selendroid',
- platformName: 'Android',
- platformVersion: '2.3',
- deviceName: 'Android Emulator',
- app: myApp,
- appPackage: 'com.mycompany.package',
- appActivity: '.MainActivity'
-}
-```
-
-```python
-# python
-{
- 'automationName': 'Selendroid',
- 'platformName': 'Android',
- 'platformVersion': '2.3',
- 'deviceName': 'Android Emulator',
- 'app': myApp,
- 'appPackage': 'com.mycompany.package',
- 'appActivity': '.MainActivity'
-}
-```
-
-```php
-// php
-public static $browsers = array(
- array(
- 'desiredCapabilities' => array(
- 'automationName' => 'Selendroid',
- 'platformName' => 'Android',
- 'platformVersion' => '2.3',
- 'deviceName' => 'Android Emulator',
- 'app' => $myApp,
- 'appPackage' => 'com.mycompany.package',
- 'appActivity'=> '.MainActivity'
- )
- )
-);
-```
-
-```java
-// java
-DesiredCapabilities capabilities = new DesiredCapabilities();
-capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "Selendroid");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
-capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "2.3");
-capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
-capabilities.setCapability(MobileCapabilityType.APP, myApp);
-capabilities.setCapability(MobileCapabilityType.APP_PACKAGE: "com.mycompany.package");
-capabilities.setCapability(MobileCapabilityType.APP_ACTIVITY: ".MainActivity");
-```
-
-这样Appium就会启动 Selendroid 测试会话取代默认的测试会话。使用Selendroid的缺点是有时候它的API跟Appium非常不同。所以我们建议你在为你的旧设备或者混合app写测试脚本之前先仔细的阅读[Selendroid的说明文档](http://selendroid.io/native.html)。
diff --git a/docs/cn/writing-running-appium/running-tests.md b/docs/cn/writing-running-appium/running-tests.md
new file mode 100644
index 000000000..40f0abdca
--- /dev/null
+++ b/docs/cn/writing-running-appium/running-tests.md
@@ -0,0 +1,253 @@
+## 运行测试
+
+### 准备你要测试的应用(iOS)
+
+被测应用要在模拟器上运行,就必须针对该模拟器进行专门的编译,例如在 Xcode 项目下执行如下命令(你可以使用 `xcodebuild -showsdks` 来看看你电脑上提供了多少 SDK):
+
+ > xcodebuild -sdk iphonesimulator6.0
+
+这会在你的 Xcode 项目下创建一个 `build/Release-iphonesimulator` 目录。这个目录包含 `.app` 应用包。你就是用这个包和 Appium server 沟通。
+
+如果需要,可以将应用程序目录压缩到ZIP文件中!Appium 会帮你解压。
+
+### 准备你要测试的应用(Android)
+
+你什么都不用做就可以在 Appium 上运行 apk。如果你想打包,随你。
+
+### 准备你要测试的应用(Windows)
+你什么都不用做就可以在 Appium 上运行 Windows 应用。
+
+
+### 在 Appium 上运行你的测试应用(IOS)
+
+想知道当前要做什么,最好的方法就是是查看示例代码:
+
+[Node.js](https://github.com/appium/sample-code/tree/master/sample-code/examples/node) | [Python](https://github.com/appium/sample-code/tree/master/sample-code/examples/python) | [PHP](https://github.com/appium/sample-code/tree/master/sample-code/examples/php) | [Ruby](https://github.com/appium/sample-code/tree/master/sample-code/examples/ruby) | [Java](https://github.com/appium/sample-code/tree/master/sample-code/examples/java)
+
+基本上,首先确保 Appium 运行:
+
+ node .
+
+然后编写你的 WebDriver 测试脚本, 用如下的 desired capabilities:
+
+```javascript
+// javascript
+{
+ platformName: 'iOS',
+ platformVersion: '7.1',
+ deviceName: 'iPhone Simulator',
+ app: myApp
+}
+```
+
+```python
+# python
+{
+ 'platformName': 'iOS',
+ 'platformVersion': '7.1',
+ 'deviceName': 'iPhone Simulator',
+ 'app': myApp
+}
+```
+
+```php
+// php
+public static $browsers = array(
+ array(
+ 'desiredCapabilities' => array(
+ 'platformName' => 'iOS',
+ 'platformVersion' => '7.1',
+ 'deviceName' => 'iPhone Simulator',
+ 'app' => $myApp
+ )
+ )
+);
+```
+
+```java
+// java
+DesiredCapabilities capabilities = new DesiredCapabilities();
+capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");
+capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "7.1");
+capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone Simulator");
+capabilities.setCapability(MobileCapabilityType.APP, myApp);
+```
+
+
+在上面这一组 capabilities 里,`myApp` 必须是以下的任意一个:
+
+* 基于对应模拟器编译的 .app 目录或者 zip 文件的绝对路径
+* app 应用包的 zip 文件的 URL
+* 基于 Appium 安装根目录的示例应用程序的相对路径
+
+用你选择的 WebDriver (客户端)库,使用这些 capabilities 和本地的4723端口建立远程会话(或任何启动 Appium 时候指定的主机和端口)。现在你应该都设置好了!
+
+
+### 使用 Appium 测试你的应用 (Android)
+
+首先,确保你有一个且只有一个 Android 模拟器或设备连接。例如,如果你运行 `adb devices`,
+你应该只看到一个设备连接。这个设备就是 Appium 用来测试的。当然, 要连接上一个设备,你需要配置一个 Android AVD (更多信息参考[Windows](https://github.com/appium/appium/blob/master/docs/en/appium-setup/running-on-windows.md),
+[Mac](https://github.com/appium/appium/blob/master/docs/en/appium-setup/running-on-osx.md),
+或者 [Linux](https://github.com/appium/appium/blob/master/docs/en/appium-setup/running-on-linux.md)))。如果你的系统变量 PATH 里有 Android SDK 的工具路径,你可以简单运行如下命令:
+
+ emulator -avd
+
+等待 android 模拟器完成启动(可以去喝个咖啡)。有时,各种原因,`adb` 会卡住。如果不显示任何连接设备或否则失败,你可以通过运行以下命令重启它:
+
+ adb kill-server && adb devices
+
+现在,确认 Appium 运行起来:
+
+ node .
+
+有几种方法可以启动一个 Appium 应用程序(和使用 adb 启动一样):
+
+- 仅仅使用 apk 或者 zip,默认 activity 会被加载 ('app' capability)
+- apk + activity ('app' + 'appActivity' capabilities)
+- apk + activity + intent ('app' + 'appActivity' + 'appIntent' capabilities)
+- ...
+
+Activity 可以通过以下方式指定:
+
+- absolute (比如 appActivity: 'com.helloworld.SayHello').
+- 相对于应用包名 (e.g. appPackage: 'com.helloworld', appActivity='.SayHello')
+
+如果指定 'appWaitPackage' 和 'appWaitActivity',Appium 会转菊花等待,直到这些 Activity 启动。您可以指定等待多个Activity。例如:
+
+- appActivity: 'com.splash.SplashScreen'
+- appPackage: 'com.splash' appActivity: '.SplashScreen'
+- appPackage: 'com.splash' appActivity: '.SplashScreen,.LandingPage,com.why.GoThere'
+
+如果你不确定你的 apk 中配置的是哪个 Activity,你可以用下列方法:
+
+- Mac/Linux: 'adb shell dumpsys window windows | grep mFocusedApp'
+- 在Ruby控制台: 'adb shell dumpsys window windows\`.each_line.grep(/mFocusedApp/).first.strip'
+- 在Windows终端运行 'adb shell dumpsys window windows' 然后手动找到 mFocusedApp(坑爹,windows shell 下面不是有 findStr 么?)
+
+然后开始写 WebDriver 的测试脚本,使用下面的 desired capabilities:
+
+```javascript
+// javascript
+{
+ platformName: 'Android',
+ platformVersion: '4.4',
+ deviceName: 'Android Emulator',
+ app: myApp
+}
+```
+
+```python
+# python
+{
+ 'platformName': 'Android',
+ 'platformVersion': '4.4',
+ 'deviceName': 'Android Emulator',
+ 'app': myApp
+}
+```
+
+```php
+// php
+public static $browsers = array(
+ array(
+ 'desiredCapabilities' => array(
+ 'platformName' => 'Android',
+ 'platformVersion' => '4.4',
+ 'deviceName' => 'Android Emulator',
+ 'app' => $myApp
+ )
+ )
+);
+```
+
+```java
+// java
+DesiredCapabilities capabilities = new DesiredCapabilities();
+capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
+capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4");
+capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
+capabilities.setCapability(MobileCapabilityType.APP, myApp);
+```
+
+在这组 capabilities 里,`myApp` 必须是以下任意一个:
+
+* apk 或者 zip 文件的绝对路径
+* apk 的 zip 文件的 url 链接
+* 基于 appium 安装根目录的示例应用的相对路径
+
+用你选择的 WebDriver (客户端)库,使用这些 capabilities 和本地的4723端口建立远程会话(或任何启动 Appium 时候指定的主机和端口)。现在你应该都设置好了!
+
+### 使用 Appium 运行你的测试程序(Android设备& lt;4.2,混合应用)
+
+4.2版本之前的(API级别17)Android 没有集成谷歌的[UiAutomator framework](http://developer.android.com/tools/testing-support-library/index.html#UIAutomator)。
+Appium 使用 UiAutomator 来执行自动化。那么在早期的设备或混合(webview-based)应用程序,
+ Appium 是与另一个自动化后台绑定 [Selendroid](http://selendroid.io/)。
+
+要使用 Selendroid,只需稍微改动 desired capabilities,添加 `automationName` 并指定 Selendroid 为自动化后台。通常,你还需要在你的 activity 名字前加一个 `.`(如,`appActivity` 这个 capability 需要使用 `.MainActivity` 而不是 `MainActivity`)。
+
+```javascript
+// javascript
+{
+ automationName: 'Selendroid',
+ platformName: 'Android',
+ platformVersion: '2.3',
+ deviceName: 'Android Emulator',
+ app: myApp,
+ appPackage: 'com.mycompany.package',
+ appActivity: '.MainActivity'
+}
+```
+
+```python
+# python
+{
+ 'automationName': 'Selendroid',
+ 'platformName': 'Android',
+ 'platformVersion': '2.3',
+ 'deviceName': 'Android Emulator',
+ 'app': myApp,
+ 'appPackage': 'com.mycompany.package',
+ 'appActivity': '.MainActivity'
+}
+```
+
+```php
+// php
+public static $browsers = array(
+ array(
+ 'desiredCapabilities' => array(
+ 'automationName' => 'Selendroid',
+ 'platformName' => 'Android',
+ 'platformVersion' => '2.3',
+ 'deviceName' => 'Android Emulator',
+ 'app' => $myApp,
+ 'appPackage' => 'com.mycompany.package',
+ 'appActivity'=> '.MainActivity'
+ )
+ )
+);
+```
+
+```java
+// java
+DesiredCapabilities capabilities = new DesiredCapabilities();
+capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "Selendroid");
+capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
+capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "2.3");
+capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
+capabilities.setCapability(MobileCapabilityType.APP, myApp);
+capabilities.setCapability(MobileCapabilityType.APP_PACKAGE: "com.mycompany.package");
+capabilities.setCapability(MobileCapabilityType.APP_ACTIVITY: ".MainActivity");
+```
+
+现在 Appium 将启动一个 Selendroid 测试会话而不是默认的测试会话。
+使用 Selendroid 的缺点之一是,它的一些 API 和Appium 有着显著的差别。
+因此,我们建议你在为旧设备或混合应用程序编写脚本时,彻读(Selendroid文档)(http://selendroid.io/native.html)
+
+###运行你的测试程序与Appium(Windows)
+
+只需确保 Appium 在监听,然后运行你的测试。
+
+有关详细信息,请参阅我们的[samples](https://github.com/Microsoft/WinAppDriver/tree/master/Samples)。
+
+本文由 [testly](https://github.com/testly) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/safari-launcher.md b/docs/cn/writing-running-appium/safari-launcher.md
new file mode 100644
index 000000000..54b27c5ea
--- /dev/null
+++ b/docs/cn/writing-running-appium/safari-launcher.md
@@ -0,0 +1,94 @@
+## 在 iOS 9.3 及以下版本的真机上运行移动 web 测试:SafariLauncher
+
+在 iOS 9.3 或更低版本的 iOS 真实设备上运行移动 web 测试需要引入第三方应用程序[SafariLauncher](https://github.com/snevesbarros/SafariLauncher)。 这是必要的,因为 Instruments 没有办法在设备上启动Safari 应用程序。只有先启动 SafariLauncher 应用程序,然后才能启动Safari。简单!
+
+
+In some configurations, Appium is able to automatically build, sign, and install
+`SafariLauncher` as it needs, and there is nothing else necessary to be done. If,
+however, this is not the case, as is more often so with later versions of
+[Xcode](https://developer.apple.com/xcode/), the following configuration needs to
+be done before Safari tests on real devices can be successfully run.
+
+在某些配置中,Appium 能够根据需要自动构建,签名和安装 SafariLauncher,没有什么额外要做的。 但是,事实并非如此,随着[Xcode](https://developer.apple.com/xcode/)的版本更新更为常见。想要在真实设备上的 Safari 上成功运行自动化测试,需要完成以下配置。
+
+### 自动配置SafariLauncher
+
+The only thing needed for automatic `SafariLauncher` configuration is to create
+a **provisioning profile** that can be used to deploy the `SafariLauncher` App.
+This requires, in particular, a wildcard certificate, which is not possible if
+your Apple developer account is a free one. If that is the case, skip to the
+manual configuration below.
+
+自动配置 SafariLauncher 唯一需要做的是创建一个可用于部署 SafariLauncher App 的**配置文件**。 这需要一个通配符证书。但是如果您的Apple开发者帐户是免费的,这是不可能的。 如果是这种情况,请跳转到下面的手动配置内容。
+
+要创建启动器的配置文件,请进入**Apple Developers会员中心**,按如下步骤操作:
+
+步骤1:创建一个新的**APP ID**,并选择WildCard APP ID选项,将其设置为“ * ”
+步骤2:创建一个**新的开发配置文件**,App Id选择在步骤1中创建的。
+步骤3:选择您的**证书和设备**,然后单击下一步。
+步骤4:设置配置文件名称并**生成配置文件**。
+步骤5:下载配置文件并用文本编辑器打开。
+步骤6:搜索**UUID**及其字符串作为您的**身份代码**。
+
+现在只需将您的UDID和设备名称包含在您所需的功能中:
+
+```js
+{
+ udid: '...',
+ deviceName: '...',
+ platformName: 'iOS',
+ platformVersion: '9.3',
+ browserName: 'Safari'
+}
+```
+
+### 手动配置 SafariLauncher
+
+**注意:** 此过程假定您已经安装[Xcode](https://developer.apple.com/xcode/)7.3或7.3.1。
+
+可以使用 [appium-ios-driver](https://github.com/appium/appium-ios-driver) 附带的 [SafariLauncher](https://github.com/snevesbarros/SafariLauncher) 版本,但如果这样做,每次更新Appium时,必须重新执行该过程。
+
+要获取 `SafariLauncher` 的本地副本,请先从 [GitHub](https://github.com/) 克隆它:
+
+```bash
+git clone https://github.com/snevesbarros/SafariLauncher.git
+```
+
+一旦您拥有 `SafariLauncher` 的源代码的本地副本,请打开 [Xcode](https://developer.apple.com/xcode/),然后打开 `SafariLauncher` 项目
+
+
+
+在 `SafariLauncher` target 窗口中,您会看到一个错误,表示需要有一个此 app 的配置文件
+
+
+
+为了解决这个问题,您首先需要为app输入“Bundle Identifier”。 Appium期望的默认值为com.bytearc.SafariLauncher,但这可能无法用于构建。 在这种情况下,请选择其他的东西,并记下它。 然后选择“Team”,并允许创建配置文件
+
+
+
+最后,确保您的设备已连接到计算机,并将其选为目标设备
+
+
+
+并运行构建和安装操作来编译app并将其推送到您的设备上
+
+
+
+现在你的设备上有一个可用的 `SafariLauncher`。 该app本身是一个简单的屏幕,点击一个按钮将启动 `Safari`
+
+
+
+如果您选择了与默认(com.bytearc.SafariLauncher)不同的app的软件包标识符,则最后一步是必需的。 如果你这样做,在使用bundleId所需的功能创建会话时,需要将它发送到Appium:
+
+```js
+{
+ udid: '...',
+ deviceName: '...',
+ platformName: 'iOS',
+ platformVersion: '9.3',
+ browserName: 'Safari',
+ bundleId: 'com.imurchie.SafariLauncher'
+}
+```
+
+本文由 [高鹏](https://testerhome.com/026) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/safari-launcher/changing-bundleid.png b/docs/cn/writing-running-appium/safari-launcher/changing-bundleid.png
new file mode 100644
index 000000000..74fb61648
Binary files /dev/null and b/docs/cn/writing-running-appium/safari-launcher/changing-bundleid.png differ
diff --git a/docs/cn/writing-running-appium/safari-launcher/choosing-target.png b/docs/cn/writing-running-appium/safari-launcher/choosing-target.png
new file mode 100644
index 000000000..c3b1c2cfc
Binary files /dev/null and b/docs/cn/writing-running-appium/safari-launcher/choosing-target.png differ
diff --git a/docs/cn/writing-running-appium/safari-launcher/no-provisioning-profile.png b/docs/cn/writing-running-appium/safari-launcher/no-provisioning-profile.png
new file mode 100644
index 000000000..6d8d6542b
Binary files /dev/null and b/docs/cn/writing-running-appium/safari-launcher/no-provisioning-profile.png differ
diff --git a/docs/cn/writing-running-appium/safari-launcher/opening.png b/docs/cn/writing-running-appium/safari-launcher/opening.png
new file mode 100644
index 000000000..65621b78d
Binary files /dev/null and b/docs/cn/writing-running-appium/safari-launcher/opening.png differ
diff --git a/docs/cn/writing-running-appium/safari-launcher/running.png b/docs/cn/writing-running-appium/safari-launcher/running.png
new file mode 100644
index 000000000..2b2b3558b
Binary files /dev/null and b/docs/cn/writing-running-appium/safari-launcher/running.png differ
diff --git a/docs/cn/writing-running-appium/safari-launcher/safarilauncher.png b/docs/cn/writing-running-appium/safari-launcher/safarilauncher.png
new file mode 100644
index 000000000..43ba16ea0
Binary files /dev/null and b/docs/cn/writing-running-appium/safari-launcher/safarilauncher.png differ
diff --git a/docs/cn/writing-running-appium/server-args.cn.md b/docs/cn/writing-running-appium/server-args.cn.md
deleted file mode 100644
index b4172820d..000000000
--- a/docs/cn/writing-running-appium/server-args.cn.md
+++ /dev/null
@@ -1,85 +0,0 @@
-# Appium 服务器参数
-
-使用方法: `node . [标志]`
-
-## 服务器标志
-所有的标志都是可选的,但是有一些标志需要组合在一起才能生效。
-
-
-
-
-
-|标志|默认值|描述|例子|
-|----|-------|-----------|-------|
-|`--shell`|null|进入 REPL 模式||
-|`--localizable-strings-dir`|en.lproj|IOS only: 定位 .strings所在目录的相对路径 |`--localizable-strings-dir en.lproj`|
-|`--app`|null|iOS: 基于模拟器编译的 app 的绝对路径或者设备目标的 bundle_id; Android: apk 文件的绝对路径`--app /abs/path/to/my.app`|
-|`--ipa`|null|(IOS-only) .ipa 文件的绝对路径|`--ipa /abs/path/to/my.ipa`|
-|`-U`, `--udid`|null|连接物理设备的唯一设备标识符|`--udid 1adsf-sdfas-asdf-123sdf`|
-|`-a`, `--address`|0.0.0.0|监听的 ip 地址|`--address 0.0.0.0`|
-|`-p`, `--port`|4723|监听的端口|`--port 4723`|
-|`-ca`, `--callback-address`|null|回调IP地址 (默认: 相同的IP地址)|`--callback-address 127.0.0.1`|
-|`-cp`, `--callback-port`|null|回调端口号 (默认: 相同的端口号)|`--callback-port 4723`|
-|`-bp`, `--bootstrap-port`|4724|(Android-only) 连接设备的端口号|`--bootstrap-port 4724`|
-|`-k`, `--keep-artifacts`|false|弃用,无效。trace信息现在保留tmp目录下,每次运行前会清除该目录中的信息。 也可以参考 --trace-dir 。||
-|`-r`, `--backend-retries`|3|(iOS-only) 遇到 crash 或者 超时,Instrument 重新启动的次数。|`--backend-retries 3`|
-|`--session-override`|false|允许 session 被覆盖 (冲突的话)||
-|`--full-reset`|false|(iOS) 删除整个模拟器目录。 (Android) 通过卸载应用(而不是清除数据)重置应用状态。在 Android 上,session 完成后也会删除应用。||
-|`--no-reset`|false|session 之间不重置应用状态 (iOS: 不删除应用的 plist 文件; Android: 在创建一个新的 session 前不删除应用。)||
-|`-l`, `--pre-launch`|false|在第一个 session 前,预启动应用 (iOS 需要 --app 参数,Android 需要 --app-pkg 和 --app-activity)||
-|`-lt`, `--launch-timeout`|90000|(iOS-only) 等待 Instruments 启动的时间||
-|`-g`, `--log`|null|将日志输出到指定文件|`--log /path/to/appium.log`|
-|`--log-level`|debug|日志级别; 默认 (console[:file]): debug[:debug]|`--log-level debug`|
-|`--log-timestamp`|false|在终端输出里显示时间戳||
-|`--local-timezone`|false|使用本地时间戳||
-|`--log-no-colors`|false|不在终端输出中显示颜色||
-|`-G`, `--webhook`|null|同时发送日志到 HTTP 监听器|`--webhook localhost:9876`|
-|`--native-instruments-lib`|false|(IOS-only) iOS 内建了一个怪异的不可能避免的延迟。我们在 Appium 里修复了它。如果你想用原来的,你可以使用这个参数。||
-|`--app-pkg`|null|(Android-only) 你要运行的apk的java包。 (例如, com.example.android.myApp)|`--app-pkg com.example.android.myApp`|
-|`--app-activity`|null|(Android-only) 打开应用时,启动的 Activity 的名字(比如, MainActivity)|`--app-activity MainActivity`|
-|`--app-wait-package`|false|(Android-only) 你想等待的 Activity 的包名。(比如, com.example.android.myApp)|`--app-wait-package com.example.android.myApp`|
-|`--app-wait-activity`|false|(Android-only) 你想等待的 Activity 名字(比如, SplashActivity)|`--app-wait-activity SplashActivity`|
-|`--android-coverage`|false|(Android-only) 完全符合条件的 instrumentation 类。 作为命令 adb shell am instrument -e coverage true -w 的 -w 的参数 |`--android-coverage com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation`|
-|`--avd`|null|(Android-only) 要启动的 avd 的名字||`--avd @default`|
-|`--avd-args`|null|(Android-only) 添加额外的参数给要启动avd|`--avd-args -no-snapshot-load`|
-|`--device-ready-timeout`|5|(Android-only) 等待设备准备好的时间,以秒为单位|`--device-ready-timeout 5`|
-|`--safari`|false|(IOS-Only) 使用 Safari 应用||
-|`--device-name`|null|待使用的移动设备名字|`--device-name iPhone Retina (4-inch), Android Emulator`|
-|`--platform-name`|null|移动平台的名称: iOS, Android, or FirefoxOS|`--platform-name iOS`|
-|`--platform-version`|null|移动平台的版本|`--platform-version 7.1`|
-|`--automation-name`|null|自动化工具的名称: Appium or Selendroid|`--automation-name Appium`|
-|`--browser-name`|null|移动浏览器的名称: Safari or Chrome|`--browser-name Safari`|
-|`--default-device`, `-dd`|false|(IOS-Simulator-only) 使用instruments自己启动的默认模拟器||
-|`--force-iphone`|false|(IOS-only) 无论应用要用什么模拟器,强制使用 iPhone 模拟器||
-|`--force-ipad`|false|(IOS-only) 无论应用要用什么模拟器,强制使用 iPad 模拟器||
-|`--language`|null|iOS / Android 模拟器的语言|`--language en`|
-|`--locale`|null|Locale for the iOS simulator / Android Emulator|`--locale en_US`|
-|`--calendar-format`|null|(IOS-only) iOS 模拟器的日历格式|`--calendar-format gregorian`|
-|`--orientation`|null|(IOS-only) 初始化请求时,使用 LANDSCAPE (横屏) 或者 PORTRAIT (竖屏)|`--orientation LANDSCAPE`|
-|`--tracetemplate`|null|(IOS-only) 指定 Instruments 使用的 tracetemplate 文件|`--tracetemplate /Users/me/Automation.tracetemplate`|
-|`--show-sim-log`|false|(IOS-only) 如果设置了, iOS 模拟器的日志会写到终端上来||
-|`--show-ios-log`|false|(IOS-only) 如果设置了, iOS 系统的日志会写到终端上来||
-|`--nodeconfig`|null|指定 JSON 格式的配置文件 ,用来在 selenium grid 里注册 appiumd|`--nodeconfig /abs/path/to/nodeconfig.json`|
-|`-ra`, `--robot-address`|0.0.0.0|robot 的 ip 地址|`--robot-address 0.0.0.0`|
-|`-rp`, `--robot-port`|-1|robot 的端口地址|`--robot-port 4242`|
-|`--selendroid-port`|8080|用来和 Selendroid 交互的本地端口|`--selendroid-port 8080`|
-|`--chromedriver-port`|9515|ChromeDriver运行的端口|`--chromedriver-port 9515`|
-|`--chromedriver-executable`|null|ChromeDriver 可执行文件的完整路径||
-|`--use-keystore`|false|(Android-only) 设置签名 apk 的 keystore||
-|`--keystore-path`|(Android-only) keystore 的路径||
-|`--keystore-password`|android|(Android-only) keystore 的密码||
-|`--key-alias`|androiddebugkey|(Android-only) Key 的别名||
-|`--key-password`|android|(Android-only) Key 的密码||
-|`--show-config`|false|打印 Appium 服务器的配置信息,然后退出||
-|`--no-perms-check`|false|跳过Appium对是否可以读/写必要文件的检查||
-|`--command-timeout`|60|默认所有会话的接收命令超时时间 (在超时时间内没有接收到新命令,自动关闭会话)。 会被新的超时时间覆盖||
-|`--keep-keychains`|false|(iOS) 当 Appium 启动或者关闭的时候,是否保留 keychains (Library/Keychains)||
-|`--strict-caps`|false|如果所选设备是appium不承认的有效设备,会导致会话失败||
-|`--isolate-sim-device`|false|Xcode 6存在一个bug,那就是一些平台上如果其他模拟器设备先被删除时某个特定的模拟器只能在没有任何错误的情况下被建立。这个选项导致了Appium不得不删除除了正在使用设备以外其他所有的设备。请注意这是永久性删除,你可以使用simctl或xcode管理被Appium使用的设备类别。||
-|`--tmp`|null|可以被Appium用来管理临时文件的目录(绝对路径),比如存放需要移动的内置iOS应用程序。 默认的变量为 `APPIUM_TMP_DIR` ,在 *nix/Mac 为 `/tmp` 在windows上使用环境便令 `TEMP` 设定的目录。||
-|`--trace-dir`|null|用于保存iOS instruments trace的 appium 目录,是绝对路径, 默认为 /appium-instruments||
-|`--intent-action`|android.intent.action.MAIN|(Android-only) 用于启动 activity 的intent action|`--intent-action android.intent.action.MAIN`|
-|`--intent-category`|android.intent.category.LAUNCHER|(Android-only) 用于启动 activity 的intent category|`--intent-category android.intent.category.APP_CONTACTS`|
-|`--intent-flags`|0x10200000|(Android-only) 启动 activity 的标志|`--intent-flags 0x10200000`|
-|`--intent-args`|null|(Android-only) 启动 activity 时附带额外的 intent 参数|`--intent-args 0x10200000`|
-|`--suppress-adb-kill-server`|false|(Android-only) 如果被设定,阻止Appium杀掉adb实例。||
diff --git a/docs/cn/writing-running-appium/server-args.md b/docs/cn/writing-running-appium/server-args.md
new file mode 100644
index 000000000..41a91f24b
--- /dev/null
+++ b/docs/cn/writing-running-appium/server-args.md
@@ -0,0 +1,96 @@
+# Appium服务器参数
+
+Appium v1.5里某些服务器参数已被弃用,取而代之使用的-default-capabilities 标志。
+
+用法:node . [标志]
+
+## 服务器标志
+所有标志都是可选的,但是有些必须跟指定标志组合使用才生效。
+
+
+
+
+
+| 标志 | 默认值 | 描述 | 示例 |
+| ------------------------------- | :------------------------------- | ---------------------------------------- | ---------------------------------------- |
+| `--shell` | 无 | 进入 REPL 模式 | |
+| `--ipa` | 无 | (仅iOS) .ipa 文件的绝对路径 | `--ipa /abs/path/to/my.ipa` |
+| `-a`, `--address` | 0.0.0.0 | 监听的 ip 地址 | `--address 0.0.0.0` |
+| `-p`, `--port` | 4723 | 监听的端口 | `--port 4723` |
+| `-ca`, `--callback-address` | 无 | 回调ip地址 (默认: 同 --address) | `--callback-address 127.0.0.1` |
+| `-cp`, `--callback-port` | 无 | 回调端口 (默认: 同 --port) | `--callback-port 4723` |
+| `-bp`, `--bootstrap-port` | 4724 | (仅安卓) 设备上跟 Appium通信的端口号 | `--bootstrap-port 4724` |
+| `-r`, `--backend-retries` | 3 | (仅iOS) 遇到crash或者超时,尝试重启Instruments的次数 | `--backend-retries 3` |
+| `--session-override` | false | 允许session覆盖 (如有冲突) | |
+| `-l`, `--pre-launch` | false | 首次建立session时预启动应用 (iOS 需要 –app参数,Android需要 –app-pkg和 –app-activity参数) | |
+| `-g`, `--log` | 无 | 将日志输出到指定文件 | `--log /path/to/appium.log` |
+| `--log-level` | debug | 日志等级;默认 (控制台[:file]): 调试[:debug] | `--log-level debug` |
+| `--log-timestamp` | false | 在终端输出里显示时间戳 | |
+| `--local-timezone` | false | 时间戳使用本地时区 | |
+| `--log-no-colors` | false | 终端输出不显示颜色 | |
+| `-G`, `--webhook` | 无 | 同时发送日志到 HTTP 监听器 | `--webhook localhost:9876` |
+| `--safari` | false | (仅iOS) 使用safari应用程序 | |
+| `--default-device`, `-dd` | false | (仅iOS模拟器) Instruments启动时使用的默认模拟器 | |
+| `--force-iphone` | false | (仅iOS) 不管应用程序指定什么设备,强制使用iPhone模拟器 | |
+| `--force-ipad` | false | (仅iOS) 不管应用程序指定什么设备,强制使用iPad模拟器 | |
+| `--tracetemplate` | 无 | (仅iOS) 指定Instruments所使用的.tracetemplate文件 | `--tracetemplate /Users/me/Automation.tracetemplate` |
+| `--instruments` | 无 | (仅iOS) Instruments二进制文件路径 | `--instruments /path/to/instruments` |
+| `--nodeconfig` | 无 | 指定 JSON格式的配置文件,用来在selenium grid里注册appium | `--nodeconfig /abs/path/to/nodeconfig.json` |
+| `-ra`, `--robot-address` | 0.0.0.0 | robot使用的IP地址 | `--robot-address 0.0.0.0` |
+| `-rp`, `--robot-port` | -1 | robot使用的端口号 | `--robot-port 4242` |
+| `--selendroid-port` | 8080 | 用于和Selendroid通信的本地端口 | `--selendroid-port 8080` |
+| `--chromedriver-port` | 9515 | ChromeDriver 运行使用的端口 | `--chromedriver-port 9515` |
+| `--chromedriver-executable` | 无 | ChromeDriver可执行文件的路径 | |
+| `--show-config` | false | 打印appium服务器的配置信息,然后退出 | |
+| `--no-perms-check` | false | 绕过Appium检查,确保用户可读/写必要的文件 | |
+| `--strict-caps` | false | 如果所选设备是appium不承认的有效设备,会导致会话失败 | |
+| `--isolate-sim-device` | false | Xcode 6存在一个bug,那就是一些平台上如果其他模拟器设备先被删除时某个特定的模拟器只能在没有任何错误的情况下被建立。这个选项导致了Appium不得不删除除了正在使用设备以外其他所有的设备。请注意这是永久性删除,你可以使用simctl或xcode管理被Appium使用的设备类别。 | |
+| `--tmp` | 无 | 可以被Appium用来管理临时文件的目录(绝对路径),比如存放需要移动的内置iOS应用程序。在*nix/Mac上默认为 /tmp,在Windows上默认为 C:\Windows\Temp | |
+| `--trace-dir` | 无 | 用于保存iOS instruments trace的 appium 目录,是绝对路径, 默认为/appium-instruments | |
+| `--debug-log-spacing` | false | 在日志中加大间距来帮助进行视觉检查 | |
+| `--suppress-adb-kill-server` | false | (仅安卓) 如果设置了,可以阻止Appium杀掉adb实例 | |
+| `--async-trace` | false | 添加长堆栈追踪到日志实体,建议仅调试时选用 | |
+| `--webkit-debug-proxy-port` | 27753 | (仅iOS) 用于ios-webkit-debug-proxy通信的本地端口 | `--webkit-debug-proxy-port 27753` |
+| `-dc`, `--default-capabilities` | {} | 设置默认desired capabilities,每个会话都将使用默认desired capabilities,除非被新的capabilities覆盖 | `--default-capabilities [ '{"app": "myapp.app", "deviceName": "iPhone Simulator"}' | /path/to/caps.json ]` |
+| `--reboot` | false | - (仅安卓) 每次建立会话重启模拟器,会话结束后杀掉模拟器 | |
+| `--command-timeout` | 60 | [弃用] 默认所有会话接收命令的超时时间 (单位是秒,但不超过2147483秒)。已被newCommandTimeout关键字替代 | |
+| `-k`, `--keep-artifacts` | false | [弃用] - 保留Instruments trace目录,请参考--trace-dir标志 | |
+| `--platform-name` | 无 | [弃用] -移动平台名称: iOS,Android或 FirefoxOS | `--platform-name iOS` |
+| `--platform-version` | 无 | [弃用] - 移动平台的版本号 | `--platform-version 7.1` |
+| `--automation-name` | 无 | [弃用] - 自动化工具的名称: Appium 或 Selendroid | `--automation-name Appium` |
+| `--device-name` | 无 | [弃用] - 要使用的移动设备的名称 | `--device-name iPhone Retina (4-inch), Android Emulator` |
+| `--browser-name` | 无 | [弃用] - 移动浏览器的名称: Safari 或者 Chrome | `--browser-name Safari` |
+| `--app` | 无 | [弃用] - IOS: 基于模拟器编译的.app文件的绝对路径或者设备上目标的BundleId; Android: .apk文件的绝对路径 | `--app /abs/path/to/my.app` |
+| `-lt`, `--launch-timeout` | 90000 | [弃用] - (仅iOS) Instruments启动等待时间(单位: ms) | |
+| `--language` | 无 | [弃用] -iOS模拟器/Android模拟器的语言 | `--language en` |
+| `--locale` | 无 | [弃用] -iOS模拟器/Android模拟器的区域 | `--locale en_US` |
+| `-U`, `--udid` | 无 | [弃用] - 连接的物理设备的udid | `--udid 1adsf-sdfas-asdf-123sdf` |
+| `--orientation` | 无 | [弃用] - (仅iOS) 初始化请求时,使用LANDSCAPE或者PORTRAIT | `--orientation LANDSCAPE` |
+| `--no-reset` | false | [弃用] - session之间不充值应用状态 (IOS: 不删除应用的 plist 文件;Android: 在创建一个新的session前不删除应用。) | |
+| `--full-reset` | false | [弃用] - (iOS) 删除整个模拟器目录。 (Android) 通过卸载应用(而不是清楚数据)重置应用状态。在Android上session完成后也会删除应用。 | |
+| `--app-pkg` | 无 | [弃用] - (仅安卓) 想要运行的apk的java包 (例如, com.example.android.myApp) | `--app-pkg com.example.android.myApp` |
+| `--app-activity` | 无 | [弃用] - (仅安卓) 打开应用时,想要启动的Activity的名称(例如 MainActivity) | `--app-activity MainActivity` |
+| `--app-wait-package` | false | [弃用] - (仅安卓) 想要等待的activity的包名 (例如 com.example.android.myApp) | `--app-wait-package com.example.android.myApp` |
+| `--app-wait-activity` | false | [弃用] - (仅安卓) 想要等待的activity名(例如 SplashActivity) | `--app-wait-activity SplashActivity` |
+| `--device-ready-timeout` | 5 | [弃用] - (仅安卓) 等待设备准备就绪的时间(单位: 秒) | `--device-ready-timeout 5` |
+| `--android-coverage` | false | [弃用] - (仅安卓) 完全符合条件的instrumentation类,作为命令 adb shell am instrument -e coverage true -w 的 -w 的参数 | `--android-coverage com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation` |
+| `--avd` | 无 | [弃用] - (仅安卓) 要启动的avd的名称 | `--avd @default` |
+| `--avd-args` | 无 | [弃用] - (仅安卓) 启动avd时额外的模拟器参数 | `--avd-args -no-snapshot-load` |
+| `--use-keystore` | false | [弃用] - (仅安卓) 设置签名apk的keystore | |
+| `--keystore-path` | /.android/debug.keystore | [弃用] - (仅安卓) keystore 的路径 | |
+| `--keystore-password` | android | [弃用] - (仅安卓) keystore的密码 | |
+| `--key-alias` | androiddebugkey | [弃用] - (仅安卓) Key的别名 | |
+| `--key-password` | android | [弃用] - (仅安卓) Key 的密码 | |
+| `--intent-action` | android.intent.action.MAIN | [弃用] - (仅安卓) 用于启动activity的Intent action | `--intent-action android.intent.action.MAIN` |
+| `--intent-category` | android.intent.category.LAUNCHER | [弃用] - (仅安卓) 用于启动activity的Intent category | `--intent-category android.intent.category.APP_CONTACTS` |
+| `--intent-flags` | 0x10200000 | [弃用] - (仅安卓) 启动activity的标志 | `--intent-flags 0x10200000` |
+| `--intent-args` | 无 | [弃用] - (仅安卓)启动activity时附带额外的intent参数 | `--intent-args 0x10200000` |
+| `--dont-stop-app-on-reset` | false | [弃用] - (仅安卓) 用于设置appium重启时是否先杀掉app | |
+| `--calendar-format` | 无 | [弃用] - (仅iOS) iOS模拟器的日历格式 | `--calendar-format gregorian` |
+| `--native-instruments-lib` | false | [弃用] - (仅iOS) iOS 内建了一个怪异的不可能避免的延迟,我们在Appium里修复了它,如果你想用原来的,你可以使用这个参数 | |
+| `--keep-keychains` | false | [弃用] - (仅iOS) 当Appium启动或者关闭的时候,是否保留keychains(Library/Keychains) | |
+| `--localizable-strings-dir` | en.lproj | [弃用] - (仅iOS)定位.strings所在目录的相对路径 | `--localizable-strings-dir en.lproj` |
+| `--show-ios-log` | false | [弃用] - (仅iOS) 如果设置了,iOS系统日志会输出到终端 | |
+|`--enable-heapdump`|false|激活 NodeJS 内存 dumps 收集功能。这个功能对找到内存泄露非常有用。用 'kill -SIGUSR2 <PID>' 命令来创建 node 进程的内存堆栈dump,只有在 *nix 系统有效。dump 文件会被创建在 appium 运行的目录,文件使用 *.heapsnapshot 做后缀。如果后续想要深入研究,这个快照可以被加载到 Chrome Inspector 里去。参加 [Rising Stack article](https://blog.risingstack.com/finding-a-memory-leak-in-node-js/) for more details.||
+
+本文由 [testly](https://github.com/testly) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/touch-actions.cn.md b/docs/cn/writing-running-appium/touch-actions.cn.md
deleted file mode 100644
index 717b0466a..000000000
--- a/docs/cn/writing-running-appium/touch-actions.cn.md
+++ /dev/null
@@ -1,125 +0,0 @@
-## 移动手势的自动化
-
-虽然Selenium WebDriver的规范支持数种手机交互的方式,但它的参数并不能简单地映射到底层设备使用的自动化函数 (像在iOS上的UIAutomation) 。为此,Appium在规范的最新版本中定义了新的触摸操作/多点触控 API
-([https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#multiactions-1](https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#multiactions-1))。
-注意,这跟在早期版本中使用原始JSON Wire Protocol 的触摸操作 API不同。
-
-这些API可以让你使用多个驱动来建立任意手势。请参阅对应语言的Appium客户端文档,就可以找到使用这些API的例子。
-
-
-### 触摸操作/多点触控 API的概述
-
-### 触摸操作 (TouchAction)
-
-*TouchAction* 对象包含一连串的事件。
-
-在所有的appium客户端库中,触摸对象创建并给出一连串的事件。
-
-规范中的可用事件有:
- * 短按 (press)
- * 释放 (release)
- * 移动到 (moveTo)
- * 点击 (tap)
- * 等待 (wait)
- * 长按 (longPress)
- * 取消 (cancel)
- * 执行 (perform)
-
-这里有一个通过伪代码创建动作的例子:
-
-```center
-TouchAction().press(el0).moveTo(el1).release()
-```
-
-上述模拟用户按下一个元素,滑动他的手指到另一个位置,然后从屏幕上释放其手指。
-
-Appium按顺序执行这些事件。你可以添加一个 `wait` 事件来控制相应手势的时间。
-
-appium客户端库有不同的方式来实现上述例子,比如:你可以传递一个坐标值或一个元素给 `moveTo` 事件。同时传递坐标和元素,会将坐标和元素对应起来,但这不是绝对的。
-
-
-调用 `perform` 事件发送整个事件序列给appium,从而使触摸手势在设备上运行。
-
-Appium客户端还允许人们直接通过驱动程序对象执行触摸操作, 而不是调用触摸操作对象的`perform`事件。
-
-
-在伪代码中,以下两个是等价的:
-
-```center
-TouchAction().tap(el).perform()
-
-driver.perform(TouchAction().tap(el))
-```
-
-### 多点触控 (MultiTouch)
-
-*MultiTouch* 对象是触摸操作的集合。
-
-多点触控手势只有两个方法,添加 (`add`) 和执行 (`perform`) 。
-
-`add` 用于将不同的触摸操作添加到一个多点触控中。
-
-当 `perform` 被调用的时候,所有被添加到多点触摸中的触摸事件会被发送到appium并且被执行,就像它们同时发生一样。Appium会执行“触摸事件”中的第一个事件,然后第二个,以此类推。
-
-
-用两只手指点击的代码示例:
-
-```center
-action0 = TouchAction().tap(el)
-action1 = TouchAction().tap(el)
-MultiAction().add(action0).add(action1).perform()
-```
-
-
-
-### 缺陷和解决方法
-
-不幸的是有一个缺陷存在于iOS的7.x的模拟器上,ScrollViews无法识别由UIAutomation创建的手势 (在iOS上Appium使用的是UIAutomation) 。 为了实现此功能,我们已经提供了新的函数, `scroll`, 在大部分情况下可以让你实现跟ScrollView一样的功能!
-
-
-
-**滚动**
-
-
-要使用这特殊的功能,我们重写了driver中的 `execute` 和
-`executeScript` 方法。 可以通过在命令前加 `mobile: ` 的前缀来使用滚动。
-请参见下面的例子:
-
-* **WD.js:**
-
-```javascript
-// javascript
-// 把视图往下滑动
-driver.execute("mobile: scroll", [{direction: 'down'}])
-// 继续测试
-```
-
-* **Java:**
-
-```java
-// java
-JavascriptExecutor js = (JavascriptExecutor) driver;
-HashMap scrollObject = new HashMap();
-scrollObject.put("direction", "down");
-scrollObject.put("element", ((RemoteWebElement) element).getId());
-js.executeScript("mobile: scroll", scrollObject);
-```
-
-**滑块的自动化**
-
-
-**iOS**
-
- * **Java**
-
-```java
-// java
-// 滑动值使用0到1之间的数字以字符串的形式表示
-// 例如,“0.1”代表10%,“1.0”代表100%
-WebElement slider = driver.findElement(By.xpath("//window[1]/slider[1]"));
-slider.sendKeys("0.1");
-```
-
-**Android**
-
-与Android上的滑块进行交互的最佳方式是用触摸操作 (TouchActions) 。
diff --git a/docs/cn/writing-running-appium/touch-actions.md b/docs/cn/writing-running-appium/touch-actions.md
new file mode 100644
index 000000000..d130f62f5
--- /dev/null
+++ b/docs/cn/writing-running-appium/touch-actions.md
@@ -0,0 +1,197 @@
+## 移动手势的自动化
+
+尽管 Selenium WebDriver 的规范已经支持了一些移动交互,但它的参数并不总是那么容易地
+映射到底层设备的自动化框架所提供的方法上(比如 iOS 上的 UIAutomation)。为此,Appium 在最新的规范([https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#multiactions-1](https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#multiactions-1))
+中实现了新的触摸操作和多重操作 API。
+
+注意,这与早期版本中原始的 JSON Wire 协议里的触摸操作 API 不同。
+
+这些 API 允许你使用多个执行器去建立任意的手势。
+请查看对应语言的 Appium 客户端文档来查看使用这些 API 的示例。
+
+### 触摸操作(TouchAction)/多重操作(MultiAction) API 概述
+
+### 触摸操作(TouchAction)
+
+*TouchAction* 对象包含一连串的事件。
+
+在所有的 appium 客户端库里,触摸对象被创建并被赋予一连串的事件。
+
+规范里可用的事件有:
+ * 短按(press)
+ * 释放(release)
+ * 移动到(moveTo)
+ * 点击(tap)
+ * 等待(wait)
+ * 长按(longPress)
+ * 取消(cancel)
+ * 执行(perform)
+
+这是一个使用伪代码创建一个动作的示例:
+
+```center
+TouchAction().press(el0).moveTo(el1).release()
+```
+
+上述模拟了一个用户按下一个元素,滑动他的手指到另一个位置,然后将他的手指从屏幕上移开。
+
+Appium按顺序执行这些事件。你可以添加`wait`事件来控制事件的时长。
+
+`moveTo` 的坐标与当前的位置*相关*。举例来说,从 100,100 拖拽到 200,200 可以这样实现:
+```
+.press(100,100) // 从 100,100 开始
+.moveTo(100,100) // 分别给X和Y坐标增加100,在 200,200 结束
+
+```
+
+Appium 客户端库有不同的实现方式,举例来说:你可以传递坐标或元素给 `moveTo` 事件。当坐标
+ 和元素一起传递时,该坐标是相对于元素位置的相对坐标,而不是相对于当前位置。
+
+调用 `perform` 事件发送全部的事件序列给 appium,触摸手势就会在你的设备上执行。
+
+Appium客户端也允许通过 driver 对象直接执行触摸操作,而不是在触摸操作对象上调用 `perform`
+事件。
+
+在伪代码里,以下两者是相等的:
+
+```center
+TouchAction().tap(el).perform()
+
+driver.perform(TouchAction().tap(el))
+```
+
+### 多点触控(MultiTouch)
+
+*MultiTouch*对象是触摸操作的集合。
+
+多点触控手势只有两个方法,`add`和`perform`。
+
+`add` 用于将不同的触摸操作添加到当前的多点触控中。
+
+当 `perform` 执行时,被添加到多点触控里的所有触摸操作会被发送给 appium 并被执行,就像它们
+同时发生一样。Appium 会按序一个个执行触摸事件,首先第一个事件,然后第二个,以此类推。
+
+用两只手指点击的伪代码示例:
+
+```center
+action0 = TouchAction().tap(el)
+action1 = TouchAction().tap(el)
+MultiAction().add(action0).add(action1).perform()
+```
+
+### 缺陷与解决方法
+
+不幸的是,在iOS 7.0 - 8.x 的模拟器上存在着一个缺陷,ScrollViews、CollectionViews和TableViews不能识别 UIAutomation(Appium在iOS底层所使用的框架)所创建的手势。为了避免这些,我们已经提供了一个可用的新函数 `scroll`,它在大多数情况下能让你完成你想在这些 view 中的任意一个上去做的事,也就是,滚动它!
+
+
+**滚动**
+
+
+为了允许使用这个特殊的手势,我们重写了 driver 的 `execute` 和 `executeScript` 方法,并且给命令
+加上 `mobile: ` 前缀。
+看下面的示例:
+
+为了进行滚动,将你想滚动的方向作为参数传入。
+
+
+```javascript
+// javascript
+driver.execute('mobile: scroll', {direction: 'down'})
+```
+
+```java
+// java
+JavascriptExecutor js = (JavascriptExecutor) driver;
+HashMap scrollObject = new HashMap();
+scrollObject.put("direction", "down");
+js.executeScript("mobile: scroll", scrollObject);
+```
+
+```ruby
+# ruby
+execute_script 'mobile: scroll', direction: 'down'
+```
+
+```python
+# python
+driver.execute_script("mobile: scroll", {"direction": "down"})
+```
+
+```csharp
+// c#
+Dictionary scrollObject = new Dictionary();
+scrollObject.Add("direction", "down");
+((IJavaScriptExecutor)driver).ExecuteScript("mobile: scroll", scrollObject));
+```
+
+```php
+$params = array(array('direction' => 'down'));
+$driver->executeScript("mobile: scroll", $params);
+```
+
+使用方向和元素进行滚动的示例。
+
+```javascript
+// javascript
+driver.execute('mobile: scroll', {direction: 'down', element: element.value.ELEMENT});
+```
+
+```java
+// java
+JavascriptExecutor js = (JavascriptExecutor) driver;
+HashMap scrollObject = new HashMap();
+scrollObject.put("direction", "down");
+scrollObject.put("element", ((RemoteWebElement) element).getId());
+js.executeScript("mobile: scroll", scrollObject);
+```
+
+```ruby
+# ruby
+execute_script 'mobile: scroll', direction: 'down', element: element.ref
+```
+
+```python
+# python
+driver.execute_script("mobile: scroll", {"direction": "down", element: element.getAttribute("id")})
+```
+
+```csharp
+// c#
+Dictionary scrollObject = new Dictionary();
+scrollObject.Add("direction", "down");
+scrollObject.Add("element", );
+((IJavaScriptExecutor)driver).ExecuteScript("mobile: scroll", scrollObject));
+```
+
+```php
+$params = array(array('direction' => 'down', 'element' => element.GetAttribute("id")));
+$driver->executeScript("mobile: scroll", $params);
+```
+
+**Swiping**
+
+在 XCUITest 驱动上有一个特别的方法,和 scrolling 类似。(见
+https://developer.apple.com/reference/xctest/xcuielement)。
+
+这个方法的名字和 [Scrolling](#scrolling)的 API 一样,只要用 "mobile: swipe" 替换 "mobile: scroll"。
+
+**滑块的自动化**
+
+
+**iOS**
+
+ * **Java**
+
+```java
+// java
+// 滑动值可以是代表0到1之间数字的字符串
+// 例如,"0.1"代表10%,"1.0"代表100%
+WebElement slider = driver.findElement(By.xpath("//window[1]/slider[1]"));
+slider.sendKeys("0.1");
+```
+
+**Android**
+
+在Android上与滑块交互的最佳方式是使用触摸操作。
+
+本文由 [NativeZhang](https://github.com/NativeZhang) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/uiautomator2.md b/docs/cn/writing-running-appium/uiautomator2.md
new file mode 100644
index 000000000..c5d7cfff0
--- /dev/null
+++ b/docs/cn/writing-running-appium/uiautomator2.md
@@ -0,0 +1,29 @@
+# UIAutomator 2
+
+尽管 API 大部分依然相同,但是内部实现已经改变了。我们来看 UIObject2 的介绍:
+
+### UIObject2
+
+不同于 UiObject,UIElement 被绑定到一个特殊的 view 实例上,并且在底层 view 对象被销毁后变成过期的。因此,如果 UI 发生的显著变化时,可能就必须去调用 findObject(BySelector) 以获得一个新的 UiObject2 实例。
+
+### 构建系统
+
+UIAutomator 2利用了Gradle作为构建系统的能力。之前的UIAutomator使用Maven/Ant。
+
+### 测试产出(Assets)
+
+现在生成的测试包是APK。之前UIAutomator生成.jar或.zip文件。这让 UIAutomator 2 能完整地使用 Android instrumentation 的能力。
+
+### ADB
+
+ADB 对 UIAutomator 2 的处理有轻微的不同。
+
+老版本的 UiAutomator 作为一个 shell 程序运行:
+
+```adb shell uiautomator runtest ...```
+
+UiAutomator 2 是基于 Android Instrumentation 的。测试被编译进APK里,并且在应用进程里运行:
+
+```adb shell am instrument ...```
+
+本文由 [NativeZhang](https://github.com/NativeZhang) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/uiautomator_uiselector.cn.md b/docs/cn/writing-running-appium/uiautomator_uiselector.cn.md
deleted file mode 100644
index 9a12469ba..000000000
--- a/docs/cn/writing-running-appium/uiautomator_uiselector.cn.md
+++ /dev/null
@@ -1,44 +0,0 @@
-## uiautomator UiSelector
-
-Appium可以使用 [UiSelectors](http://developer.android.com/tools/help/uiautomator/UiSelector.html)
-进行元素查找,同时也支持[UiScrollable](http://developer.android.com/tools/help/uiautomator/UiScrollable.html)
-.
-
-注意:根据索引 (index) 进行查找并不可靠,请使用实例 (instance) 代替. 下面的示范是用Ruby语言编写的、针对 api demo (这是一个 appium 测试用的应用) 的实例。
-
-翻译者备注:UiSelectors 和 UiScrollable 均是 Android UiAutomator 中的对象,因此以下用法仅适用于 Android 。
-
-
-找到第一个文本控件 (TextView) 。
-
-```ruby
-# ruby
-first_textview = find_element(:uiautomator, 'new UiSelector().className("android.widget.TextView").instance(0)');
-```
-
-根据文本 (text) 找到第一个元素。
-
-
-```ruby
-# ruby
-first_text = find_element(:uiautomator, 'new UiSelector().text("Animation")')
-first_text.text # "Animation"
-```
-
-找到第一个可滚动的元素, 然后找到文本是 "Tabs" 的文本控件。
-"Tabs" 元素就是将要滚动到的控件。
-
-```ruby
-# ruby
-element = find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).getChildByText(new UiSelector().className("android.widget.TextView"), "Tabs")')
-```
-
-scrollIntoView 是一个特例,会返回滚动到指定控件的元素。
-scrollIntoView 对任何的 UiSelector 都可以执行滚动操作。
-
-```ruby
-# ruby
-element = find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("WebView").instance(0));')
-element.text # "WebView"
-```
-
diff --git a/docs/cn/writing-running-appium/uiautomator_uiselector.md b/docs/cn/writing-running-appium/uiautomator_uiselector.md
new file mode 100644
index 000000000..929ded126
--- /dev/null
+++ b/docs/cn/writing-running-appium/uiautomator_uiselector.md
@@ -0,0 +1,41 @@
+## uiautomator UiSelector
+
+Appium 使用 [UiSelectors](http://developer.android.com/reference/android/support/test/uiautomator/UiSelector.html) 来进行查找。
+同时也支持 [UiScrollable](http://developer.android.com/reference/android/support/test/uiautomator/UiScrollable.html)。
+
+注意,根据索引查找并不可靠,所以更应该使用实例(instance)。后续的示例是使用 Ruby 来测试 api demos apk。
+
+
+查找第一个 textview。
+
+```ruby
+# ruby
+first_textview = find_element(:uiautomator, 'new UiSelector().className("android.widget.TextView").instance(0)');
+```
+
+根据文本查找第一个元素。
+
+```ruby
+# ruby
+first_text = find_element(:uiautomator, 'new UiSelector().text("Animation")')
+first_text.text # "Animation"
+```
+
+查找第一个可滚动(scrollable)的元素,然后根据文本"Tabs"查找第一个 TextView。
+"Tabs"元素将被滚动到可见范围。
+
+```ruby
+# ruby
+element = find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).getChildByText(new UiSelector().className("android.widget.TextView"), "Tabs")')
+```
+
+作为一个特例,scrollIntoView 返回的是被滚动到可见范围的元素。
+scrollIntoView 允许滚动到任意的 UiSelector。
+
+```ruby
+# ruby
+element = find_element(:uiautomator, 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("WebView").instance(0));')
+element.text # "WebView"
+```
+
+本文由 [NativeZhang](https://github.com/NativeZhang) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/unicode.cn.md b/docs/cn/writing-running-appium/unicode.cn.md
deleted file mode 100644
index 5e45ad2fb..000000000
--- a/docs/cn/writing-running-appium/unicode.cn.md
+++ /dev/null
@@ -1,108 +0,0 @@
-## 多语言支持
-
-程序处理非拉丁字符时存在一个的问题:对于带音标的字符,存在多种编码形式。例如,对于`é`这样的字符,有两种编码方式:一种是单独的字符`é`(Unicode中的`LATIN SMALL LETTER E WITH ACUTE`(带有音标的小写的拉丁字母'E')),另一种是音标在字符后边(`COMBINING ACUTE ACCENT`(字符和音标的组合))。为了解决这个问题,存在一个`normalization` (标准化) 方法,让["每个字符都有一个唯一的二进制表示"](http://www.unicode.org/reports/tr15/)。
-
-幸运的是,对ASCII字符(例如 不需要进行标准化的字符)进行标准化将不会产生任何变化,并且多次进行标准化
-操作也不会发生额外的变化。因此,可以对所有字符使用标准化函数而不用担心产生不良影响。
-
-```javascript
-// javascript
-var unorm = require('unorm');
-
-'some ASCII text' === unorm.nfd('some ASCII text');
-unorm.nfd('Adélaïde Hervé') === unorm.nfd(unorm.nfd('Adélaïde Hervé'));
-```
-
-在测试的时候遇到Unicode字符,你需要对字符进行标准化,确保期望的值和接收到的值一致。
-有很多方法可以用来进行标准化,所以你要确保执行的是同样的方法!
-
-```javascript
-// javascript
-var unorm = require('unorm');
-driver
- .elementByAccessibilityId('find')
- .text()
- .then(function (txt) {
- unorm.nfd(txt).should.be(unorm.nfd("é Œ ù ḍ"));
- });
-```
-
-一个由不同unicode文本编码导致的问题的标志是断言失败但报告却显示两个看起来一模一样的字符串:
-
-```shell
-AssertionError: expected 'François Gérard' to deeply equal 'François Gérard'
- + expected - actual
-
- +"François Gérard"
- -"François Gérard"
-```
-
-当发生只因编码导致的问题时,输出_看上去_一样。从标准的角度,它们的编码应该也和它们看上去那样相同。
-
-
-### 查找器 (Finder)
-
-需要被查找的字符也应该需要标准化。比如,你在一个iOS的app上有一个叫做`Найти`的按钮,你也应该在find命令中标准化它。
-
-```javascript
-// javascript
-var unorm = require('unorm');
-driver
- .findElementByXPath(unorm.nfd("//UIAButton[@name='Найти']"))
- .should.eventually.exist;
-```
-
-否则这个按钮可能无法被找到。
-
-
-### 文本框 (Text Field)
-
-默认情况下,iOS和Android的自动化工具都不支持向输入框输入非ASCII字符。
-
-#### iOS
-
-Appium 完全绕过键盘直接向iOS设备的输入框发送非ASCII字符。虽然这让这些文本在测试中被成功输入,但必须记住由键盘输入触发的业务逻辑将不会被测试到。
-
-像上边说的一样,断言收到的文本前应该先标准化它。
-
-```javascript
-// javascript
-var unorm = require('unorm');
-var testText = unorm.nfd("é Œ ù ḍ");
-driver
- .elementsByClassName('UIATextField').at(1)
- .sendKeys(testText)
- .text()
- .should.become(testText)
- .nodeify(done);
-```
-
-#### Android
-
-通过下载并安装一个[特殊键盘](https://github.com/appium/io.appium.android.ime) , Android 可以支持输入 Unicode 字符,这个输入法允许文本通过ASCII在Appium和被测应用之间进行通讯。
-
-为了使用这个功能,将`unicodeKeyboard`设置为`true`。如果想要键盘设置在测试完成后自动回到原始状态,
-将`resetKeyboard`设置为`true`。否则Appium测试结束后,Appium的Unicode键盘仍然会被激活。
-
-翻译备注:这个Unicode键盘并非虚拟键盘,在界面上不会显示出来,所以要进行其他类型的测试必须切换回其他输入法。
-
-测试时可以通过`send_keys`向输入框输入Unicode字符。
-
-```javascript
-// javascript
-var desired = {
- app: '/path/to/app',
- deviceName: 'Android Emulator',
- deviceVersion: '4.4',
- platformName: 'Android',
- unicodeKeyboard: true,
- resetKeyboard: true
-};
-var testText = 'é Œ ù ḍ';
-driver
- .elementByClassName('android.widget.EditText')
- .sendKeys(testText)
- .text()
- .should.eventually.become(testText)
- .nodeify(done);
-```
diff --git a/docs/cn/writing-running-appium/unicode.md b/docs/cn/writing-running-appium/unicode.md
new file mode 100644
index 000000000..7d8f02fb3
--- /dev/null
+++ b/docs/cn/writing-running-appium/unicode.md
@@ -0,0 +1,114 @@
+## 多语言支持
+
+编程语言在处理非拉丁字符时候有一个问题,带重音符号的字符有多种编码方式。比如,
+字母`é`,有两种编码:一个单字符`é`(Unicode的`LATIN SMALL LETTER E WITH ACUTE`
+(带有尖标的小写拉丁字母E))和字母`e`后跟上音标`́`的组合(`COMBINING ACUTE ACCENT`
+(组合尖音标))。为了解决这个问题,就有了`normalization(标准化)`,一种让["相同的字符串有一个唯一的二进制表示"](http://www.unicode.org/reports/tr15/)
+的运算。
+
+幸运的是,对ASCII文本(即不需要再被标准化的文本)进行标准化不会引起任何变化,且执行多次运算也不会有副作用。
+因此,这个标准化函数在文本上调用不会有副作用的风险。
+
+```javascript
+// javascript
+var unorm = require('unorm');
+
+'some ASCII text' === unorm.nfd('some ASCII text');
+unorm.nfd('Adélaïde Hervé') === unorm.nfd(unorm.nfd('Adélaïde Hervé'));
+```
+
+因此,当处理测试中的unicode文本时,你最好对预期的文本和从Appium接收到的文本都进行标准化。
+进行标准化的方式有很多种,所以要确保对两边的字符串执行相同的运算!
+
+```javascript
+// javascript
+var unorm = require('unorm');
+driver
+ .elementByAccessibilityId('find')
+ .text()
+ .then(function (txt) {
+ unorm.nfd(txt).should.be(unorm.nfd("é Œ ù ḍ"));
+ });
+```
+
+问题的端倪是对编码后的unicode文本的断言失败但从报告上看,却是相同的字符串:
+
+```shell
+AssertionError: expected 'François Gérard' to deeply equal 'François Gérard'
+ + expected - actual
+
+ +"François Gérard"
+ -"François Gérard"
+```
+
+由于问题仅仅是编码,输出 _看起来_ 一样。 标准化后,他们在程序里应该像看起来一样是相等的。
+
+
+### 查找器(Finders)
+
+通过文本查找时也可能需要标准化。举例来说,如果你在一个iOS应用里有一个名叫`Найти`的按钮,
+你需要在查找命令里标准化文本。
+
+```javascript
+// javascript
+var unorm = require('unorm');
+driver
+ .findElementByXPath(unorm.nfd("//UIAButton[@name='Найти']"))
+ .should.eventually.exist;
+```
+
+否则这个元素会找不到。
+
+
+### 文本框(Text Fields)
+
+默认情况下,iOS和Android的自动化工具都不支持通过键盘向可编辑的区域输入non-ASCII字符。
+
+#### iOS
+
+Appium完全绕过键盘直接向iOS可编辑区域发送non-ASCII字符。虽然这样在测试中允许了文本的输入,但
+必须记住的是任何通过键盘输入触发的业务逻辑都没有被测试到。
+
+如上所述,接收到的文本在被断言前需要被标准化。
+
+```javascript
+// javascript
+var unorm = require('unorm');
+var testText = unorm.nfd("é Œ ù ḍ");
+driver
+ .elementsByClassName('UIATextField').at(1)
+ .sendKeys(testText)
+ .text()
+ .should.become(testText)
+ .nodeify(done);
+```
+
+#### Android
+
+Android测试通过安装和使用一个[特殊键盘](https://github.com/appium/io.appium.android.ime)
+来允许Unicode输入,它允许将文本像ASCII一样在Appium和被测应用间传递。
+
+为了使用这个功能,将`unicodeKeyboard` desired capability设置为`true`。如果键盘需要被还原成初始状态,
+将`resetKeyboard` desired capability也设置为`true`。不然设备上的Appium的Unicode键盘将会在测试完成后留用。
+
+之后就可以通过使用`send_keys`向可编辑区域传递Unicode文本。
+
+```javascript
+// javascript
+var desired = {
+ app: '/path/to/app',
+ deviceName: 'Android Emulator',
+ deviceVersion: '4.4',
+ platformName: 'Android',
+ unicodeKeyboard: true,
+ resetKeyboard: true
+};
+var testText = 'é Œ ù ḍ';
+driver
+ .elementByClassName('android.widget.EditText')
+ .sendKeys(testText)
+ .text()
+ .should.eventually.become(testText)
+ .nodeify(done);
+```
+本文由 [NativeZhang](https://github.com/NativeZhang) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/cn/writing-running-appium/windows-app-testing.md b/docs/cn/writing-running-appium/windows-app-testing.md
new file mode 100644
index 000000000..9477fed73
--- /dev/null
+++ b/docs/cn/writing-running-appium/windows-app-testing.md
@@ -0,0 +1,67 @@
+# Windows 应用的 UI 测试
+
+在 Appium 中,Windows 应用的 UI 测试是由 [WinAppDriver] (https://github.com/Microsoft/WinAppDriver) 支持的,Appium 在下载安装的时候已经带了这部分。
+
+## Java 示例
+1. 在 Java IDE (比如 IntelliJ)中打开包含示例项目工程的目录,如:[CalculatorTest](https://github.com/Microsoft/WinAppDriver/tree/master/Samples/Java/CalculatorTest)
+2. 在 Java IDE 中 build 并运行这个测试脚本
+
+## C# 示例
+1. 拉取并打开 [CalculatorTest](https://github.com/Microsoft/WinAppDriver/tree/master/Samples/C%23/CalculatorTest) 目录下的文件 `CalculatorTest.sln`
+2. 在 Visual Studio 2015 中打开 test solution,然后 build 这个测试脚本并选择 **Test > Run > All Tests**
+
+## 特性
+Windows Application Driver 支持测试 **Windows 10 PC** 上的**Universal Windows Platform (UWP)** 及 **Classic Windows (Win32)** 应用。
+
+## 创建你的测试脚本
+你可以使用任意一个 Appium 或 Selenium 支持的编程语言来编写测试脚本,在下面的例子中,我们会使用 C# 在 **Microsoft Visual Studio 2015** 编写测试脚本。
+
+## 创建测试项目工程
+1. 打开 **Microsoft Visual Studio 2015**
+2. 创建 test project 和 solution。选择 **New Project > Templates > Visual C# > Test > Unit Test Project**
+3. 创建好之后,打开 **Project > Manage NuGet Packages... > Browse** ,并搜索 **Appium.WebDriver**
+4. 为当前的 test project 安装 **Appium.WebDriver**
+5. 接下来就可以编写测试脚本了(可参考 [samples](https://github.com/appium/sample-code/tree/master/sample-code/examples/C%23/CalculatorTest) 目录下的示例代码)。
+
+## Universal Windows Platform 应用的测试
+你可以使用 Selenium 支持的编程语言来编写脚本来测试 UWP 应用,通过 **app capabilities entry**,可以对测试的 app 找到它的 **Application Id**。下面是一个用 C# 编写的例子,主要是为 Windows 上的 **Alarms & Clock app** 创建一个测试 session:
+
+```c#
+// Launch the AlarmClock app
+DesiredCapabilities appCapabilities = new DesiredCapabilities();
+appCapabilities.SetCapability("app", "Microsoft.WindowsAlarms_8wekyb3d8bbwe!App");
+AlarmClockSession = new IOSDriver(new Uri("http://127.0.0.1:4723"), appCapabilities);
+// Control the AlarmClock app
+AlarmClockSession.FindElementByAccessibilityId("AddAlarmButton").Click();
+AlarmClockSession.FindElementByAccessibilityId("AlarmNameTextBox").Clear();
+```
+在测试自己的应用时,你可以在项目工程下生成的文件 `AppX\vs.appxrecipe` 中找到该应用的 **Application id**,如:```c24c8163-548e-4b84-a466-530178fc0580_scyf5npe3hv32!App```,这个文件位于 RegisteredUserNmodeAppID 节点下。
+
+### Classic Windows 应用的测试
+同样的,你可以使用任意一门 Selenium 支持的编程语言来编写对 Classic Windows 应用的测试脚本,并在 app capabilities entry 中指定该应用的**绝对路径**。下面的例子是对 Windows 系统下的应用 **Notepad** 创建一个测试 session:
+
+```c#
+// Launch Notepad
+DesiredCapabilities appCapabilities = new DesiredCapabilities();
+appCapabilities.SetCapability("app", @"C:\Windows\System32\notepad.exe");
+NotepadSession = new IOSDriver(new Uri("http://127.0.0.1:4723"), appCapabilities);
+// Control the AlarmClock app
+NotepadSession.FindElementByClassName("Edit").SendKeys("This is some text");
+```
+
+### 启动 Session
+注意你需要额外使用下面的这些 capabilities 来确保可以获得 Windows App automation session:
+
+`platformName`: `Windows`
+`deviceName`: `WindowsPC`
+
+### 定位 UI 元素
+**Microsoft Visual Studio 2015** 已经默认包含了 Windows SDK,这些 SDK 提供了足够好的用于对你测试的应用进行分析的工具。这类工具能够让你利用 Windows Application Driver 来查看那些你可以找到的 UI 元素或节点。你可以在 Windows SDK 目录(如`C:\Program Files (x86)\Windows Kits\10\bin\x86`)下找到 **inspect.exe** 这个工具。
+
+| 定位方法 | 匹配属性 |
+|------------------|-------------------|
+| accessibility id | AutomationId |
+| class name | ClassName |
+| name | Name |
+
+本文由 [fishky2](https://github.com/fishky2) 翻译,由 [lihuazhang](https://github.com/lihuazhang) 校验。
\ No newline at end of file
diff --git a/docs/old/cn/README.md b/docs/old/cn/README.md
deleted file mode 100644
index 574ca0a66..000000000
--- a/docs/old/cn/README.md
+++ /dev/null
@@ -1,134 +0,0 @@
-# Appium
-
-> Appium是一个支持原生,混合和移动web apps的开源的跨平台测试框架工具
-
-## [文档网站](http://appium.io/documentation.html?lang=zh)
-
-## 支持平台
-
-* iOS
-* Android
-* FirefoxOS
-
-## 为什么选择appium ?
-
-1. 你不需要以任何方式重新编译或者修改你的app,就可以在所有的平台上使用标准的自动化APIs
-2. 你可以用你喜欢的开发工具使用任何 [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) 兼容的语言来编写测试用例.比如
-Java, [Objective-C](https://github.com/appium/selenium-objective-c),
- JavaScript with Node.js (in both [callback](https://github.com/admc/wd) and [yield-based](https://github.com/jlipps/yiewd) flavours),
- PHP, Python, [Ruby](https://github.com/appium/ruby_lib), C#, Clojure, 或者 Perl
- 可以使用标准的Selenium WebDriver API和特定语言的客户端库.
-3. 你可以使用任何测试框架.
-
-依托 [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) 意味着你可以押宝在一个已经成为事实上标准的独立,自由和开放的协议.而不会被限制在任何的专利中
-
-
-如果在没有使用Appium的情况,你使用了Apple的UIAutomation库就只能通过Javascript,并且只能通过Instruments application插桩应用来运行你的测试.
-同样的,在Google的UiAutomator体系下,你只能用Java写你的测试案例.
-Appium最终开启了跨平台原生移动自动化的可能.
-
-## 依赖
-
-你的环境需要配置好运行测试相关的特定移动平台,下面列出相关的依赖平台
-如果你想通过`npm install`来运行appium, 为Appium研究和贡献力量.你需要[node.js and npm](http://nodejs.org) 0.8 或者更高版本 (`brew install node`).
-
-你可以使用 `appium-doctor` 来验证 Appium 的所有依赖。运行 `appium-doctor`,然后提供 `--ios` 或者 `--android` 参数来验证两个平台的依赖是否配置正确。如果从源代码运行,你可以使用 `bin/appium-doctor.js` 或者 `node bin/appium-doctor.js`
-
-### IOS依赖
-
-* Mac OS X 10.7 or higher, 10.8.4 recommended
-* XCode >= 4.6.3
-* Apple Developer Tools (iPhone simulator SDK, command line tools)
-* [Ensure you read our documentation on setting yourself up for iOS testing!](running-on-osx.cn.md)
-
-### android依赖
-
-* [Android SDK](http://developer.android.com) API >= 17 (Additional features require 18)
-* Appium支持OS X上的Android, Linux和Windows上的beta支持.确保你通过如下的指示来配置你需要运行测试的不同系统的环境
- * [linux](running-on-linux.cn.md)
- * [osx](running-on-osx.cn.md)
- * [windows](running-on-windows.cn.md)
-
-### FirefoxOS Requirements
-
-* [Firefox OS Simulator](https://developer.mozilla.org/en/docs/Tools/Firefox_OS_Simulator)
-
-## 快速开始
-启动Appium server,并运行用你喜欢的 [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) 兼容的语言编写的测试用例.
-你可以用node.js或者下面的应用程序来运行Appium
-
-### 使用Node.js
-
- $ npm install -g appium
- $ appium &
-
-### 使用app
-
-* [下载 Appium app](https://github.com/appium/appium/releases)
-* 运行它!
-
-## 为Appium编写测试
-
-我们支持 [Selenium WebDriver JSON Wire Protocol](https://github.com/appium/appium/wiki/JSON-Wire-Protocol:-Supported-Methods) 的一个子集
-首先还需要指定特定移动平台相关的 [desired capabilities](caps.cn.md) 来通过appium运行你的测试
-
-你可以通过 [WebDriver](https://w3c.github.io/webdriver/webdriver-spec.html) 的元素定位策略的一个子集来定位元素
-更多信息请参考 [finding elements](finding-elements.cn.md)
-
-
-我们也对 JSON Wire Protocol for [automating mobile gestures](gestures.cn.md) 做了一些扩展以支持像 tap, flick, 和 swipe 这样的动作(松开,按压,滑动等手机手势)
-
-你也可以在混合模式下自动化你的用HTML5构建的Web页面 [hybrid app guide](hybrid.cn.md)
-这个代码地址包含了 [很多不同语言的测试例子](/sample-code/examples/node)!
-
-
-想了解全部的Appium的文档页面,请访问 [这个目录](#).
-
-## 工作原理
-
-Appium通过多种原生自动化框架来提供基于Selenium的 [WebDriver JSON wire protocol](https://w3c.github.io/webdriver/webdriver-spec.html) api
-
-Appium驱动Apple的UIAutomation库提供IOS支持. UIAutomation基于[Dan Cuellar's](http://github.com/penguinho)
-
-Android支持上, 在新版本的Android使用了Uiautomator框架,老版本的android上使用了
-[Selendroid](http://github.com/DominikDary/selendroid)
-
-FirefoxOS的支持依赖一个基于Gecko平台并且兼容WebDriver的自动化驱动[Marionette](https://developer.mozilla.org/en-US/docs/Marionette),不过暂不翻译了.因为暂时用不到
-
-
-## 如何贡献代码
-可以看下我们的文档 [contribution documentation](../../CONTRIBUTING.md)
-以了解如何从源代码中进行编译,测试和运行
-
-
-## 其他项目的授权和灵感来源
-
-[Credits](credits.cn.md)
-
-## 邮件列表
-
-声明和公告经常放到讨论组 [Discussion Group](https://groups.google.com/d/forum/appium-discuss), 需要注册
-
-## 问题定位
-
-我们增加了一个 [问题定位指南](troubleshooting.cn.md).
-如果你遇到一些问题,请看下这个问的那个.它包含了一些常见的错误说明,以及在无法解决的情况如何和社区联系
-
-
-## 使用Robots扩展
-可以使用appium的一些robots扩展.或者其他的robots.想了解更多可以看看 [Appium Robots](https://github.com/appium/robots)
-
-
-## 翻译工作
-文档翻译工作由[testerhome](http://testerhome.com/topics/150)在推动, 我们会不断补充更多的文档和测试用例.
-欢迎对Appium感兴趣的同学加入我们, 为开源社区贡献中国人的力量.
-
-## 贡献者
-来自 testerhome 的:
-
-* seveniruby
-* monkey
-* lihuazhang
-* FredZero
-* pinghailinfeng
-* niweyzhuce
diff --git a/docs/old/cn/android-hax-emulator.cn.md b/docs/old/cn/android-hax-emulator.cn.md
deleted file mode 100644
index ceeccee5a..000000000
--- a/docs/old/cn/android-hax-emulator.cn.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Intel® 硬件加速器管理
-
-如果你发现android虚拟机太慢, 并且你的系统运行在Intel® 的cpu上. 那么你可以尝试下HAXM, HAXM能够让你充分利用硬件虚拟化技术来加速android模拟器
-
-* 要安装HAXM, 你可以打开Android SDK Manager, 你可以在Extras中发现这个安装选项
-
-* 你可以在[Inter官方网站][1]找到所有相关的文档
-* 这将需要x86的模拟镜像
-
-[1]: http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager/ "Hax"
-[2]: http://software.intel.com/en-us/search/site/language/en?query=Intel%20Hardware%20Accelerated%20Execution%20Manager%20%28HAXM%29 "Hax all"
diff --git a/docs/old/cn/android_coverage.cn.md b/docs/old/cn/android_coverage.cn.md
deleted file mode 100644
index c58a316b0..000000000
--- a/docs/old/cn/android_coverage.cn.md
+++ /dev/null
@@ -1,107 +0,0 @@
-# Android Coverage
-
-Android 覆盖率需要使用模拟器或者 root 过的机器。使用 instrument target 构建应用,比如 `$ ant instrument`
-
-将 `androidCoverage` 传给你设备的 capabilities,并设置为你的 instrument 的 class。
-比如
-
-```ruby
-caps = { androidCoverage: 'com.example.pkg/com.example.pkg.instrumentation.MyInstrumentation' }
-```
-
-Appium 会用类似的命令启动应用:`adb shell am instrument -e coverage true -w com.example.pkg/com.example.pkg.instrumentation.MyInstrumentation`
-
-当你的测试完成时,我们就可以结束覆盖率收集,然后将 coverage.ec 文件从设备里取出来。
-
-```ruby
-mobile :endCoverage, intent: 'com.example.pkg.END_EMMA', path: '/mnt/sdcard/coverage.ec'
-```
-
-在 `AndroidManifest.xml` 里定义 instrumentation 和 broadcast 接收器。
-
-```xml
-
-
-
-
-
-
-
-
-
-```
-
-再定义 `EndEmmaBroadcast.java` :
-
-```java
-package com.example.pkg.instrumentation;
-
-import java.io.File;
-
-import android.annotation.SuppressLint;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Process;
-import android.util.Log;
-
-// adb shell am broadcast -a com.example.pkg.END_EMMA
-@SuppressLint("SdCardPath")
-public class EndEmmaBroadcast extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.d("AppiumEmma", "EndEmmaBroadcast broadcast received!");
- // reflection is used so emma doesn't cause problems for other build targets
- // that do not include emma.
- try {
- Class.forName("com.vladium.emma.rt.RT")
- .getMethod("dumpCoverageData", File.class, boolean.class, boolean.class)
- .invoke(null, new File("/mnt/sdcard/coverage.ec"), false, false);
- } catch (Exception e) {
- Log.d("AppiumEmma", e.toString());
- }
-
- // once coverage is dumped, the processes is ended.
- Process.killProcess(Process.myPid());
- }
-}
-```
-
-定义 `MyInstrumentation.java`:
-
-```java
-package com.example.pkg.instrumentation;
-
-import android.app.Instrumentation;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.support.v4.content.LocalBroadcastManager;
-
-public class MyInstrumentation extends Instrumentation {
- private Intent intent;
-
- @Override
- public void onCreate(Bundle arguments) {
- intent = getTargetContext().getPackageManager()
- .getLaunchIntentForPackage("com.example.pkg")
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- start(); // creates new thread which invokes onStart
- }
-
- @Override
- public void onStart() {
- startActivitySync(intent);
- LocalBroadcastManager.getInstance(getTargetContext()).registerReceiver(
- new EndEmmaBroadcast(), new IntentFilter("com.example.pkg.END_EMMA"));
- }
-}
-```
-
-### 报表
-
-`ant instrument` 命令会生成一个 `coverage.em` 文件。你可以使用 `mobile :endCoverage` 命令来可以下载 某次运行的 coverage.ec 文件。 注意:你可以有很多个 coverage.ec 文件。你可以用下面的命令将他们合并起来:
-
-> java -cp /path/to/android-sdk-macosx/tools/lib/emma_device.jar emma report -r html -in coverage.em,coverage0.ec,coverage1.ec -sp /path/to/your-app/src
diff --git a/docs/old/cn/appium-bindings.cn.md b/docs/old/cn/appium-bindings.cn.md
deleted file mode 100644
index ca9b9bfcf..000000000
--- a/docs/old/cn/appium-bindings.cn.md
+++ /dev/null
@@ -1,764 +0,0 @@
-# Appium 客户端库
-
-Appium 有以下语言的库:
-
-语言 | 代码
- :--|--:
-[Ruby][rubygems] | [GitHub](https://github.com/appium/ruby_lib)
-[Python][pypi] | [GitHub](https://github.com/appium/python-client)
-[Java][maven] | [GitHub](https://github.com/appium/java-client)
-[JavaScript][npm] | [GitHub](https://github.com/admc/wd)
-[PHP][php] | [GitHub](https://github.com/appium/php-client)
-[C#][nuget] | [GitHub](https://github.com/appium/appium-dotnet-driver)
-
-[rubygems]: http://rubygems.org/gems/appium_lib
-[pypi]: https://pypi.python.org/pypi/Appium-Python-Client
-[maven]: https://search.maven.org/#search%7Cga%7C1%7Cg%3Aio.appium%20a%3Ajava-client
-[npm]: https://www.npmjs.org/package/wd
-[php]: https://github.com/appium/php-client
-[nuget]: http://www.nuget.org/packages/Appium.WebDriver/
-
-注意有些方法,比如 `endTestCoverage()` 和 `complexFind()` 目前还没有什么用。
-只有[这个问题](https://github.com/appium/appium/issues/2448)修复, 完整的覆盖率支持才会添加。
-一旦[这个问题](https://github.com/appium/appium/issues/2264)修复,`complexFind()` 将被移除。
-如果你一定想要用这些方法,请查看相应的文档。
-
-## 锁定
-
-锁定屏幕
-
-
-
-```ruby
-# ruby
-lock 5
-```
-
-```python
-# python
-driver.lock(5)
-```
-
-```java
-// java
-driver.lockScreen(3);
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.LockDevice(3);
-```
-
-## 将 app 置于后台
-
-把当前应用放到后台去
-
-```ruby
-# ruby
-background_app 5
-```
-
-```python
-# python
-driver.background_app(5)
-```
-
-```java
-// java
-driver.runAppInBackground(5);
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.BackgroundApp(5);
-```
-
-## 收起键盘(iOS only)
-
-在 iOS 上收起键盘
-
-```ruby
-# ruby
-hide_keyboard
-```
-
-```python
-# python
-driver.hide_keyboard()
-```
-
-```java
-// java
-driver.hideKeyboard();
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.HideKeyboard("Done");
-```
-
-## 是否已经安装
-
-检查应用是否已经安装
-
-```ruby
-# ruby
-is_installed? "com.example.android.apis"
-```
-
-```python
-# python
-driver.is_app_installed('com.example.android.apis')
-```
-
-```java
-// java
-driver.isAppInstalled("com.example.android.apis")
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.IsAppInstalled("com.example.android.apis-");
-```
-
-## 安装应用
-
-安装应用到设备中去
-
-```ruby
-# ruby
-install 'path/to/my.apk'
-```
-
-```python
-# python
-driver.install_app('path/to/my.apk')
-```
-
-```java
-// java
-driver.installApp("path/to/my.apk")
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-//csharp
-driver.InstallApp("path/to/my.apk");
-```
-
-## 删除应用
-
-从设备中删除一个应用
-
-```ruby
-# ruby
-remove 'com.example.android.apis'
-```
-
-```python
-# python
-driver.remove_app('com.example.android.apis')
-```
-
-```java
-// java
-driver.removeApp("com.example.android.apis")
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.RemoveApp("com.example.android.apis");
-```
-
-## 摇晃
-
-模拟设备摇晃
-
-```ruby
-# ruby
-shake
-```
-
-```python
-# python
-driver.shake()
-```
-
-```java
-// java
-driver.shake()
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.ShakeDevice();
-```
-
-## 关闭应用
-
-关闭应用
-
-```ruby
-# ruby
-close_app
-```
-
-```python
-# python
-driver.close_app();
-```
-
-```java
-// java
-driver.closeApp()
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.CloseApp();
-```
-
-## 启动
-
-启动应用
-
-```ruby
-# ruby
-launch
-```
-
-```python
-# python
-driver.launch_app()
-```
-
-```java
-// java
-driver.launchApp()
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.LaunchApp();
-```
-
-## 重置
-
-应用重置
-
-```ruby
-# ruby
-reset
-```
-
-```python
-# python
-driver.reset()
-```
-
-```java
-// java
-driver.resetApp()
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.ResetApp();
-```
-
-## 可用上下文
-
-列出所有的可用上下文
-
-```ruby
-# ruby
-context_array = available_contexts
-```
-
-```python
-# python
-driver.contexts
-```
-
-```java
-// java
-driver.getContextHandles()
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.GetContexts()
-```
-
-## 当前上下文
-
-列出当前上下文
-
-```ruby
-# ruby
-context = current_context
-```
-
-```python
-# python
-driver.current_context
-```
-
-```java
-// java
-driver.getContext()
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.GetContext()
-```
-
-## 切换到默认的上下文
-
-将上下文切换到默认上下文
-
-```ruby
-# ruby
-switch_to_default_context
-```
-
-```python
-# python
-driver.switch_to.context(None)
-```
-
-```java
-// java
-driver.context();
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.SetContext();
-```
-
-## 应用的字符串
-
-iOS 里是 Localizable.strings
-Android 里是 strings.xml
-
-
-```ruby
-# ruby
-strings = app_strings
-```
-
-```python
-# python
-driver.app_strings
-```
-
-```java
-// java
-driver.getAppString();
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.GetAppStrings();
-```
-
-## 按键事件
-
-发送一个按键事件给设备
-
-```ruby
-# ruby
-key_event 176
-```
-
-```python
-# python
-driver.keyevent(176)
-```
-
-```java
-// java
-driver.sendKeyEvent(AndroidKeyCode.HOME);
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.KeyEvent("176");
-```
-
-## 当前 Activity
-
-Android only
-得到当前 activity。
-
-```ruby
-# ruby
-current_activity
-```
-
-```python
-# python
-driver.current_activity
-```
-
-```java
-// java
-driver.currentActivity();
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.GetCurrentActivity();
-```
-
-## 触摸动作 / 多点触摸动作
-
-An API for generating touch actions. This section of the documentation will be
-expanded upon soon.
-
-生成触摸动作的接口。这部分文档很快将会补充更多的内容进来。
-
-```ruby
-# ruby
-touch_action = Appium::TouchAction.new
-element = find_element :name, 'Buttons, Various uses of UIButton'
-touch_action.press(element: element, x: 10, y: 10).perform
-```
-
-```python
-# python
-action = TouchAction(driver)
-action.press(element=el, x=10, y=10).release().perform()
-```
-
-```java
-// java
-TouchAction action = new TouchAction(driver)
-.press(mapview, 10, 10)
-.release().
-perform();
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-var touchAction1 = new TouchActions(this);
-touchAction1.Down(10, 10).Up(10, 10);
-
-var multiTouchAction = new MultiTouchAction(this);
-multiTouchAction.Add(touchAction1);
-
-PerformMultiTouchAction(multiTouchAction);
-```
-
-## 滑动
-
-模拟用户滑动
-
-```ruby
-# ruby
-swipe start_x: 75, start_y: 500, end_x: 75, end_y: 0, duration: 0.8
-```
-
-```python
-# python
-driver.swipe(75, 500, 75, 0, 0.8)
-```
-
-```java
-// java
-driver.swipe(startx=75, starty=500, endx=75, endy=0, duration=800)
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-todo: c#
-```
-
-## Pinch
-
-Places two fingers at the edges of the screen and brings them together.
-在 0% 到 100% 内双指缩放屏幕,
-
-```ruby
-# ruby
-pinch 75
-```
-
-```python
-# python
-driver.pinch(element=el)
-```
-
-```java
-// java
-driver.pinch(element);
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.Pinch(25, 25)
-```
-
-## Zoom
-
-放大屏幕
-在 100% 以上放大屏幕
-
-```ruby
-# ruby
-zoom 200
-```
-
-```python
-# python
-driver.zoom(element=el)
-```
-
-```java
-// java
-driver.zoom(element);
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-# csharp
-driver.Zoom(100, 200);
-```
-
-## 拉出文件
-
-从设备中拉出文件
-
-```ruby
-# ruby
-pull_file 'Library/AddressBook/AddressBook.sqlitedb'
-```
-
-```python
-// python
-driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')
-```
-
-```java
-// java
-driver.pullFile("Library/AddressBook/AddressBook.sqlitedb");
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.PullFile("Library/AddressBook/AddressBook.sqlitedb");
-```
-
-## 推送文件
-
-推送文件到设备中去
-
-```ruby
-# ruby
-data = "some data for the file"
-path = "/data/local/tmp/file.txt"
-push_file path, data
-```
-
-```python
-# python
-data = "some data for the file"
-path = "/data/local/tmp/file.txt"
-driver.push_file(path, data.encode('base64'))
-```
-
-```java
-// java
-byte[] data = Base64.encodeBase64("some data for the file".getBytes());
-String path = "/data/local/tmp/file.txt";
-driver.pushFile(path, data)
-```
-
-```javascript
-todo: javascript
-```
-
-```php
-todo: php
-```
-
-```csharp
-// csharp
-driver.PushFile("/data/local/tmp/file.txt", "some data for the file");
-```
-
-## Appium 桌面应用
-
-Appium 的桌面应用支持 OS X 和 Windows.
-
-- [Appium.app for OS X][bitbucket]
-- [Appium.exe for Windows][bitbucket]
-
-[bitbucket]: https://bitbucket.org/appium/appium.app/downloads/
diff --git a/docs/old/cn/appium-clients.cn.md b/docs/old/cn/appium-clients.cn.md
deleted file mode 100644
index e49303ac5..000000000
--- a/docs/old/cn/appium-clients.cn.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# 列出 Appium 服务器支持的客户端库
-
-* [https://github.com/appium/ruby_lib](https://github.com/appium/ruby_lib) - Ruby
-* [https://github.com/appium/python-client](https://github.com/appium/python-client) - Python
-* [https://github.com/appium/java-client](https://github.com/appium/java-client) - Java
-* [https://github.com/admc/wd](https://github.com/admc/wd) - JavaScript (Node.js)
-* [https://github.com/appium/php-client](https://github.com/appium/php-client) - PHP
-* [https://github.com/appium/appium-dotnet-driver](https://github.com/appium/appium-dotnet-driver) - C# (.NET)
-
-安装教程请参见各自库的文档。
diff --git a/docs/old/cn/caps.cn.md b/docs/old/cn/caps.cn.md
deleted file mode 100644
index 4bd6bf485..000000000
--- a/docs/old/cn/caps.cn.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Appium 服务关键字
-
-
-
-|关键字|描述|实例|
-|----|-----------|-------|
-|`app`|`.ipa` or `.apk`文件所在的本地绝对路径或者远程路径,也可以是一个包括两者的`.zip`. Appium会先尝试安装路径对应的应用在适当的真机或模拟器上.也可以是一个`chrome`或者`chromium`,这样就会在android系统中其中chrome或chromium,也可以是`safari`会启动ios上的safari. 针对Android系统,如果你指定`app-package`和`app-activity`(具体见下面)的话,那么就可以不指定`app`.|比如`/abs/path/to/my.apk`或`http://myapp.com/app.ipa`, Android上的`chrome`, `chromium`, iOS的`safari`|
-|`browserName`|考虑到Selenium的兼容性,必须要使用`''`;要启动的浏览器的名称|比如`chrome`和`safari`|
-|`device`|要使用的模拟器或真机的类型名称|比如`ios`, `selendroid`, `firefoxos`, `mock_ios`, `android` |
-|`version`|Android API版本, iOS版本, Chrome/Safari版本|(Android)4.2/4.3(ios) 6.0/6.1/7.0|
-|`newCommandTimeout`|设置在接受到有效命令之前结束进程并退出的时间|比如. `60`|
-|`launch`|在Appium已经安装的情况下可自动启动app。默认是`true`|`true`, `false`|
-
-### Android特有
-
-
-
-|关键字|描述|实例|
-|----|-----------|-------|
-|`app-activity`| 你要启动的Android 应用对应的Activity名称|比如`MainActivity`, `.Settings`|
-|`app-package`| 你想运行的Android应用的包名|比如`com.example.android.myApp`, `com.android.settings`|
-|`app-wait-activity`| 你想要等待启动的Android Activity名称|比如`SplashActivity`|
-|`device-ready-timeout`| 设置一个模拟器或真机准备就绪的时间|比如`5`|
-
-### iOS特有
-
-
-
-|关键字|描述|实例|
-|----|-----------|-------|
-|`calendarFormat`| 为iOS的模拟器设置日历格式|比如. `gregorian`公历|
-|`deviceName`| iOS Simulator 的设备名|比如. `iPhone Retina (3.5-inch)`|
-|`language`| 为iOS的模拟器设置系统语言|比如. `fr`法语|
-|`launchTimeout`| 在Appium运行失败之前设置一个等待instruments的时间|比如. `20000`毫秒|
-|`locale`| 为iOS模拟器进行区域设置|比如. `fr_CA`法语|
\ No newline at end of file
diff --git a/docs/old/cn/credits.cn.md b/docs/old/cn/credits.cn.md
deleted file mode 100644
index 8fed57996..000000000
--- a/docs/old/cn/credits.cn.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# 名单
-
-### 以下这些项目,鼓舞了我们,成就了 Appium。
-
-* [Apple UIAutomation](http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html)
-* [GhostDriver](https://github.com/detro/ghostdriver)
-* [IOS Auto](https://github.com/penguinho/applecart)
-* [IOS Driver](https://github.com/ios-driver/ios-driver)
-* [Mechanic.js](https://github.com/jaykz52/mechanic)
-* [node-webkit](https://github.com/rogerwang/node-webkit)
-* [Remote Debug](https://github.com/leftlogic/remote-debug)
-* [Selenium Project](http://code.google.com/p/selenium/)
-* [ios-webkit-debug-proxy](https://github.com/google/ios-webkit-debug-proxy)
diff --git a/docs/old/cn/finding-elements.cn.md b/docs/old/cn/finding-elements.cn.md
deleted file mode 100644
index 6ea45d60c..000000000
--- a/docs/old/cn/finding-elements.cn.md
+++ /dev/null
@@ -1,162 +0,0 @@
-# 元素定位与交互
-
-Appium支持一个Webdriver元素定位方法的子集
-
-* find by "tag name" (i.e., 通过UI的控件类型)
-* find by "name" (i.e., 通过元素的文本, 标签, 或者开发同学添加的id标示, 比如accessibilityIdentifier)
-* find by "xpath" (i.e., 具有一定约束的路径抽象标示, 基于XPath方式)
-
-###标签名抽象映射
-
-你可以使用UIAutomation的控件类型用于标签名, 或者使用简化的映射, 可以参考下如下例子
-https://github.com/appium/appium/blob/master/lib/uiauto/lib/mechanic.js#L29
-
-(官方文档外的补充)
-对于Android下的元素对应, 可以参考
-https://github.com/appium/appium/blob/master/lib/devices/android/bootstrap/src/io/appium/android/bootstrap/AndroidElementClassMap.java
-
-## 例子
-
-### 找到屏幕上所有的UIAButtons
-
-WD.js:
-
-```js
-driver.elementsByTagName('button', function(err, buttons) {
- // tap all the buttons
- var tapNextButton = function() {
- var button = buttons.shift();
- if (typeof button !== "undefined") {
- button.click(function(err) {
- tapNextButton();
- })
- } else {
- driver.quit();
- }
- }
- tapNextButton();
-});
-```
-
-Ruby:
-
-```ruby
-buttons = @driver.find_elements :tag_name, :button
-buttons.each { |b| b.click }
-```
-
-Python:
-
-```python
-[button.click() for button in driver.find_elements_by_tag_name('button')]
-```
-
-### 找到所有文本内容(或者accessibilityIdentifier)为"Go"的元素
-
-WD.js:
-
-```js
-driver.elementByName('Go', function(err, el) {
- el.tap(function(err) {
- driver.quit();
- });
-});
-```
-
-Ruby:
-
-```ruby
-@driver.find_element(:name, 'Go').click
-```
-
-Python:
-
-```python
-driver.find_element_by_name('Go').click()
-```
-
-### 找到以"Hi, "开头的导航条元素
-
-WD.js:
-
-```js
-driver.elementByXpath('//navigationBar/text[contains(@value, "Hi, ")]', function(err, el) {
- el.text(function(err, text) {
- console.log(text);
- driver.quit();
- });
-});
-```
-
-Ruby:
-
-```ruby
-@driver.find_element :xpath, '//navigationBar/text[contains(@value, "Hi, ")]'
-```
-
-### 通过tagName查找元素
-
-Java:
-
-```java
-driver.findElement(By.tagName("button")).sendKeys("Hi");
-
-WebELement element = findElement(By.tagName("button"));
-element.sendKeys("Hi");
-
-List elems = findElements(By.tagName("button"));
-elems.get(0).sendKeys("Hi");
-```
-
-Python:
-
-```python
-driver.find_elements_by_tag_name('tableCell')[5].click()
-```
-
-## FindAndAct
-
-你也可以通过一行命令来完成元素的查找和交互(只适用于IOS)
-举个例子, 你可以通过一次调用来实现查找一个元素并点击它, 使用的命令是`mobile: findAndAct`
-
-Python:
-
-```python
-args = {'strategy': 'tag_name', 'selector': 'button', 'action': 'tap'}
-driver.execute_script("mobile: findAndAct", args)
-```
-
-### 用一个滑动手势进行下拉刷新
-
-Python:
-
-```python
-js_snippet = "mobile: swipe"
-args = {'startX':0.5, 'startY':0.2, 'startX':0.5, 'startY':0.95, 'tapCount':1, 'duration':10}
-driver.execute_script(js_snippet, args)
-```
-
-备注: driver.execute_script() 可以在 [Automating Mobile Gestures: Alternative access method](https://github.com/appium/appium/wiki/Automating-mobile-gestures)) 找到说明
-
-## 使用Appium Inspector来定位元素
-
-(翻译备注: 这个工具目前只有Mac版本, 如果你使用的是windows, 可以使用android自带的traceview工具来获得元素的位置)
-
-Appium提供了一个灵活的工具Appium Inspector, 允许你在app运行的时候, 直接定位你正在关注的元素. 通过Appium Inspector(靠近start test按钮的i标示文本), 你可以通过点击预览窗口上的控件来获得它的name属性, 或者直接在UI导航窗口中定位
-
-### 概述
-
-Appium Inspector有一个简单的布局, 全部由如下窗口组成.
-UI导航器, 预览, 录制与刷新按钮, 和交互工具
-
-
-
-### 例子
-
-启动Appium Inspector后, (通过点击app右上的小"i"按钮), 你可以定位任何预览窗口中的元素. 作为测试, 我正在查找id为"show alert"的按钮
-
-
-
-要找到这个按钮的id, 在定位预览窗口中我点击了"show alert"按钮, Appium Inspector在UI导航窗口中高亮显示了这个元素, 然后展示了刚被点击按钮的id和元素类型
-
-
\ No newline at end of file
diff --git a/docs/old/cn/grid.cn.md b/docs/old/cn/grid.cn.md
deleted file mode 100644
index 4c6c4d4c5..000000000
--- a/docs/old/cn/grid.cn.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Selenium Grid
-
-使用 "--nodeconfig" 服务器参数,你可以在本地 selenium grid 里注册你的 appium 服务器。
-
-```bash
-> node . -V --nodeconfig /path/to/nodeconfig.json
-```
-
-在 node 的配置文件里,你需要定义 "browserName","version" 和 "platform"。
-基于这些参数,selenium grid 会将你的测试定向到正确的设备上去。你还需要配置你的 host 详细信息和
-selenium grid 的详细信息。你可以在 这里 找到详细的参数列表和描述信息。
-
-一旦你启动了 appium 服务器并且在 grid 里注册了信息,你会在 grid 控制台发现你的设备:
-
-"http://\ :\ /grid/console"
-
-## Grid 配置文件例子
-
-```xml
-{
- "capabilities":
- [
- {
- "browserName": "",
- "version":"",
- "maxInstances": 1,
- "platform":""
- }
- ],
- "configuration":
- {
- "cleanUpCycle":2000,
- "timeout":30000,
- "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
- "url":"http://:/wd/hub",
- "maxSession": 1,
- "register": true,
- "registerCycle": 5000,
- "hubPort": ,
- "hubHost": ""
- }
-}
-```
-
-可以在 这里查看有效的 platform 参数。
diff --git a/docs/old/cn/grunt.cn.md b/docs/old/cn/grunt.cn.md
deleted file mode 100644
index edac9ee49..000000000
--- a/docs/old/cn/grunt.cn.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Appium grunt 命令
-
-[Grunt](http://gruntjs.com) 是 Node.js 的 Make! 我们用它来自动化所有的 appium 开发任务。 下面就是你能做的:
-
-|任务|描述|
-|----|-----------|
-|grunt lint|运行 JSLint|
-|grunt test|运行所有的测试|
-|grunt functional|运行整个功能测试集|
-|grunt ios|运行 iOS 功能测试集|
-|grunt android|运行 Android 功能测试集|
-|grunt selendroid|运行 selendroid 功能测试集|
-|grunt firefoxos|运行 firefoxos 功能测试集|
-|grunt unit|运行所有的单元测试|
-|grunt buildApp:<AppName>:<SDK>|构建一个用于 iPhone 模拟器的 iOS 应用。 我们预计这个应用的路径是 `sample-code/apps//build/Release-iphonesimulator/.app`. 默认的 SDK 是 'iphonesimulator6.0'|
-|grunt signApp:<certName>|使用开发证书的绝对路径,签名测试应用。|
-|grunt authorize|授权模拟器,使它不需要弹框请求权限。|
-|grunt log|打印 appium.log (运行测试的时候很有用)|
-|grunt configAndroidBootstrap|配置使用 ant 构建 Android 的 bootstrap.jar|
-|grunt buildAndroidBootstrap|使用 ant 构建 bootstrap.jar|
-|grunt buildSelendroidServer|构建 selendroid 服务器|
-|grunt configAndroidApp:<AppName>|配置使用 ant 构建 android 测试应用。 我们期待有一个 `sample-code/apps/` 的 Android 项目|
-|grunt buildAndroidApp:<AppName>|使用 ant 构建项目. 会在 `sample-code/apps/` 下生成应用。|
-|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
diff --git a/docs/old/cn/how-to-write-docs.cn.md b/docs/old/cn/how-to-write-docs.cn.md
deleted file mode 100644
index 0c04ca43c..000000000
--- a/docs/old/cn/how-to-write-docs.cn.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# 如何写文档
-
-`#` 用于第一级标题。每个文档必须以第一级标题开头。
-不要使用 `===` 底线方法来创建标题。
-
-## 第二级标题
-
-`##` 用于第二级标题。 不要使用 `---` 底线方法来创建第二级标题标题。
-
-### 普通标题
-
-`###` 用于不会出现在目录中的标题。
-不要使用第四级标题 `####`, 第五级标题 `#####`, 或者第六级标题 `######`。
-
-### 分隔线
-
-不要使用分隔线例如 `--` 或者 `---`。 这会使 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` )。
diff --git a/docs/old/cn/hybrid.cn.md b/docs/old/cn/hybrid.cn.md
deleted file mode 100644
index f824a0647..000000000
--- a/docs/old/cn/hybrid.cn.md
+++ /dev/null
@@ -1,202 +0,0 @@
-# 自动化混合应用
-
-Appium 其中一个理念就是你不能为了测试应用而修改应用。为了符合这个方法学,我们可以使用 Selenium 测试传统 web 应用的方法来测试混合 web 应用 (比如,iOS 应用里的元素 "UIWebView" ),这是有可能的。这里会有一些技术性的复杂,Appium 需要知道你是想测试原生部分呢还是web部分。幸运的是,我们还能遵守 WebDriver 的协议。
-
-* [混合 iOS 应用](hybrid.cn.md)
-* [混合 Android 应用](hybrid.cn.md)
-
-## 自动化混合 iOS 应用
-
-在你的 Appium 测试里,你需要以下几步来和 web 页面交涉:
-
-1. 前往到应用里 web 视图激活的部分。
-1. 调用 [GET session/:sessionId/window_handles](http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/window_handles)
-1. 这会返回一个我们能访问的 web 视图的 id 的列表。
-1. 使用你想访问的这个 web 视图的 id 作为参数,调用 [POST session/:sessionId/window](http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/window)
-1. (这会将你的 Appium session 放入一个模式, 在这个模式下,所有的命令都会被解释成自动化web视图而不是原生的部分。比如,当你运行 getElementByTagName,它会在 web 视图的 DOM 上操作,而不是返回 UIAElements。当然,一个 Webdriver 的方法只能在一个上下文中有意义,所以如果在错误的上下文,你会收到错误信息。)
-1. 如果你想停止 web 视图的自动化,回到原生部分,你可以简单地使用 `execute_script` 调用 `"mobile: leaveWebView"` 方法来离开 web 层。
-
-## 在 iOS 真机上运行
-
-appium 使用一个远程调试器建立连接来实现和 web 视图的交互。当在模拟器上执行下面例子的时候,我们可以直接建立连接,因为模拟器和 appium 服务器在同一台机器上。
-
-当在真机上运行用例时,appium 无法直接访问 web 视图,所以我们需要通过 USB 线缆来建立连接。我们使用 [ios-webkit-debugger-proxy](https://github.com/google/ios-webkit-debug-proxy)建立连接。
-
-使用 brew 安装最新的 ios-webkit-debug-proxy。在终端运行一下命令:
-
-``` bash
-# 如果你没有安装 brew 的话,先安装 brew。
-> ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
-> brew update
-> brew install ios-webkit-debug-proxy
-```
-
-你也可以通过 git 克隆项目来自己安装最新版本:
-
-``` bash
-# Please be aware that this will install the proxy with the latest code (and not a tagged version).
-> git clone https://github.com/google/ios-webkit-debug-proxy.git
-> cd ios-webkit-debug-proxy
-> ./autogen.sh
-> ./configure
-> make
-> sudo make install
-```
-
-一旦安装好了, 你就可以启动代理:
-
-``` bash
-# 将udid替换成你的设备的udid。确保端口 27753 没有被占用
-# remote-debugger 将会使用这个端口。
-> ios_webkit_debug_proxy -c 0e4b2f612b65e98c1d07d22ee08678130d345429:27753 -d
-```
-
-注意: 这个 ios-webkit-debug-proxy 需要 "web inspector" 打开着以便建立连接。在 settings > safari > advanced 里打开它。请注意 web inspector 在 iOS6 时候加入的 以前的版本没有。
-
-## Wd.js Code example
-
-```js
- // 假设我们已经有一个初始化好了的 `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(); // 退出。
- });
- });
- });
- });
- });
- });
- });
-```
-
-* 想看到具体的上下文,请看[该node 的例子](/sample-code/examples/node/hybrid.js)
-* *我们正在完善 web 视图下面的方法。[加入我们!](http://appium.io/get-involved.html)
-
-## Wd.java 代码例子
-
-```java
- //配置 webdriver 并启动 webview 应用。
- DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
- desiredCapabilities.setCapability("device", "iPhone Simulator");
- desiredCapabilities.setCapability("app", "http://appium.s3.amazonaws.com/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 的例子
-
-```ruby
-TEST_NAME = "Example Ruby Test"
-SERVER_URL = "http://127.0.0.1:4723/wd/hub"
-APP_PATH = "https://dl.dropboxusercontent.com/s/123456789101112/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)
-end
-
-Given(/^I switch out of webview$/) do
- @driver.execute_script("mobile: leaveWebView")
-end
-
-# 你可以使用 CSS 选择器在你的 webview 里来选择元素
-
-And(/^I click a webview button $/) do
- @driver.find_element(:css, ".green_button").click
-end
-```
-### 用 ruby 调试 web 视图:
-我在我的帮助类里创建了一个快速方法来定位web元素,无论它在哪一个窗口视图。
-(这非常有帮助,特别是你的 webview 的 id 变化或者你用同一份代码来测试 Android 和 iOS。)
-https://gist.github.com/feelobot/7309729
-
-## 自动化混合 Android 应用
-
-Appium 通过 Chromedriver 内建混合应用支持。Appium 也可以使用 Selendroid 做为 4.4 之前的设备对 webview 支持的背部引擎。(你需要在 desired capability 里指定 `"device": "selendroid"`)。然后:
-
-1. 前往你应用里 web 视图激活的部分。
-1. 用 "WEBVIEW" 做窗口句柄调用 [POST session/:sessionId/window](http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/window) , 比如 `driver.window("WEBVIEW")`。
-1. (这会将你的 Appium session 放入一个模式, 在这个模式下,所有的命令都会被解释成自动化web视图而不是原生的部分。比如,当你运行 getElementByTagName,它会在 web 视图的 DOM 上操作,而不是返回 UIAElements。当然,一个 Webdriver 的方法只能在一个上下文中有意义,所以如果在错误的上下文,你会收到错误信息。)
-1. 如果要停止web上下文里的自动化,回到原生部分的自动化,简单地使用 "NATIVE_APP" 调用 `window` 方法。比如 `driver.window("NATIVE_APP")`。
-
-注意:我们可以像上面说的,使用同样的策略。然而,Selendroid 使用 `WEBVIEW`/`NATIVE_APP` 窗口设置策略。 Appium 常规的混合支持也使用这种策略。
-
-## Wd.js 代码例子
-
-```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 代码例子
-
-```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();
-```
diff --git a/docs/old/cn/intro.cn.md b/docs/old/cn/intro.cn.md
deleted file mode 100644
index 1fccdc7ca..000000000
--- a/docs/old/cn/intro.cn.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Appium 介绍
-
-Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用。
-
-所谓的“移动原生应用”是指那些用 iOS 或者 Android SDK 写的应用。
-所谓的“移动 web 应用”是指使用移动浏览器访问的应用(Appium 支持 iOS 上的 Safari 和 Android 上的 Chrome)。
-所谓的“混合应用”是指原生代码封装网页视图 —— 原生代码和 web 内容交互。
-比如,像 [Phonegap](http://phonegap.com/),可以帮助开发者使用网页技术写应用,然后用原生代码封装,这些就是混合应用。
-
-重要的是,Appium 是一个跨平台的工具:它允许测试人员使用同样的接口,基于不同的平台(iOS, Android)写自动化测试脚本。
-这样大大增加了 iOS 和 Android 测试套件间代码的复用性。
-
-想知道 Appium 如何支持平台,版本和自动化形态的详细信息,请参见[platform support doc](platform-support.cn.md).
-
-## Appium 的理念
-
-为了满足移动自动化需求, Appium 遵循着某种理念。这种理念重点体现于以下 4 个需求:
-
-1. 你无需为了自动化,而重新编译或者修改你的应用。
-2. 你不必局限于某种语言或者框架来写和运行测试脚本。
-3. 一个移动自动化的框架不应该在接口上重复造轮子。(移动自动化的接口应该统一)
-4. 无论是精神上,还是名义上,都必须开源。
-
-## Appium 设计
-
-那么 Appium 架构是如何实现这个哲学呢?为了满足第一条,Appium 真正的工作引擎其实是第三方自动化框架。
-这样,我们就不需在你的应用里植入 Appium 特定或者第三方的代码。这就意味着你在测试你将发布的应用。我们
-使用以下的第三方框架:
-
-* iOS: 苹果的 [UIAutomation](https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/)
-* Android 4.2+: Google's [UiAutomator](http://developer.android.com/tools/help/uiautomator/index.html)
-* Android 2.3+: Google's [Instrumentation](http://developer.android.com/reference/android/app/Instrumentation.html). (Instrumentation support is provided by bundling a separate project, [Selendroid](http://selendroid.io))
-
-为了满足第二点,我们把这些第三方框架封装成一套 API, [WebDriver](http://docs.seleniumhq.org/projects/webdriver/) API.
-WebDriver (也就是 "Selenium WebDriver") 指定了客户端到服务端的协议。
-(参见 [JSON Wire Protocol](https://w3c.github.io/webdriver/webdriver-spec.html))。
-使用这种客户端-服务端的架构,我们可以使用任何语言来编写客户端,向服务端发送恰当的 HTTP 请求。
-而且目前已经有大多数流行语言版本的客户端实现了。这也意味着你可以使用任何测试套件或者测试框架。客户端库就是简单的
-HTTP 客户,可以以任何你喜欢的方式潜入你的代码。换句话说,Appium 和 WebDriver 客户端不是技术意义上的“测试框架”,
-而是“自动化库”。你可以在你的测试环境中随意使用这些自动化库!
-
-事实上 WebDriver 已经成为 web 浏览器自动化的标准,也成了 W3C 的标准 —— [W3C Working Draft](https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html)。
-我们又何必为移动做一个完全不同的呢?
-所以我们扩充了[WebDriver 的协议](https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md),
-在原有的基础上添加移动自动化相关的 API 方法,这也也满足了第三条理念。
-
-第四条就不用说了,[Appium 是开源的](https://github.com/appium/appium)。
-
-## Appium 概念
-
-**C/S 架构**
-Appium 的核心是一个 web 服务器,它提供了一套 REST 的接口。它收到客户端的连接,监听到命令,
-接着在移动设备上执行这些命令,然后将执行结果放在 HTTP 响应中返还给客户端。事实上,这种客户端/服务端的
-架构打开了许多可能性:比如我们可以使用任何实现了客户端的语言来写我们的测试代码。比如我们可以把服务端放在不同
-的机器上。比如我们可以只写测试代码,然后使用像 [Sauce Labs](https://saucelabs.com/mobile) 这样的云服务来解释命令。
-
-**Session**
-自动化总是在一个 session 的上下文中运行。客户端初始化一个和服务端交互的 session。不同的语言有不同的实现方式,
-但是最终都是发送一个附有 “desired capabilities” 的 JSON 对象参数的 POST 请求 “/session” 给服务器。
-这时候,服务端就会开始一个自动化的 session,然后返回一个 session ID。
-客户端拿到这个 ID,之后就用这个 ID 发送后续的命令。
-
-**Desired Capabilities**
-Desired capabilities 是一些键值对的集合 (比如,一个 map 或者 hash)。
-客户端讲这些键值对发给服务端,告诉服务端我们想要启动怎样的自动化session。
-根据不同的 capabilities 参数,服务端会有不同的行为。比如,我们可以把
-`platformName` capability 设置为 `iOS`,告诉 Appium 服务端,我们想要一个
-iOS 的 session,而不是一个 Android 的。我们也可以设置 `safariAllowPopups` capability 为 `true`,
-确保在 Safari 自动化 session 中,我们可以使用 javascript 来打开新窗口。
-参见 [capabilities 文档](caps.cn.md),查看完整的 capabilities 列表。
-
-**Appium Server**
-Appium server 是用 nodejs 写的。我们可以用源码编译或者从 NPM 直接安装。
-
-**Appium 服务端**
-
-Appium 服务端有很多语言库 Java, Ruby, Python, PHP, JavaScript 和 C#,这些库都实现了
-Appium 对 WebDriver 协议的扩展。当使用 Appium 的时候,你只需使用这些库代替常规的 WebDriver 库就可以了。
-你可以从[这里](appium-clients.cn.md)看到所有的库的列表。
-
-**Appium.app, Appium.exe**
-
-我们提供了 GUI 封装的 Appium server 下载。它封装了运行 Appium server 的所有依赖。
-所以你需要担心 Node。而且这个封装包含了一个 Inspector 工具,可以让使用者检查应用的界面层级。
-这样写测试用例的时候就非常方便了。
-
-## Getting Started
-
-恭喜!你现在有足够的知识来使用 Appium 了。 来我们回到 [getting started doc](README.cn.md) 继续了解更加
-细节的需求和指南。
diff --git a/docs/old/cn/ios-deploy.cn.md b/docs/old/cn/ios-deploy.cn.md
deleted file mode 100644
index 31ebc5e2d..000000000
--- a/docs/old/cn/ios-deploy.cn.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# 部署ios app 到手机上
-
-准备在真机上执行appium测试, 需要如下准备:
-
-1. 用特殊的设备参数来构建app
-1. 使用 [fruitstrap](https://github.com/ghughes/fruitstrap), 一个第三方程序,来部署你构建的app到手机上
-
-## Xcodebuild 命令的参数:
-新的参数运行指定设置. 参考 [developer.apple.com](https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html):
-
-```
-xcodebuild [-project projectname] [-target targetname ...]
- [-configuration configurationname] [-sdk [sdkfullpath | sdkname]]
- [buildaction ...] [setting=value ...] [-userdefault=value ...]
-```
-
-这有一个资料来参考可用的[设置](https://developer.apple.com/library/mac/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-DontLinkElementID_10)
-
-```
-CODE_SIGN_IDENTITY (Code Signing Identity)
- 介绍: 标识符,指定一个签名.
- 例如: iPhone Developer
-```
-
-PROVISIONING_PROFILE 已经从可用的的命令中消失了,但还是有必要设置的。
-
-在xcodebuild命令中设置 "CODE_SIGN_IDENTITY" & "PROVISIONING_PROFILE":
-
-```
-xcodebuild -sdk -target -configuration CODE_SIGN_IDENTITY="iPhone Developer: Mister Smith" PROVISIONING_PROFILE="XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX"
-```
-
-成功的话, app会构建到如下目录 ```/build/-iphoneos/.app```
-
-## 用Fruitstrap进行部署
-clone一个fruitstrap的fork版本在[ghughes version](https://github.com/ghughes/fruitstrap) ,这个已经不再维护. 已确认该fork可用[unprompted fork](https://github.com/unprompted/fruitstrap), 但是其它的据说也可用.
-
-clone成功的话, 执行 ``make fruitstrap``
-然后, 然后复制生成的 ``fruitstrap``到app的所在的目录或上级目录下。
-
-运行fruitstrap 通过输入以下命令 (命令是否可用依赖于你fork的 fruitstrap):
-
-```
-./fruitstrap -d -b -i
-```
-
-如果是为了持续集成,你可以发现很有用的方法来记录fruitstrap命令行和日志文件中的记录, 像这样:
-
-```
-./fruitstrap -d -b -i 2>&1 | tee fruit.out
-```
-
-在node服务启动前fruitstrap进行需要被结束, 一个方法是扫描fruitstrap的输出来得知app完成启动。 有一个有效的方法是通过一个Rakefile 和一个 ``go_device.sh`` 脚本:
-
-```
-bundle exec rake ci:fruit_deploy_app | while read line ; do
- echo "$line" | grep "text to identify successful launch"
- if [ $? = 0 ]
- then
- # Actions
- echo "App finished launching: $line"
- sleep 5
- kill -9 `ps -aef | grep fruitstrap | grep -v grep | awk '{print $2}'`
- fi
- done
-```
-
-一旦fruitstrap的进程被结束, node 服务就可以启动并且appium测试可以被执行!
-
-下一步:
-[在真机上运行appium](https://github.com/appium/appium/wiki/Running-Appium-on-Real-Devices)
diff --git a/docs/old/cn/ios_predicate.cn.md b/docs/old/cn/ios_predicate.cn.md
deleted file mode 100644
index 97a43d701..000000000
--- a/docs/old/cn/ios_predicate.cn.md
+++ /dev/null
@@ -1,239 +0,0 @@
-# iOS Predicate
-
-I'd like to share my experience in using *'-ios uiautomation'* search strategy with **Predicates**. After using Instruments/UIAutomation tool for a long time I paid attention on the following methods in [UIAutomation JavaScript API](https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/):
-
-```java
-(UIAElement) UIAElementArray.firstWithPredicate(PredicateString predicateString)
-(UIAElementArray) UIAElementArray.withPredicate(PredicateString predicateString)
-```
-
-And it turned out that native JS search strategy (powered by Apple) provides much more flexibility than I was thinking before, it is almost just like Xpath.
-**[Predicates](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/predicates.html)** can be used to restrict an elements set to select only those ones for which some condition is true.
-
-For example:
-
-```java
-appiumDriver.findElementsByIosUIAutomation("collectionViews()[0].cells().withPredicate(\"ANY staticTexts.isVisible == TRUE\")")
-```
-
-\- will select only those ```UIACollectionCell``` elements that have visible ```UIAStaticText``` child elements, and themselves are childs of 1st ```UIACollectionView``` element that should be located under the main app window. Here ```staticTexts()``` and ```isVisible()``` are methods available in ```UIAElementArray``` and ```UIAElement``` classes respectively. **Note that ```UIAElementArray``` numbering begins with ```0``` unlike Xpath where indexes counting starts from ```1```**
-
-Here's a list of available Predicates (mostly taken from [Predicates Programming Guide](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Predicates/predicates.html))
-
-## Basic Comparisons
-
-= , ==
-- The left-hand expression is equal to the right-hand expression:
-```javascript
-tableViews()[1].cells().firstWithPredicate("label == 'Olivia' ")
-
-same in Xpath: /UIATableView[2]/UIATableCell[@label = 'Olivia'][1]
-```
-
-\>= , =\>
-- The left-hand expression is greater than or equal to the right-hand expression.
-
-<= , =<
-- The left-hand expression is less than or equal to the right-hand expression.
-
-\>
-- The left-hand expression is greater than the right-hand expression.
-
-<
-- The left-hand expression is less than the right-hand expression.
-
-!= , <\>
-- The left-hand expression is not equal to the right-hand expression.
-
-BETWEEN
-- The left-hand expression is between, or equal to either of, the values specified in the right-hand side. The right-hand side is a two value array (an array is required to specify order) giving upper and lower bounds. For example, ```1 BETWEEN { 0 , 33 }```, or ```$INPUT BETWEEN { $LOWER, $UPPER }```.
-In Objective-C, you could create a BETWEEN predicate as shown in the following example:
-
-```objectivec
-NSPredicate *betweenPredicate =
- [NSPredicate predicateWithFormat: @"attributeName BETWEEN %@", @[@1, @10]];
-```
-
-This creates a predicate that matches ```( ( 1 <= attributeValue ) && ( attributeValue <= 10 ) )```
-
-## Boolean Value Predicates
-
-TRUEPREDICATE
-- A predicate that always evaluates to ```TRUE``` .
-
-FALSEPREDICATE
-- A predicate that always evaluates to ```FALSE```.
-
-## Basic Compound Predicates
-
-AND , &&
-- Logical AND.
-
-OR , ||
-- Logical OR.
-
-NOT , !
-- Logical NOT.
-
-## String Comparisons
-
-String comparisons are by default case and diacritic sensitive. You can modify an operator using the key characters ```c``` and ```d``` within square braces to specify case and diacritic insensitivity respectively, for example ```firstName BEGINSWITH[cd] $FIRST_NAME```
-
-BEGINSWITH
-- The left-hand expression begins with the right-hand expression.
-
-```javascript
-scrollViews()[3].buttons().firstWithPredicate("name BEGINSWITH 'results toggle' ")
-
-same in Xpath: /UIAScrollView[4]/UIAButton[starts-with(@name, 'results toggle')][1]
-```
-
-CONTAINS
-- The left-hand expression contains the right-hand expression.
-
-```javascript
-tableViews()[1].cells().withPredicate("ANY collectionViews[0].buttons.name CONTAINS 'opera'")
-
-same in Xpath: /UIATableView[2]/UIATableCell[UIACollectionView[1]/UIAButton[contains(@name, 'opera')]]
-```
-
-ENDSWITH
-- The left-hand expression ends with the right-hand expression.
-
-LIKE
-- The left hand expression equals the right-hand expression: ? and * are allowed as wildcard characters, where ? matches 1 character and * matches 0 or more characters. In Mac OS X v10.4, wildcard characters do not match newline characters.
-
-```javascript
-tableViews()[0].cells().firstWithPredicate("name LIKE '*Total: $*' ")
-
-same in Xpath: /UIATableView[1]/UIATableCell[matches(@name, '.*Total: \$.*')][1]
-```
-
-MATCHES
-- The left hand expression equals the right hand expression using a regex -style comparison according to ICU v3 (for more details see the ICU User Guide for [Regular Expressions](http://userguide.icu-project.org/strings/regexp)).
-
-```javascript
-tableViews().firstWithPredicate("value MATCHES '.*of 7' ")
-
-same in Xpath: /UIATableView[matches(@value, '.*of 7')][1]
-```
-
-## Aggregate Operations
-
-ANY , SOME
-- Specifies any of the elements in the following expression. For example ```ANY children.age < 18``` .
-
-```javascript
-tableViews()[0].cells().firstWithPredicate("SOME staticTexts.name = 'red'").staticTexts().withName('red')
-
-same in Xpath: /UIATableView[1]/UIATableCell[UIAStaticText/@name = 'red'][1]/UIAStaticText[@name = 'red']
-```
-
-ALL
-- Specifies all of the elements in the following expression. For example ```ALL children.age < 18``` .
-
-NONE
-- Specifies none of the elements in the following expression. For example, ```NONE children.age < 18``` . This is logically equivalent to ```NOT (ANY ...)``` .
-
-IN
-- Equivalent to an SQL IN operation, the left-hand side must appear in the collection specified by the right-hand side. For example, ```name IN { 'Ben', 'Melissa', 'Matthew' }``` . The collection may be an array, a set, or a dictionary—in the case of a dictionary, its values are used.
-
-array[index]
-- Specifies the element at the specified index in the array.
-
-array[FIRST]
-- Specifies the first element in the array.
-
-array[LAST]
-- Specifies the last element in the array.
-
-array[SIZE]
-- Specifies the size of the array
-```javascript
-elements()[0].tableViews()[0].cells().withPredicate("staticTexts[SIZE] > 2")
-
-same in Xpath: /*[1]/UIATableView[1]/UIATableCell[count(UIAStaticText) > 2]
-```
-
-## Identifiers
-
-**C style identifier**
-- Any C style identifier that is not a reserved word.
-
-**\#symbol**
-- Used to escape a reserved word into a user identifier.
-
-**[\\]{octaldigit}{3}**
-- Used to escape an octal number ( ```\``` followed by 3 octal digits).
-
-**[\\][xX]{hexdigit}{2}**
-- Used to escape a hex number ( ```\x``` or ```\X``` followed by 2 hex digits).
-
-**[\\][uU]{hexdigit}{4}**
-- Used to escape a Unicode number ( ```\u``` or ```\U``` followed by 4 hex digits).
-
-## Literals
-
-Single and double quotes produce the same result, but they do not terminate each other. For example, ```"abc"``` and ```'abc'``` are identical, whereas ```"a'b'c"``` is equivalent to a space-separated concatenation of ```a, 'b', c```.
-
-FALSE , NO
-- Logical false.
-
-TRUE , YES
-- Logical true.
-
-NULL , NIL
-- A null value.
-
-SELF
-- Represents the object being evaluated.
-
-"text"
-- A character string.
-
-'text'
-- A character string.
-
-**Comma-separated literal array**
-- For example, ```{ 'comma', 'separated', 'literal', 'array' }``` .
-
-**Standard integer and fixed-point notations**
-- For example, ```1 , 27 , 2.71828 , 19.75``` .
-
-**Floating-point notation with exponentiation**
-- For example, ```9.2e-5``` .
-
-0x
-- Prefix used to denote a hexadecimal digit sequence.
-
-0o
-- Prefix used to denote an octal digit sequence.
-
-0b
-- Prefix used to denote a binary digit sequence.
-
-## Reserved Words
-
-The following words are reserved:
-
-`AND, OR, IN, NOT, ALL, ANY, SOME, NONE, LIKE, CASEINSENSITIVE, CI, MATCHES, CONTAINS, BEGINSWITH, ENDSWITH, BETWEEN, NULL, NIL, SELF, TRUE, YES, FALSE, NO, FIRST, LAST, SIZE, ANYKEY, SUBQUERY, CAST, TRUEPREDICATE, FALSEPREDICATE`
-
-## Appium predicate helpers
-
-Appium has [helpers for predicate search](https://github.com/appium/appium-uiauto/blob/3052dace828db2ab3d722281fb7853cbcbc3252f/uiauto/appium/app.js#L68) in app.js:
-
-- `getFirstWithPredicate`
-- `getFirstWithPredicateWeighted`
-- `getAllWithPredicate`
-- `getNameContains`
-
-Here's a Ruby example:
-
-```ruby
-# Ruby example
-text = 'Various uses'
-predicate = "name contains[c] '#{text}' || label contains[c] '#{text}' || value contains[c] '#{text}'"
-element = execute_script(%Q(au.mainApp().getFirstWithPredicate("#{predicate}");))
-
-puts element.name # Buttons, Various uses of UIButton
-```
\ No newline at end of file
diff --git a/docs/old/cn/migrating-to-1-0.cn.md b/docs/old/cn/migrating-to-1-0.cn.md
deleted file mode 100644
index cf0423ea1..000000000
--- a/docs/old/cn/migrating-to-1-0.cn.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# 把appium 0.18.x上的测试用例集迁移到appium1.x上
-
-Appium 1.0 已经从先前的版本中移除了一部分过时的特性, 这个指导文档会帮助你了解使用Appium 1.0需要做的具体改变.
-
-## 新的客户端库
-
-你需要关注的最大的改变是利用新的appium的client libraries来替换原生的WebDriver ciients. 访问[Appium client list](appium-clients.md) 去寻找符合你自己编程语言的客户端库吧. 在每个客户端的网站上都可以找到用于集成到你代码中的依赖库相关介绍和下载
-
-基本上, 你需要做如下的改变(以Python作为例子)
-
-用
-```
-from appium import webdriver
-```
-
-替换原来的:
-
-```
-from selenium import webdriver
-```
-
-## 新的适配参数
-
-下面的适配参数将不再使用
-* `device`
-* `version`
-
-取而代之的是利用下面的配置参数
-
-* `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都已经是自动探测了, 大部分情况下你可以省略这两个配置项.
-
-## 新的定位方式
-
-我们已经移除了下面的定位方式
-
-* `name`
-* `tag name`
-
-我们增加了`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`
-* `window`
-* `switch_to.window`
-
-现在Appium支持"context" 概念了, 要获得当前环境下所有的上下文(contexts), 或者特定的context, 你可以用
-
-```python
-driver.contexts
-current = driver.context
-```
-
-在这些context之间切换, 可以使用
-
-```python
-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, 它允许更强大通用的组合手势的自动化. 可以参考你的客户端库的具体用法.
-
-这就是全部啦, 祝迁移愉快
-
-(文档由testerhome.com翻译, 欢迎更多热爱技术的同学加入到翻译中来, We Love Appium)
-
diff --git a/docs/old/cn/mobile-web.cn.md b/docs/old/cn/mobile-web.cn.md
deleted file mode 100644
index a61ffe3a0..000000000
--- a/docs/old/cn/mobile-web.cn.md
+++ /dev/null
@@ -1,98 +0,0 @@
-# 自动化手机网页应用
-
-如果你正对于如何在iOS的Safari或Android上的Chrome做网页应用的自动化,那么Appium能够帮助你。你可以写一个最普通的WebDriver测试代码,就像使用Selenium服务一样使用Appium来满足需求。
-
-##iOS模拟器上的Safari浏览器
-
-首先,我们需要先确认在你的Safari浏览器的设置中开启了开发者模式,这样Safari的远程调试端口也会被同时打开。
-
-如果你打算在模拟器或真机上使用Appium的话,你必须先开发Safari。
-
-然后设置如下显示的这些信息以便于在设备中的Safari执行测试:
-
-```js
-{
- app: 'safari'
- , device: 'iPhone Simulator'
- , version: '6.1'
-}
-```
-
-###iOS真机上的Safari浏览器
-
-为了能够在真机上的Safari执行测试,我们使用了[SafariLauncher App](https://github.com/snevesbarros/SafariLauncher)来启动Safari。使用[ios-webkit-webkit-proxy](https://github.com/google/ios-webkit-debug-proxy)来自动启动Safari的远程调试功能。
-
-提示: 目前针对iOS7版本的上,ios-webkit-debug-proxy有一个问题。[a bug](https://github.com/google/ios-webkit-debug-proxy/issues/38)
-
-### 前期设置
-
-当你要在真机上的Safari中执行你的测试脚本之前你需要先注意以下几点:
-*安装并正常运行ios-webkit-debug-proxy(具体可以参考(s[hybrid docs](hybrid.md))
-*打开iOS真机中的web inspector,可以在iOS6.0或更高版本中的设置 > safari > 高级找到。
-*创建一个provisioning profile 能够帮助你配置safariLauncher.
-*
-你可以前往Apple Developers Member Center 创建一个launcher profile:
- * 第一步: 创建一个新的App Id 同时设置WildCard App ID这个选项置为"*"
- * 第二步: 为步骤1的App Id创建一个new Development Profile .
- * 第三步: 选择你的certificate(s) and device(s) 并选择下一步.
- * 第四步: 设置profile的名称以及generate the profile.
- * 第五步: 下载profile并使用文本编辑器打开.
- * 第六步: 寻找并牢记你的UUID
-
-现在你有了自己的profile文件,可以在终端中输入如下的命令:
-
-```bash
-$ git clone https://github.com/appium/appium.git
-$ cd appium
-
-# 选项1:你可以不设置任何的参数就可以设置ios开发者证书
-$ ./reset.sh --ios --real-safari
-
-# 选项2:你需要定义code signing identity并且允许xcode可选择profile identity code
-$ ./reset.sh --ios --real-safari --code-sign ''
-
-#选项3:你需要设置和
-$ ./reset.sh --ios --real-safari --code-sign '' --profile ''
-
-#设置成功之后,就可以像往常一样启动服务
-$ node /lib/server/main.js -U
-```
-
-### 执行你的测试
-如果要在safari下的运行你的测试, 只需要简单的配置app为safari即可
-
-
-### Java 举例
-
-```java
-//setup the web driver and launch the webview app.
-DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
-desiredCapabilities.setCapability("app", "safari");
-URL url = new URL("http://127.0.0.1:4723/wd/hub");
-RemoteWebDriver remoteWebDriver = new RemoteWebDriver(url, desiredCapabilities);
-
-// Navigate to the page and interact with the elements on the guinea-pig page using id.
-remoteWebDriver.get("http://saucelabs.com/test/guinea-pig");
-WebElement div = remoteWebDriver.findElement(By.id("i_am_an_id"));
-Assert.assertEquals("I am a div", div.getText()); //check the text retrieved matches expected value
-remoteWebDriver.findElement(By.id("comments")).sendKeys("My comment"); //populate the comments field by id.
-
-//close the app.
-remoteWebDriver.quit();
-```
-
-### 在真机或模拟器上的Chrome执行测试
-
-需要做的准备:
-
-* 确认Chrome已经安装在了你的真机或模拟器上 (应用的包名是`com.android.chrome`) .在不编译chromiun的情况下, 不可能得到模拟器上的x86版本的chrome, 你可以运行一个ARM的模拟器然后从真机上获取一个Chrome的APK安装在模拟器上.
-* 确认 [ChromeDriver](https://code.google.com/p/chromedriver/downloads/list), version >= 2.0 正确的安装在你的系统上并且设置了`chromedriver`成为系统全局变量.
-
-接着,像这样设置就可以在Chrome上执行测试了:
-
-```js
-{
- app: 'chrome'
- , device: 'Android'
-};
-```
diff --git a/docs/old/cn/platform-support.cn.md b/docs/old/cn/platform-support.cn.md
deleted file mode 100644
index 462db671c..000000000
--- a/docs/old/cn/platform-support.cn.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Appium 支持的平台
-
-Appium 支持很多的运行平台和测试方式(包括原生、混合应用、内嵌
-浏览器、真机、模拟器等)。这篇文档主要用来让大家明确在使用
-Appimu时候支持的平台版本和上述测试方式的必备条件。
-
-## iOS 平台支持
-
-请移步到 [Running on OS X: iOS](running-on-osx.md) 这里介绍了在iOS系统下使用Appium的必备条件和安装说明。
-
-* 版本号:6.1 , 7.0 , and 7.1
-* 支持设备: iPhone 模拟器, iPad 模拟器以及iPhones 和 iPads真机
-* 是否支持原生应用:支持 。同时支持模拟器中调试应用版本和正确签名的真机ipa。
- 其他相关支持由苹果的[UIAutomation](https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/)
- 框架提供。
-* 是否支持内嵌浏览器:支持, Safari浏览器已经通过测试。对于
- 真机,则需要安装调试工具 ios-webkit-remote-debugger,很遗憾
- 对于Safari的原生界面的自动化是不支持的。更多信息请移步
- 至[mobile web doc](mobile-web.md) 。
-* 混合方式应用是否支持: 支持. 同样对于真机需要安装调试工具
- ios-webkit-remote-debugger,更多详情请移步至
- [hybrid doc](hybrid.md) 查看详情。
-* 是否支持在同一个session中的支持多种应用自动化:不支持
-* 是否支持同时执行多个设备: 不支持
-* 是否支持第三方提供应用: 只支持在模拟器上有限的第三方应用(例如:喜好,地图等)。
-
-## Android 平台
-
-请移步至 [Running on OS X: Android](running-on-osx.md),
-[Running on Windows](running-on-windows.md), 或者
-[Running on Linux](running-on-linux.md) 获得在不同操作系统下android平台对appium的支
-持和安装配置文档。
-
-* 支持版本: android 2.3 平台及以上
- * android 4.2 平台及以上通过Appium自有的 [UiAutomator](http://developer.android.com/tools/help/uiautomator/index.html)类
- 库支持. 默认在自动化后台。
- * 从android 2.3 到 4.3 平台 ,Appium是通过绑定[Selendroid](http://selendroid.io),实
- 现自动化测试的,你可以到android 开发社区的
- [Instrumentation](http://developer.android.com/reference/android/app/Instrumentation.html).(仪表盘)中查看相关介绍。Selendroid 拥有
- d一套不同的命令行和不同的 profile 文件(这部分差距正在逐步缩小).要获得在后台运行自动化的权限,需要配置
- `automationName` 组件的值为 `Selendroid`。
-* 支持的设备: Android 模拟器和Android 真机
-* 是否支持原生应用:支持
-* 是否支持移动浏览器:支持(除了使用Selendroid后台运行的情
- 况) 。通过代理方式绑定到 [Chromedriver](https://code.google.com/p/selenium/wiki/ChromeDriver) 来运行自动化测试。在
- android4.2和 4.3版本中,只有在官方版本的谷歌浏览器或者
- Chromium下才能运行自动化测试。 伴随着android 4.4+版本的
- 出现。 自动化测试则可以运行在内置浏览器的应用程序。但是
- 需要在测试设备环境下安装Chrome/Chromium/浏览器 。请移
- 步至 [mobile web doc](mobile-web.md) 获取更多详情。
-* 混合应用是否支持: 支持。请移步至 [hybrid doc](hybrid.md) 参考相关文档。
- * 通过默认的Appium的后台支持android 4.4 以上的版本
- * 通过Selendroid的后台支持android 2.3 以上的版本
-* 是否支持在一个session里的多个应用自动化:支持(但是不支
- 持使用Selendroid 后台的场景)
-* 是否支持多个设备同时运行自动化测试: 支持, 尽管Appium 必
- 须要启动另一个端口即通过添加参数的方式运行命令行,例如 `-
- -port`, `--bootstrap-port` (或者 `--selendroid-port`) 或者
- `--chromedriver-port`. 更多详情请移步至 [server args doc](server-args.md) 。
-* 是否支持第三方应用自动化:支持(但是不支持Selendroid 后台
- 运行的场景)
\ No newline at end of file
diff --git a/docs/old/cn/real-devices.cn.md b/docs/old/cn/real-devices.cn.md
deleted file mode 100644
index c29ac08f9..000000000
--- a/docs/old/cn/real-devices.cn.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Appium在真机上
-
-Appium已经初步支持真机测试。
-
-如果要在真机上执行测试,你将要做如下准备:
-
-1.一个苹果的开发者ID和有效的开发者对应的配置文件和签名文件
-
-2.一台iPad或者iPhone
-
-3. 你要测试的应用的源码
-
-4. 一台安装了XCode和XCode Command Line Developer Tools的Mac机器
-
-## Provisioning Profile
-
-要在真机上测试就需要一个有效的iOS开发者的Distribution Certificate and Provisioning Profile。你可以在这个上面找到配置这些的相关信息[Apple documentation](http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Conceptual/YourFirstAppStoreSubmission/TestYourApponManyDevicesandiOSVersions/TestYourApponManyDevicesandiOSVersions.html)
-
-同样的,你还需要对你的应用签名,更多的信息可以查看[sign your app](http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Conceptual/YourFirstAppStoreSubmission/ProvisionYourDevicesforDevelopment/ProvisionYourDevicesforDevelopment.html#//apple_ref/doc/uid/TP40011375-CH4-SW1).
-
-你必须使用Xcode的执行按钮来安装你的应用
-
-## 使用Appium运行你的测试
-
-一旦你的设备和应用设置好了之后,你就能够用如下的命令在你的机器上执行测试:
-
-```
-node . -U --app
-```
-
-这将会启动Appium并且开始在真机上测试应用。
-
-## 疑问解答思路
-
-0. 确认UDID已经正确的在xcode organizar或itunes中设置了。很长的字符串(20多个字符串)
-0.确认你测试代码中的测试对象设备的设置
-0. 再次确认你从instruments启动你的自动化测试
-0. 确认instruments已经关闭
diff --git a/docs/old/cn/running-on-linux.cn.md b/docs/old/cn/running-on-linux.cn.md
deleted file mode 100644
index f7157f3cd..000000000
--- a/docs/old/cn/running-on-linux.cn.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# 在 Linux 上运行 Appium
-
-### 限制
-
-如果你在 Linux 上使用 Appium, 那么你没法使用已经构建好的 '.app',那是为 OS X 准备的。 另外由于 Appium 在测试 iOS 应用时 依赖 OS X 特有的库, 所以你也没有办法测试在 Linux 上测试 iOS 应用。
-
-## 配置
-
-首先,安装版本高于或等于 0.8 的 nodejs。可以根据 [instructions for your flavor of linux](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager) 进行安装。
-
-安装好了 node.js 之后,安装 [Android SDK](http://developer.android.com/sdk/index.html)。 你会需要运行 `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 目录运行
-
- node .
-
-你可以在 [server documentation](server-args.cn.md) 找到所有的命令行参数。
-
-
-## 备注
-* There exists a hardware accelerated emulator for android, it has it's own
- limitations. For more information you can check out this
- Android 有一些硬件加速的模拟器,这些模拟器有自己的限制。你可以在 [page](android-hax-emulator.cn.md) 找到更多的信息。
-* 确保你使用的 AVD 里面的 `config.ini` 有这条指令 `hw.battery=yes`。
diff --git a/docs/old/cn/running-on-osx.cn.md b/docs/old/cn/running-on-osx.cn.md
deleted file mode 100644
index 8693c089c..000000000
--- a/docs/old/cn/running-on-osx.cn.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# 在 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`。如果你使用`Appium.app`, 那你只要用界面来操作。
-
-## 使用多种 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)
-
-* 确保你已经安装了 [Android SDK installed](http://developer.android.com/sdk/index.html)。
-* 确保你安装的 Android SDK API 大于等于 17。你可以运行 Android SDK 管理器(`android`) 然后在额外的包里选择你要安装的 API。
-* 确保你安装了 `ant`。 我们用 Ant 来构建 Appium 的 bootstrap jar 和 测试程序。Mac OS X Mavericks (小牛)已经不预装 `ant` 了, 你可以去[官网](http://ant.apache.org/bindownload.cgi)下载。你可以用 `homebrew` 安装。
-* 确保你配置好了`$ANDROID_HOME`,并指向你的 Android SDK 目录。比如你的把 Android SDK 解压到 `/usr/local/adt/`, 那你就要将如下添加到你的 `.bashrc` 或 `.zshrc` 或 `.bash_profile` 等 shell 配置文件中去:
-
- export ANDROID_HOME="/usr/local/adt/sdk"
-
-* 确保你安装了 [Maven 3.0.5](http://maven.apache.org/download.cgi)。 Maven 3.1.1 不能使用!
-我们需要 Maven 来支持 Selendroid, 借助 Selendroid, Appium 可以在低于 4.2 的 Android 版本里运行。
-* 确保你的 AVD 已经配置好了最新的 Android 版本 (一个可以运行的 UIAutomator)(至少 4.1 )。你可以使用 Android SDK tool 来创建 AVD。 别忘记给 AVD 起个好记的名字,下次你可以用它来启动模拟器并在模拟器上运行测试。
-* 确保你使用的 AVD 里面的 `config.ini` 有这条指令 `hw.battery=yes`。
-* Android 有一些硬件加速的模拟器,这些模拟器有自己的限制。你可以在 [page](android-hax-emulator.cn.md) 找到更多的信息。
\ No newline at end of file
diff --git a/docs/old/cn/running-on-windows.cn.md b/docs/old/cn/running-on-windows.cn.md
deleted file mode 100644
index 84b1b5bb8..000000000
--- a/docs/old/cn/running-on-windows.cn.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# 在windows上运行appium
-
-### 限制
-
-如果你在windows上安装appium,你没法使用预编译专用于OS X的.app文件,你也将不能测试IOS apps,因为appium依赖OS X专用的库来支持IOS测试。这意味着你只能通过在mac上来运行IOS的app测试。这点限制挺大。
-
-## 开始安装
-
-1. 安装[nodejs](http://nodejs.org/download/) 0.8版本及以上, 通过官方的安装程序来安装。
-
-2. 安装android的sdk包,(http://developer.android.com/sdk/index.html), 运行依赖sdk中的'android'工具。并确保你安装了Level17或以上的版本api。设置`ANDROID_HOME`系统变量为你的Android SDK路径,并把tools platform-tools两个目录加入到系统的Path路径里。因为这里面包含有一些执行命令
-
-3. 安装java的JDK,并设置`JAVA_HOME` 变量为你的JDK目录。
-
-4. 安装[Apache Ant](http://ant.apache.org/bindownload.cgi)
-或者直接使用Android Windows SDK自带的ant,地址在eclipse\plugins目录,你需要把这个目录加到你的系统PATH变量中
-
-5. 安装[Apache Maven](http://maven.apache.org/download.cgi). 并且设置M2HOME和M2环境变量,把M2环境变量添加到你的系统PATH变量中。
-
-6. 安装[Git](http://git-scm.com/download/win). 确保你安装了windows下的Git,以便可以运行常用的command命令
-
-
-现在,你已经下载安装了所有的依赖,开始运行
- reset.bat
-
-### 运行Appium
-
-要在windows上运行测试用例,你需要先启动Android模拟器或者连接上一个API Level17以上的android真机。
-然后在命令行运行appium
- node .
-
-
-### 备注
-* 你必须带上--no-reset和--full-reset标记,以用于windows上的android
-* 有一个硬件加速模拟器用于android,但是它有自己的一些限制,如果你想了解更多,请参考[页面](android-hax-emulator.cn.md)
-* 确保在你的AVD的`config.ini`中有一个配置项为`hw.battery=yes`
-
-
-
-### 最简略的安装方式
-出于对官方文档的尊重,我按照原文翻译,如下介绍我的安装心得。官方提到的一些工具,其实并不需要安装。
-下面介绍我已经测试过的安装和使用过程
-
-### 安装appium
-
-1. 安装nodejs
-
-2、使用npm安装appium,npm install -g appium
-
-### 运行appium
-启动appium,直接运行appium 即可。
-
-### 更新appium
-通过`npm install -g appium` 来更新appium即可
-
-
-如果有任何疑问,欢迎到testerhome.com来交流
diff --git a/docs/old/cn/running-tests.cn.md b/docs/old/cn/running-tests.cn.md
deleted file mode 100644
index 4f8d2ed72..000000000
--- a/docs/old/cn/running-tests.cn.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# 執行測試
-
-## 測試前的準備 (iOS)
-
-在模擬器上測試apps必須要用模擬器專用的編譯器,例如說使用下列的命令來編譯 Xcode 項目:
-
- > xcodebuild -sdk iphonesimulator6.0
-
-這行指令在Xcode項目底下創建了一個`build/Release-iphonesimulator`目錄,並且生成一個可以透過 Appium 服務器來交流的的`.app`封包。
-
-如果需要,你可以把.app 目錄壓縮成一個zip壓縮檔!Appium 會自行解壓縮。讓你能方便在非本地運行Appium。
-
-## 測試前的準備 (Android)
-
-用Appium去執行你的.apk檔其實沒什麼特別需要注意的事項。如果需要,你可以把它壓縮成zip壓縮檔。
-
-## 用Appium測試你的app (iOS)
-
-目前最好的測試方式請參照測試範例:
-
-[Node.js](/sample-code/examples/node) | [Python](/sample-code/examples/python) | [PHP](/sample-code/examples/php) | [Ruby](/sample-code/examples/ruby) | [Java](/sample-code/examples/java)
-
-基本上來說,首先先確定你啟動了Appium:
-
- node . -V
-
-然後執行你的WebDriver測試腳本,腳本必須包含下列的環境參數:
-
-```js
-{
- device: 'iPhone Simulator',
- browserName: '',
- version: '6.1',
- app: myApp
-}
-```
-
-在這個腳本集裡,`myApp`必須是下列其中之一:
-
-* 一個模擬器編譯過的 .app 目錄或著 .zip 檔的本地絕對路徑
-* 一個包含著你的.app封包的zip檔的url
-
-在你選擇的WebDriver庫裡,設定remote session使用上述的環境參數然後使用端口 4723來連接本地服務器 (或著是使用你在Appium啟動時所設定的任意端口)。現在你已經設置完成了!
-
-## 用Appium測試你的app (Android)
-
-首先,先確定你有一個而且必須是只能一個Android模擬器或著設備連接著。如果你輸入`adb devices`,你應該只看到一個設備連接著。這將是Appium所用來測試的設備。當然,要連接一個設備,你需要準備好一個Android AVD (參考 [系統設置](system-setup.md) 以了解更多). 如果Android SDK工具在你的路徑下,你可以簡單的執行:
-
- emulator -avd <我的Avd名稱>
-
-然後等android模擬器啟動。有時候,因為某些原因,`adb`會卡住。如果它沒有顯示任何的設備或其他故障,你可以使用下列指令來重啟:
-
- adb kill-server && adb devices
-
-現在,確認Appium已經啟動:
-
- node .
-
-然後執行你的WebDriver測試腳本,腳本必須包含下列的環境參數:
-
-```js
-{
- device: 'Android',
- browserName: '',
- version: '4.2',
- app: myApp,
- 'app-package': myAppPackage,
- 'app-activity': myAppActivity
-}
-```
-
-在這個腳本集裡,`myApp`必須是下列其中之一:
-
-* 一個 .apk 或著 .zip 檔的本地絕對路徑
-* 一個包含著你的.apk檔的zip壓縮檔的url
-
-`myAppPackage` 必須是你的應用的java package,例如, `com.example.android.myApp`.
-
-`myAppActivity` 必須是你的希望測試的Android activity, 例如, `MainActivity`.
-
-在你選擇的WebDriver庫裡,設定remote session使用上述的環境參數然後使用端口 4723來連接本地服務器 (或著是使用你在Appium啟動時所設定的任意端口)。現在你已經設置完成了!
-
-## 用Appium測試你的app (Android 設備 < 4.2, 以及混合app測試)
-
-低於4.2版本的Android設備 (API Level 17) 沒有安裝Google 的[用戶界面自動化框架/UiAutomator framework](http://developer.android.com/tools/help/uiautomator/index.html).下面的範例是早期Appium在這些設備上的測試方法。對於早期的設備以及使用混合模式(webview-based)製作的apps, Appium 包含了另一種自動化測試後端[Selendroid](http://selendroid.io/).
-
-要使用Selendroid, 只需要在之前提到的環境參數上稍作修改即可,把'Android' 換成 'Selendroid':
-
-```js
-{
- device: 'Selendroid',
- browserName: '',
- version: '2.3',
- app: myApp,
- 'app-package': myAppPackage,
- 'app-activity': myAppActivity
-}
-```
-
-這樣Appium就會使用 Selendroid 取代預設的測試會話。使用 Selendroid 的缺點是有時候它的API跟 Appium 非常不同。所以我們建議你在為你的舊設備或著混合app寫測試腳本之前先仔細的閱讀[Selendroid 的說明文檔](http://selendroid.io/native.html)。
diff --git a/docs/old/cn/server-args.cn.md b/docs/old/cn/server-args.cn.md
deleted file mode 100644
index c3522d21a..000000000
--- a/docs/old/cn/server-args.cn.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Appium 服务器参数
-
-使用方法: `node . [标志]`
-
-###
-所有的标志都是可选的,但是有一些标志需要组合在一起才能生效。
-
-
-
-|标志|默认值|描述|例子|
-|----|-------|-----------|-------|
-|`--shell`|null|进入 REPL 模式||
-|`--app`|null|iOS: 基于模拟器编译的 app 的绝对路径或者设备目标的 bundle_id; Android: apk 文件的绝对路径|`--app /abs/path/to/my.app`|
-|`--ipa`|null|(IOS-only) .ipa 文件的绝对路径|`--ipa /abs/path/to/my.ipa`|
-|`-q`, `--quiet`|false|不输出具体日志||
-|`-U`, `--udid`|null|连接的物理实体机的 udid|`--udid 1adsf-sdfas-asdf-123sdf`|
-|`-a`, `--address`|0.0.0.0|监听的 ip 地址|`--address 0.0.0.0`|
-|`-p`, `--port`|4723|监听的端口|`--port 4723`|
-|`-dp`, `--device-port`|4724|(Android-only) 连接设备的端口号|`--device-port 4724`|
-|`-k`, `--keep-artifacts`|false|(IOS-only) 保留 Instruments trace 目录||
-|`-r`, `--backend-retries`|3|(iOS-only) 遇到 crash 或者 超时,Instrument 重新参试启动的次数。|`--backend-retries 3`|
-|`--session-override`|false|允许 session 覆盖 (冲突的话)||
-|`--full-reset`|false|(iOS) 删除整个模拟器目录。 (Android) 通过卸载应用(而不是清楚数据)重置应用状态。在 Android 上,session 完成后也会删除应用。||
-|`--no-reset`|false|session 之间不充值应用状态 (IOS: 不删除应用的 plist 文件; Android: 在创建一个新的 session 前不删除应用。)||
-|`-l`, `--pre-launch`|false|在第一个 session 前,预启动应用 (iOS 需要 --app 参数,Android 需要 --app-pkg 和 --app-activity)||
-|`-lt`, `--launch-timeout`|90000|(iOS-only) 等待 Instruments 启动的时间||
-|`-g`, `--log`|null|将日志输出到指定文件|`--log /path/to/appium.log`|
-|`--log-timestamp`|false|在终端输出里显示时间戳||
-|`--log-no-colors`|false|不在终端输出中显示颜色||
-|`-G`, `--webhook`|null|同时发送日志到 HTTP 监听器|`--webhook localhost:9876`|
-|`--native-instruments-lib`|false|(IOS-only) iOS 内建了一个怪异的不可能避免的延迟。我们在 Appium 里修复了它。如果你想用原来的,你可以使用这个参数。||
-|`--merciful`, `-m`|false|不运行强制关闭没有响应的 instruments 的监视进程||
-|`--app-pkg`|null|(Android-only) 你要运行的apk的java 包。 (例如, com.example.android.myApp)|`--app-pkg com.example.android.myApp`|
-|`--app-activity`|null|(Android-only) 打开应用时,启动的 Activity 的名字(比如, MainActivity)|`--app-activity MainActivity`|
-|`--app-wait-package`|false|(Android-only) 你想等待的 Activity 的 包名。(比如, com.example.android.myApp)|`--app-wait-package com.example.android.myApp`|
-|`--app-wait-activity`|false|(Android-only) 你想等待的 Activity 名字(比如, SplashActivity)|`--app-wait-activity SplashActivity`|
-|`--android-coverage`|false|(Android-only) 完全符合条件的 instrumentation 类. 作为命令 adb shell am instrument -e coverage true -w 的 -w 的参数|`--android-coverage com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation`|
-|`--avd`|null|要启动的 avd 的名字|`--avd @default`|
-|`--device-ready-timeout`|5|(Android-only) 等待设备准备好的时间,以秒为单位|`--device-ready-timeout 5`|
-|`--safari`|false|(IOS-Only) 使用 Safari 应用||
-|`--device-name`|null|(IOS-Simulator-only) 待使用的 iOS 设备名字|`--device-name iPhone Retina (4-inch)`|
-|`--default-device`, `-dd`|false|(IOS-Simulator-only) instruments 启动时使用默认的模拟器||
-|`--force-iphone`|false|(IOS-only) 无论应用要用什么模拟器,强制使用 iPhone 模拟器||
-|`--force-ipad`|false|(IOS-only) 无论应用要用什么模拟器,强制使用 iPad 模拟器||
-|`--language`|null|(IOS-only) iOS 模拟器的语言|`--language en`|
-|`--locale`|null|(IOS-only) iOS simulator 的区域|`--locale en_US`|
-|`--calendar-format`|null|(IOS-only) iOS 模拟器的日历格式|`--calendar-format gregorian`|
-|`--orientation`|null|(IOS-only) 初始化请求时,使用 LANDSCAPE 或者 PORTRAIT|`--orientation LANDSCAPE`|
-|`--tracetemplate`|null|(IOS-only) 指定 Instruments 使用的 .tracetemplate 文件|`--tracetemplate /Users/me/Automation.tracetemplate`|
-|`--show-sim-log`|false|(IOS-only) 如果设置了, iOS 模拟器的日志会写到终端上来||
-|`--nodeconfig`|null|指定 JSON 格式的配置文件 ,用来在 selenium grid 里注册 appium|`--nodeconfig /abs/path/to/nodeconfig.json`|
-|`-ra`, `--robot-address`|0.0.0.0|robot 的 ip 地址|`--robot-address 0.0.0.0`|
-|`-rp`, `--robot-port`|-1|robot 的端口地址|`--robot-port 4242`|
-|`--selendroid-port`|8080|用来和 Selendroid 交互的本地端口|`--selendroid-port 8080`|
-|`--chromedriver-port`|9515|ChromeDriver运行的端口|`--chromedriver-port 9515`|
-|`--use-keystore`|false|(Android-only) 设置签名 apk 的 keystore||
-|`--keystore-path`|/Users/user/.android/debug.keystore|(Android-only) keystore 的路径||
-|`--keystore-password`|android|(Android-only) keystore 的密码||
-|`--key-alias`|androiddebugkey|(Android-only) Key 的别名||
-|`--key-password`|android|(Android-only) Key 的密码||
-|`--show-config`|false|打印 Appium 服务器的配置信息,然后退出||
-|`--keep-keychains`|false|(iOS) 当 Appium 启动或者关闭的时候,是否保有 keychains (Library/Keychains)||
diff --git a/docs/old/cn/style-guide.cn.md b/docs/old/cn/style-guide.cn.md
deleted file mode 100644
index 369b039b6..000000000
--- a/docs/old/cn/style-guide.cn.md
+++ /dev/null
@@ -1,238 +0,0 @@
-# 贡献者的代码风格指南
-
-感谢你们对 Appium 的贡献! 这些是我们书写 javascript 代码时使用的基本原则。
-请遵守这些,避免风格的来回修改,以便我们可以合并你的 pull 请求。
-基本原则就是:*让你的代码看起来和周围的代码一致*。
-
-## 衍合(Rebasing)
-
-每个 pull 请求中的提交(commits)必须包括 [逻辑的变化](https://github.com/appium/appium/pull/920#issuecomment-21588553)。
-如果有多个作者,确认每个作者有自己的提交。最好不要修改作者信息。
-合并(merge)提交必须从 pull 请求中 rebase 。
-
-## 检错(Linting)
-
-所有的代码 (除了 `bootstrap.js` 的代码,它使用了 Apple 的私有方法) 必须通过 JSLint。
-为了检查你的代码,你可以在 Appium 存储目录下,简单地运行 `grunt lint`。
-如果你已创建一个新的 .js 文件,请确认它在 `grunt.js` 中被通配符覆盖,或者被专门添加。
-
-边输入边检错你的代码是容易实现的,使得整个进程更加顺利。
-我们喜欢 [jshint](http://www.jshint.com), 因为它有与许多源代码编辑器的集成。
-文件 `.jshintrc` 加入到仓库中,它的内容是:
-
-```json
-{
- "laxcomma": true,
- "strict": true,
- "undef": true,
- "unused": true,
- "trailing": true,
- "node": true,
- "es5": true,
- "white": true,
- "indent": 2
-}
-```
-
-在编辑代码时,这些定义了我们想要看到的警告类型。
-浏览 [网页](http://www.jshint.com/platforms/) ,查看编辑器和平台列表,找到使你的编辑器自动化检错的设置方法。
-
-## 风格注意点
-
-* 使用两个空格来缩进, *不要使用 tabs*
-* 在运算符两边,分别添加一个空格
-
- ```js
- var x = 1;
- ```
- 而不是
- ```js
- var x=1;
- ```
-
-* 在 lists, objects, function calls 等中,逗号和冒号后面需要添加一个空格
-
- ```js
- var x = myFunc("lol", {foo: bar, baz: boo});
- ```
- 而不是
- ```js
- var x = myFunc("lol",{foo:bar,baz:boo});
- ```
-
-* 代码语句一般以分号结尾
-* 以逗号开头
-
- ```js
- var x = {
- foo: 'bar'
- , baz: 'boo'
- , wuz: 'foz'
- };
- ```
-
-
-* 左花括号应该和 `function`, `if` 等 写在同一行, `else` 被夹在两个花括号中间。
-
- ```js
- if (foo === bar) {
- // do something
- } else {
- // do something else
- }
- ```
-
-* `if`, `for`, 和 `function` 之后需要添加空格:
-
- ```js
- if (foo === bar) {
- ```
- ```js
- for (var i = 0; i < 10; i ++) {
- ```
- ```js
- var lol = function (foo) {
- ```
- 而不是
- ```js
- if(foo === bar) {
- ```
- ```js
- for(var i = 0; i < 10; i ++) {
- ```
- ```js
- var lol = function(foo) {
- ```
-
-* 只有一行代码时,花括号也应该添加上:
-
- ```js
- if (foo === bar) {
- foo++;
- }
- ```
- 而不是
- ```js
- if (foo === bar)
- foo++;
- ```
-
-* 一般情况下,使用 `===`, 而不是 `==`; 使用 `!==`, 而不是 `!=`
-* 单行长度不应超过79个字符
-* 截断长字符串,方法如下:
-
- ```js
- myFunc("This is a really long string that's longer " +
- "than 79 characters so I broke it up, woo");
- ```
-
-* 注释需要和上一行代码左对齐
-
- ```js
- if (foo === 5) {
- myFunc(foo);
- // foo++;
- }
- ```
- 而不是
- ```js
- if (foo === 5) {
- myFunc(foo);
- //foo++;
- }
- ```
-
-* 通过拓展原型,来创建子类
-
- ```js
- 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);
- ```
-
-* 函数定义中,最后使用回调函数
-
- ```js
- var foo = function (arg1, arg2, cb) {
- ...
- };
- ```
-
-* 使用变量来定义函数
-
- ```js
- var myFunc = function (a, b, c) {};
- ```
- 而不是
- ```js
- function myFunc (a, b, c) {}
- ```
-
-* 变量名应该是驼峰式大小写风格:
-
- ```js
- var myVariable = 42;
- ```
- 而不是
- ```js
- var my_variable = 42;
- ```
-
-* 检查是否有未定义的变量
-
- ```js
- typeof myVariable === "undefined"
- ```
- 而不是
- ```js
- myVariable === undefined
- ```
-
-## 试验风格:
-
-在代码语义通顺和长度许可下,可以保持在同一行:
-
-样例:
-
-```js
- driver.elementByTagName('el1').should.become("123")
- .nodeify(done);
-
- driver
- .elementsByTagName('el1').should.eventually.have.length(0)
- .nodeify(done);
-```
-
-或者使用缩进来提高代码的可读性:
-
-```js
-h.driver
- .elementById('comments')
- .clear()
- .click()
- .keys("hello world")
- .getValue()
- .should.become("hello world")
- .elementById('comments')
- .getValue().should.become("hello world")
- .nodeify(done);
-
-h.driver
- .execute("'nan'--")
- .should.be.rejectedWith("status: 13")
- .nodeify(done);
-```
diff --git a/docs/old/cn/troubleshooting.cn.md b/docs/old/cn/troubleshooting.cn.md
deleted file mode 100644
index ad01ff1cc..000000000
--- a/docs/old/cn/troubleshooting.cn.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# Appium 故障调试
-
-如果你遇到问题,先不要提交 ticket 到 github 或者发信去 appium-disscuss 邮件列表求教,这里教你如何处理。
-
-## 一般问题
-
-* 确保你是根据 [README](README.md) 里面的入门指南按部就班的。
-* 确保你的系统配置好了(比如, xCode 是最新的,Android SDK 安装好了, `ANDROID_HOME` 配置好了,参照 [setup instructions](running-on-osx.md) ).
-* 确保你应用的路径正确。
-
-## 如果你从 Appium.app 运行的话 (通过 dmg 安装的)
-
-* 升级应用,然后重启。 如果你提示你无法升级,从[appium.io](http://appium.io)重新下载。
-
-## 如果你从源代码运行 Appium 的话
-
-* 在源代码目录下运行 `git pull` 确保你使用的是最新的代码。
-* 根据你想要自动化的平台运行 `reset.sh` :
-
- ./reset.sh # 所有平台
- ./reset.sh --ios # ios-only
- ./reset.sh --android # android-only
- ./reset.sh --selendroid # selendroid-only
-* 你可能会用到 `--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 工具被拆分到它们各自项中去。你需要确保安装了 build-tool 和 platform-tool。
-
-## Android
-
-* 确保 Android 模拟器启动并运行着。
-* 有时候需要运行 `adb kill-server && adb devices`。它可以帮助重置和Android设备之间的连接。
-* Make sure you know about the `app-package`, `app-activity`, and `app-wait-activity` desiredCapabilities (see [this doc](running-tests.md) for more information).
-* 你得知道 `app-package`, `app-activity` 和 `app-wait-activity` (详见 [文档](running-tests.md).
-
-## IOS
-
-* 确保 Instruments.app 没打开。
-* If you're running the simulator, make sure your actual device is not plugged in
-* 如果你运行模拟器,确保没有连接真机。
-* 确保你的 Setting 里面 accessibility 辅助功能已经关闭
-* 确保 APP 是为这个版本的模拟器编译的。
-* 如果你曾经用 sudo 运行过 Appium, 你需要先删除`/tmp/instruments_sock`, `sudo rm /tmp/instruments_sock`。然后不要使用 sudo 启动 Appium。
-* 如果你第一次运行 Appium,先授权使用 Instruments。通常会有一个对话框弹出让你输入你的密码。如果你从源代码运行 Appium,你只需简单的运行 `sudo grunt authorize`。如果用 npm 安装的话,运行 `sudo authorize_ios` 即可。
-* 如果你看到 `iOS Simulator failed to install the application.` 而且 App 的路径都正确的,那么重启下电脑看看。
-
-## Webview/Hybrid/Safari app 支持
-
-* 确保真机上的'Web Inspector'激活了。
-* 确保你激活了模拟器上的 Safari 的开发模式。Safari - Advance Preferences- Developer menu
-
-
-## FirefoxOS
-
-* 确保 Boot-to-Gecko 模拟器启动并运行着。
-* 确保模拟器的屏幕是亮着并没用锁屏的(可能需要重启 B2G).
-
-## 告诉社区
-
-如果你通过以上方法都不能解决问题,你可以做:
-
-如果你可以确认你发现的是个bug,来给我们报bug吧。[issue tracker](https://github.com/appium/appium/issues)
-
-如果你的 Appium 无法正常工作,然后错误信息不够清晰,欢迎加入[mailing list](https://groups.google.com/d/forum/appium-discuss)。 给大家发邮件询问,但是请包含以下信息:
-
-* 你是如何运行 Appium 的 (Appium.app, npm, source)
-* 客户端和服务端的错误信息
-* 除了上述, 贴出 Appium 服务器端的输出也非常重要,特别是运行在 verbose 模式。这样我们可以分析诊断问题在哪里。
-
-## Known Issues
-
-* 如果你从 Node 官网安装的 Node,那需要你使用 sudo 运行 npm。这其实并不好,试试看用 `brew install node`。
-* 使用 proxy,Webview 可以支持 iOS 真机。 见 [discussion](https://groups.google.com/d/msg/appium-discuss/u1ropm4OEbY/uJ3y422a5_kJ).
-* 有时候, iOS 的 UI 元素在定位到之后几毫秒会突然变得无效。这会导致一个类似`(null) cannot be tapped`的错误。唯一的解决方法就是把finding-and-acting的代码放到 retry 块里。参见 `mobile: findAndAct` [finding elements doc page](finding-elements.md)
-* 如果你通过 MacPorts 安装的 node 和 npm,那么确保 MacPorts 的 bin 文件夹 (`/opt/local/bin`) 被添加到环境变量 `PATH` 中去。
-
-## Specific Errors
-
-|Action|Error|Resolution|
-|------|-----|----------|
-|Running reset.sh|xcodebuild: error: SDK "iphonesimulator6.1" cannot be located|安装 iPhone 6.1 SDK 或者 使用单独的 SDK 构建 待测应用 比如: `grunt buildApp:UICatalog:iphonesimulator5.1`|