Protractor和Angular:如何在应用程序中一个接一个地测试两个页面
Protractor and Angular: How to test two pages in an app, one after the other?
我想在我的Angular应用程序中的两个独立页面上运行Protractor测试:/dashboard
和/articles
。
复杂的是我必须手动登录应用程序。
目前我有这样的设置:
var LoginPage = function() {
ptor = protractor.getInstance();
this.login = function(url) {
ptor.get(url);
ptor.findElement(protractor.By.model('email')).sendKeys(config.LOGIN_EMAIL);
ptor.findElement(protractor.By.model('password')).sendKeys(config.LOGIN_PASS);
ptor.findElement(protractor.By.tagName('button')).click();
};
};
describe('The dashboard', function() {
console.log('logging in');
var loginPage = new LoginPage();
loginPage.login(config.DASHBOARD_URL);
console.log('logged in');
it('has a heading', function() {
console.log('testing dashboard 1');
heading = ptor.findElement(protractor.By.tagName('h1'));
expect(heading.getText()).toEqual(config.DASHBOARD_HEADING);
});
});
describe('The article widget', function() {
console.log('logging in');
var loginPage = new LoginPage();
loginPage.login(config.ARTICLE_URL);
console.log('logged in');
it('has a heading', function() {
console.log('testing article 1');
heading = ptor.findElement(protractor.By.tagName('h1'));
expect(heading.getText()).toEqual(config.ARTICLES_HEADING);
});
});
这给了我以下输出:
Selenium standalone server started at http://192.168.2.9:56791/wd/hub
logging in
LoginPage
logged in
logging in
LoginPage
logged in
testing dashboard 1
Ftesting article 1
看起来describe
的两个部分是并行启动的。如何在以合理的方式构建代码的同时,强制执行以下事件序列?
- 加载仪表板页面
- 登录
- 运行仪表板测试
- 加载文章页面(假设我们已经登录)
- 运行文章测试
您可以将登录名移动到另一个文件。
然后,在量角器配置文件中执行以下操作:
exports.config = {
specs: [
'spec/login.js',
'spec/dashboard_test.js',
'spec/article_test.js'
],
...
};
登录将在其他测试之前运行
describe('my app', function(){
beforeEach(function(){
login()...
})
describe('dashboard');
describe('the article widget')
});
Protractor文档推荐
将登录代码放入
onPrepare
函数中,该函数将在任何测试之前运行一次。
例如,在您的protractor.conf
中
onPrepare: function() {
browser.driver.get('http://localhost/login.html');
browser.driver.findElement(by.id('username')).sendKeys('Jane');
browser.driver.findElement(by.id('password')).sendKeys('1234');
browser.driver.findElement(by.id('clickme')).click();
// Login takes some time, so wait until it's done.
// For the test app's login, we know it's done when it redirects to
// index.html.
return browser.driver.wait(function() {
return browser.driver.getCurrentUrl().then(function(url) {
return /index/.test(url);
});
}, 10000);
}
我的e2e量角器测试也遇到了类似的问题。描述块被并行执行,导致我的测试失败。
在修复之前,我的代码类似于:
describe('test1', function() {
it('do foo1', function() {..});
describe('do test1', function() {..});
});
describe('test2', function() {
it('do foo2', function() {..});
describe('do test2', function() {..});
});
两个描述块都是并行执行的,导致我的测试失败。解决方法是将it块封装在描述块中。
修复后的代码:
describe('test1', function() {
describe('foo1', function() {
it('do foo1', function() {..});
});
describe('do test1', function() {..});
});
describe('test2', function() {
describe('foo2', function() {
it('do foo2', function() {..});
});
describe('do test2', function() {..});
});
链接到量角器github上的类似问题:https://github.com/angular/protractor/issues/592
相关文章:
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 一个密码测试程序,如果存在空格,它会提醒用户
- 构建JS测试,警报窗口重复上一个Q,而不是问下一个Q
- 有没有什么干净的方法可以对一组||测试进行编码,看看变量的值是否在其中一个测试中
- 如何编写一个测试来验证函数是否已成功将字符串列表(在数组中指定)打印到屏幕上
- 摩卡只运行一个测试文件
- 使用Javascript在实时网站上创建一个测试环境
- 从另一个测试调用另一个量角器测试
- 当使用(substack's)磁带模块进行测试时,如何在一个文件中只运行一个测试
- Jasmine,一个测试,多个ajax请求(错误:ajax已经被监视)
- 使用php创建一个测试,将数组数据存储在数据库的字段中
- 我创建了一个测试,修改了我在网上找到的代码,但我有一个小问题
- 一个测试有3个部分,其中第一部分必须大如浏览器窗口的jQuery和Javascript
- 避免firefox protractor中多个测试文件中的一个测试
- QUnit:每个方法一个测试,每个方法有多个断言或多个测试
- JS磁带-等待前一个异步测试完成,以移动到下一个测试
- Rails:如何编写一个测试,以确保几个字段在关闭时隐藏,但在打开时显示,并且具有正确的值
- 为什么这个代码工作在一个测试网站,我有,但不是在本地页面或jfillde
- Javascript Koans——不能解决一个测试
- Angular2 和 Karma 运行只有一个测试套件,也就是 describe.only