前段时间在做E2E测试,项目用的框架是angular,所以就用了官方推荐的protractor。
学习protractor
查看官方文档
全局安装protractor
官方文档上有具体的步骤。
我在安装过程中碰到了如下的问题:
(1) webdriver-manager update 时提示错误 “webdriver-manager: command not found”
解决办法:./node_modules/protractor/bin/webdriver-manager(protractor全局安装的路径) update
(2) webdriver-manager start “Unsupported major.minor version 52.0”
解决办法:升级jdk1.7 到 jdk1.8
protractor.conf.js
常用参数解释
(1) framework: 测试框架jasmine、mocha等
(2) specs: 默认执行的测试
specs: ['e2e/test/*.js']
protractor protractor.conf.js 命令会执行这个配置下的测试
(3) suites: 配置每一个用例单独执行
suites: {
login: 'e2e/test/login_fuction_spec.js'
}
protractor protractor.conf.js –suite login 命令会执行login_fuction_spec的测试
(4) directConnect: true/false,true表示直接使用浏览器
(5) capabilities:
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['no-sandbox']
}
}
browserName:directConnect为true时,使用的浏览器。
(6) mochaOpts: framework是mocha时的参数配置,可以设置超时时间。
mochaOpts: {
reporter: 'spec',
timeout: 60000
}
(7)完整的protractor.conf.js
exports.config = {
framework: 'mocha',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['e2e/test/*.js'],
suites: {
login: 'e2e/test/login_fuction_spec.js'
},
directConnect: true,
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['no-sandbox']
}
},
mochaOpts: {
reporter: 'spec',
timeout: 60000
}
};
断言库
使用chai + chai-as-promised
(1) npm install chai
(2) npm install chai-as-promised
(3) 因为protractor API 返回结果都是promise对象,要直接对结果进行断言,就要用到chai-as-promised。
let cls = element(by.css('.cls'));
expect(cls.isPresent()).to.eventually.equal(false);
一般情况
expect(true).to.equal(true);
遇到的问题
(1) window.angular is not defined
describe('BDS login', () => {
protractor.browser.get('http://xxx.com');
it('visible', () => {
let modal = element(by.id('xxx'));
expect(modal.isDisplayed()).to.eventually
.equal(true);
});
}
window.angular is not defined.
这是因为测试先于页面加载执行了。
解决办法,先保证页面加载完成
describe('BDS login', () => {
before('get page before do test', function () {
protractor.browser.get('http://xxx.com');
});
it('visible', () => {
let modal = element(by.id('xxx'));
expect(modal.isDisplayed()).to.eventually
.equal(true);
});
}
before/beforeEach
before: 最早执行。在其中可以完成测试的所有前置条件,包括页面加载啊,登录啊。
import { browser, element, by } from 'protractor';
let chai = require('chai');
let chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
let expect = chai.expect;
let login = require('./doLogin');
describe('Create Project', () => {
before('before do test', function () {
login.loginsuccess();
});
}
beforeEach: 每个用例之前都要执行一次。