如何用 javascript 编写测试脚本
May 11, 2021 · View on GitHub
在理论上 Appium 支持使用任何编程语言编写测试,而且提供了常见编程语言客户端库。
不过我个人觉得 javascript(nodejs) 是最好的选择,这里介绍一下使用 javascript 编写 AWTK 自动测试程序的过程和方法:
1 创建测试项目
1.1 在当前项目中创建 uitests 目录,然后进入 uitests 目录:
mkdir uitests
cd uitests
1.2 新建 package.json 文件,可根据以下内容进行修改:
{
"name": "uitests",
"version": "1.0.0",
"description": "awtk ui tests",
"main": "index.js",
"scripts": {
"test": "mocha index.js"
},
"devDependencies": {
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
"colors": "^1.4.0",
"mocha": "^8.1.1",
"q": "^1.5.1",
"underscore": "^1.10.2",
"wd": "^1.12.1"
},
"dependencies": {
"awtk-appium-js-helpers": "git+https://github.com/zlgopen/awtk-appium-js-helpers.git"
},
"keywords": [
"awtk",
"appium"
],
"author": "xianjimli@hotmail.com",
"license": "LGPL-2.0"
}
1.3 创建 index.js
index.js 以下面的内容为模板:
"use strict";
let Q = require('q');
let wd = require("wd");
let _ = require('underscore');
require("awtk-appium-js-helpers/setup.js");
let serverConfigs = require('awtk-appium-js-helpers/appium-servers');
let startApp = require("awtk-appium-js-helpers/start-app").startApp;
const appName = '../bin/demo'
describe("awtk", function () {
let driver;
let allPassed = true;
this.timeout(300000);
before(async function () {
let serverConfig = serverConfigs.local;
driver = wd.promiseChainRemote(serverConfig);
require("awtk-appium-js-helpers/logging").configure(driver);
await startApp(appName);
let desired = _.clone(require("awtk-appium-js-helpers/caps").awtk);
return driver.init(desired);
});
after(function () {
return driver.quit()
});
afterEach(function () {
allPassed = allPassed && this.currentTest.state === 'passed';
});
it("demo", function () {
});
});
appName 需要根据实际情况进行调整
const appName = '../bin/demo'
1.4 安装依赖包
npm install
1.5 运行测试
npm run test
2 编写测试程序
2.1 基本用法
这里使用了流行 js 测试框架 mochajs,最好看看相关文档,其实很简单,几分钟时间就熟悉了。
每个 it 是一个测试用例,把测试代码放在其中:
it("demo", function () {
});
如:
it("set text", function () {
return driver.elementById('info').setText("AWTK")
.elementById('info').text().should.become("AWTK");
})
driver 对象是测试程序客户端的对象,通过它调用测试函数。
- 示例:获取控件文本
it("text", function () {
return driver.elementById('info').text().should.become("Hello");
});
- 示例:获取控件属性
it("get x", function () {
return driver.getAttribute('title', 'x').should.become(10);
});
- 示例:修改控件的文本
it("set text", function () {
return driver.elementById('info').setText("AWTK")
.elementById('info').text().should.become("AWTK");
});
- 示例:点击按钮
it("click start", function () {
return driver.elementById('start').click().sleep(1000)
.elementById('info').text().should.become("Start");
});
- 示例:关闭窗口
it("click new back", function () {
return driver.elementById('new').click().sleep(1000).back().sleep(1000)
});;
更多示例请参考:uitests/index.js
2.2 注意事项
-
需要操作的控件都提供窗口内唯一的名称。不要使用 XPath 选择元素,XPath 写死了文档结构,不便于维护,所以 AWTK 测试引擎只提供了按名称选择控件。
-
为方便阅读代码,对每一个控件的测试,放到一行内,以 elementById 打头:
return driver.elementById('info').setText("AWTK")
.elementById('info').text().should.become("AWTK");
- 打开/关闭窗口后,调用 sleep(1000),确保窗口动画完成。
return driver.elementById('new').click().sleep(1000).back().sleep(1000)
- 窗口和控件重名的问题。比如窗口名为 fullscreen,其上有一个控件名也为 fullscreen。可以用下面两种方式定位控件。
- fullscreen.fullscreen
- .fullscreen
.elementById('.fullscreen').click().sleep(100)