如何从头编写你的 Macaca 用例
发布于 4 天前 作者 tsj1107 270 次浏览 来自 分享

前置条件

  • 安装环境
  • 新建一个 Macaca 工程目录,macaca-client 会默认跑 macaca-test 文件夹下所有 .test.js 为后缀的文件。
| -- README.md
| -- macaca-test
| 	  | -- lib
|       	| -- webdriver-client.js
|     | -- macaca-pc.test.js
|     | -- macaca-mobile.test.js  
| -- package.json
  • 配置你的 package.json 文件, 最重要的是需要配置开发环境的依赖 devDependencies
{
	"name": "macaca-test-sample",
  	"version": "0.1.0",
  	"description": "macaca-test-sample",
  	"keywords": [
    	"sample"
  	],
  	"dependencies": {
  	},
  	"devDependencies": {
    	"wd-next": "*",
    	"macaca-chromedriver": "*",
    	"wd": "*"
  	},
  	"author": "your name",
  	"email": "your email",
  	"license": "MIT"
}
  • 在项目根目录下执行 cnpm i 安装 node 模块

你要测什么?

A. PC(跳到1) B. iOS/Android(跳到2)

1. 桌面浏览器端测试

  • PC 用例 API:wd-next 是我们用 Node.js 对 selenium-webdriver 做了一层封装,接口与 WebDriver 标准统一。
  • 引用 macaca-chromedriver ,这是我们用 Node.js 对 ChromeDriver 进行的封装,ChromeDriver 最终会根据参数实例化一个 WebDriver 实例,你最终看到的就是运行了一个 standalone 的 Chrome 浏览器。
// 文件 macaca-pc.test.js
var path = require('path');
var wd = require('wd-next');  // 引用 wd-next
var macacachromedriver = require('macaca-chromedriver'); // 引用 macaca-chromedriver

module.exports = (options) => {
  var binPath = macacachromedriver.binPath;
  process.env.PATH = `${process.env.PATH}:${path.dirname(binPath)}`;
  
  return wd;
};

  • 查询 wd-next 编写测试用例。编写用例前,一定要先初始化一个 promise wd.initPromiseChain(),之后 it 中的所有用例的方法都是使用 promise 链式调用方法
// 文件 macaca-pc.test.js
var path = require('path');
var wd = require('wd-next');  // 引用 wd-next
var macacachromedriver = require('macaca-chromedriver'); // 引用 macaca-chromedriver

module.exports = (options) => {
  var binPath = macacachromedriver.binPath;
  process.env.PATH = `${process.env.PATH}:${path.dirname(binPath)}`;
  
  /*
  * 开始编写测试用例
  */
  describe('macaca desktop sample', function () {
    this.timeout(5 * 60 * 1000);

    const driver = wd.initPromiseChain(); // 初始化一个promise
    const initialURL = 'https://www.baidu.com';

    before((done) = > {
      return driver
          .init()
          .setNormalSize()
          .end(done);
    });

    it('#0 should go into macaca', function () {
      return driver
          .get(initialURL)
          .sleep(3000);
    });

    it('#1 should works with macaca', function () {
      return driver
          .elementById('kw')
          .sendKeys('macaca')
          .sleep(3000)
          .elementById('su')
          .click()
          .sleep(5000)
          .source()
          .then(function (html) {
            html.should.containEql('macaca');
          })
          .takeScreenshot();
    });
  });
  
  return wd;
};

  • 在工程根目录下执行命令行 macaca run Bravo! 就可以看到啦~

2. 移动端测试

  • iOS/Android 用例API: 我们推荐使用 wd.js 或者 webdriverio
  • 建议可以根据自己的 APP 封装一层自己的 webdriver-client, 同时适配 iOS 和 Android。在 macaca-test/lib/ 下新建文件 webdriver-client.js,以 login 为例

iOS 代码实现如下:

module.exports = function(username, password) {
  return this
    .waitForElementByXPath('//UIATextField[1]')
    .sendKeys(username)
    .waitForElementByXPath('//UIASecureTextField[1]')
    .sendKeys(password)
    .sleep(1000)
    .sendKeys('\n')
    .waitForElementByName('Login')
    .click()
    .sleep(5000);
};

但是由于 Android 下元素名会不同,实现如下:

module.exports = function(username, password) {
  return this
    .waitForElementsByClassName('android.widget.EditText', {}, 120000)
    .then(function(els) {
      return els[0];
    })
    .sendKeys(username)
    .sleep(1000)
    .elementsByClassName('android.widget.EditText')
    .then(function(els) {
      return els[1];
    })
    .sendKeys(password)
    .sleep(1000)
    .waitForElementByName('Login')
    .click()
    .sleep(5000);
};

可以查看我们已经写好的例子。 注意!这不是通用的 webdriver-client ,你需要根据自己的 APP 封装出自己的 webdriver-client。

  • 引入你的 webdriver-client 模块,查询 wd.js, 开始编写用例。
// 这里是 wd 实例初始化
var wd = require('./lib/webdriver-client')({
  platformName: platform,
  app: 'path/to/your/app'
});

describe('macaca mobile sample', function() {
  this.timeout(5 * 60 * 1000);

  var driver = wd.initPromiseChain();

  before(function() {
    return driver.initDriver();
  });

  after(function() {
    return driver
      .sleep(1000)
      .quit();
  });

  it('#1 should login success', function() {
    return driver
      .login('12345678', '111111')
      .sleep(1000);
  });

  ...
  
});

  • 在工程根目录下执行命令行 macaca run --server 用例就可以跑起来了。

最后

iOS效果 https://testerhome.com/topics/4359

Android效果 https://testerhome.com/topics/4442

PC效果 https://testerhome.com/topics/4523

4 回复

使用过程中遇到点问题啊…好复杂… 楼主可以加个微信吗?

楼主很受欢迎

@alsotang

使用过程中遇到点问题啊…好复杂…
楼主可以加个微信吗?

使用过程中任何问题可以 来此 提issue,我们会及时回复

回到顶部