Транспортир и угловой: Как проверить две страницы в приложении, одну за другой?


Я хотел бы запустить тесты транспортира на двух отдельных страницах в моем приложении 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 запускаются параллельно. Как я могу форсировать следующую последовательность событий, все еще структурируя код разумным образом?

  1. нагрузка страница панели мониторинга
  2. войти
  3. запуск тестов панели мониторинга
  4. загрузить страницу статьи (предположим, что мы уже вошли в систему)
  5. выполнить тесты статьи
4 10

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