Транспортир и угловой: Как проверить две страницы в приложении, одну за другой?
Я хотел бы запустить тесты транспортира на двух отдельных страницах в моем приложении Angular: /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
запускаются параллельно. Как я могу форсировать следующую последовательность событий, все еще структурируя код разумным образом?
- нагрузка страница панели мониторинга
- войти
- запуск тестов панели мониторинга
- загрузить страницу статьи (предположим, что мы уже вошли в систему)
- выполнить тесты статьи
4 ответа:
describe('my app', function(){ beforeEach(function(){ login()... }) describe('dashboard'); describe('the article widget') });
Вы можете переместить логин в другой файл.
Затем в файле конфигурации транспортира выполните следующее:
exports.config = { specs: [ 'spec/login.js', 'spec/dashboard_test.js', 'spec/article_test.js' ], ... };
Вход в систему будет выполняться перед другими тестами
Документация по транспортиру рекомендует
Поместите код входа в систему в функцию
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