安装 Appium
Appium是开源的自动化测试框架,主要用于iOS,Android以及Windows apps等移动平台的自动化测试。官网的介绍说是它实现一套适用于移动端的WebDriver协议,所以使用Appium时用的还是依赖于Selenium,和Web自动化测试的主要区别就在Driver不一样。
举一个例子,如果我们需要用Google Chrome来跑Selenium的自动化测试,那么首先需要一个ChromeDriver。如果需要跑在IE上,那么需要一个IEDriver。那么现在需要在移动端比如Android里跑Selenium,这时候你需要一个Appium就够了,它担当了Driver的角色。Appium实现了一套标准的WebDriver,只要Appium服务起来之后,你的代码只需要和Appium交互,Appium会去告诉设备该干嘛干嘛。这里提到的设备可以是iOS或者Android,甚至是Windows Phone 和Firefox OS。
Appium 官网: http://appium.io/
安装方式一: 使用NodeJS 安装
首先到NodeJS官网下载安装最新的NodeJS,Windows下属于傻瓜安装。安装好之后你可以配置NodeJS的安装源,在国内一般都用taobao的镜像,速度还不错。
在个人目录下新建一个 .npmrc 文件,写入:
1 | registry=https://registry.npm.taobao.org/ |
然后使用npm命令安装 Appium
1 | npm install -g appium |
建议顺便安装一下appium-doctor,通过运行appium-doctor命令可以快速检查appium的环境问题。
1 | npm install -g appium-doctor |
如果安装成功,那么就可以通过 appium
命令启动appium server。
转存失败重新上传取消
关闭命令行或者按 Ctrl - C 就可以停止 Appium Server。
安装方式二: 使用Appium安装包
网上很多教程所引导的Appium安装包一般在百度网盘或者bitbucket里,其实这两者都不是最新的。最新版的安装包应该从官网下载,Appium 目前托管在github,正确的下载地址应该为:
最新版的Appium 桌面安装后启动是这样的。
转存失败重新上传取消
功能上和老的版本没太大区别,但是日志和UI显示更加清晰,一旦错误发生让你更容易找到问题所在。
转存失败重新上传取消
注意,你可以不安装Appium 桌面版,但是命令行版应该还是需要安装的,因为自动化测试运行时一般都是通过命令启动和关闭Appium,桌面版并不提供命令行功能,只是为了调试方便。
关于Appium的介绍,这里有一份非常好的文档:http://appium.io/slate/cn/master
必要的环境变量设置
如果你已经安装了appium-doctor,那么你只要运行appium-doctor命令就可以知道你还需要设置哪些环境变量,比如:
正在上传…重新上传取消
不要慌,其实你只需要设置以下环境变量:
环境变量 | 值 |
---|---|
ANDROID_HOME | Android SDK 的安装位置 |
JAVA_HOME | JDK 或者 JRE 的安装位置 |
加入 PATH | %ANDROID_HOME%\tools |
加入 PATH | %ANDROID_HOME%\platform-tools |
加入 PATH | %JAVA_HOME%\bin |
加入 PATH | %ANDROID_HOME%\build-tools\??version?? (可选) |
最后一个环境变量是为了更方便地使用aapt这个工具,完成环境变量配置后你可以再次运行appium-doctor进行检查。不出意外,你应该能通过检查。
Node.js测试用例
"use strict"; require("./helpers/setup"); var wd = require("wd"), _ = require('underscore'), serverConfigs = require('./helpers/appium-servers'); describe("android simple", function () { this.timeout(300000); var driver; var allPassed = true; before(function () { var serverConfig = process.env.npm_package_config_sauce ? serverConfigs.sauce : serverConfigs.local; driver = wd.promiseChainRemote(serverConfig); require("./helpers/logging").configure(driver); var desired = process.env.npm_package_config_sauce ? _.clone(require("./helpers/caps").android) : _.clone(require("./helpers/caps").android); // desired.app = require("./helpers/apps").taobaoApp; if (process.env.npm_package_config_sauce) { desired.name = 'android - simple'; desired.tags = ['sample']; } return driver .init(desired) .setImplicitWaitTimeout(3000); }); after(function () { return driver .quit() .finally(function () { if (process.env.npm_package_config_sauce) { return driver.sauceJobStatus(allPassed); } }); }); afterEach(function () { allPassed = allPassed && this.currentTest.state === 'passed'; }); it("should find an element", function () { return driver .elementByAccessibilityId('Graphics') .click() .elementByAccessibilityId('Arcs') .should.eventually.exist .back() .elementByName('App') .should.eventually.exist .elementsByAndroidUIAutomator('new UiSelector().clickable(true)') .should.eventually.have.length(12) .elementsByAndroidUIAutomator('new UiSelector().enabled(true)') .should.eventually.have.length.above(20) .elementByXPath('//android.widget.TextView[@text=\'API Demos\']') .should.exists; }); });
caps.js
exports.android = { // browserName: '', 'appium-version': '1.7.2', platformName: 'Android', platformVersion: '5.1', deviceName: 'emulator-5554', appActivity:'com.taobao.tao.homepage.MainActivity3', appPackage:'com.taobao.taobao' // app: undefined // will be set later };