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

Я хотел бы запустить тесты Protractor на двух отдельных страницах в моем 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

describe('my app', function(){
    beforeEach(function(){
        login()...
    })
    describe('dashboard');
    describe('the article widget')
});

Ответ 2

Вы можете переместить логин в другой файл.

Затем в файле конфигурации вашего транспортира выполните следующее:

exports.config = {
  specs: [
    'spec/login.js',
    'spec/dashboard_test.js',
    'spec/article_test.js'
  ],
  ...
};

Вход будет выполняться перед другими тестами

Ответ 3

Документация Отслеживание рекомендует

введите ваш код входа в функцию 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 done.
    // For the test app login, we know it done when it redirects to
    // index.html.
    return browser.driver.wait(function() {
       return browser.driver.getCurrentUrl().then(function(url) {
          return /index/.test(url);
       });
    }, 10000);
}

Ответ 4

У меня была аналогичная проблема с моими тест-машинами e2e. Описания блоков выполнялись параллельно, в результате чего мои тесты терпели неудачу.

Мой код перед исправлением был примерно таким:

describe('test1', function() {
  it('do foo1', function() {..});
  describe('do test1', function() {..});
});
describe('test2', function() {
  it('do foo2', function() {..});
  describe('do test2', function() {..});
});

Оба блока описания выполнялись параллельно, в результате чего мои тесты терпели неудачу. Исправление заключалось в том, чтобы заключить блоки в описываемых блоках.

Код после исправления:

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() {..});
});

Ссылка на аналогичную проблему в gractub транспортитора: https://github.com/angular/protractor/issues/592