тест транспортира e2e, требующий аутентификации oauth

У меня есть приложение Angular, для которого требуется аутентификация в Google, предоставление некоторых областей действия и т. д., и я пытаюсь настроить для него автоматические тесты e2e. В целом у меня транспортир работает хорошо, но когда мы попадаем на страницу аутентификации Google, входим в систему и получаем перенаправление, транспортир не проходит тест, потому что «документ выгружается в ожидании результата».

Есть ли инструмент или метод, который я могу использовать для аутентификации в учетной записи Google перед каждым тестом?

Если бы я мог просто заставить фреймворк задержаться на секунду, пока старый простой веб-драйвер управляет входом в систему, и действительно активировать угловые вещи только после того, как я попаду на свою целевую страницу, это было бы идеально!


person Riley Lark    schedule 06.01.2014    source источник


Ответы (3)


Ключ в том, чтобы использовать browser.driver.get вместо browser.get и использовать browser.driver.sleep(someMilliseconds), чтобы разрешить угловую загрузку в конечном пункте назначения перед использованием специфичных для angular команд.

Вот моя рабочая спецификация транспортира, которая сначала авторизуется в Google, а затем подсчитывает элементы в повторителе:

it('allows the user to add new slides', function () {
    browser.driver.get('http://localhost:3000/editor/?state=%7B"action":"create"%7D');

    // at this point my server redirects to google's auth page, so let's log in
    var emailInput = browser.driver.findElement(by.id('Email'));
    emailInput.sendKeys('[email protected]');

    var passwordInput = browser.driver.findElement(by.id('Passwd'));
    passwordInput.sendKeys('pa$sWo2d');  //you should not commit this to VCS

    var signInButton = browser.driver.findElement(by.id('signIn'));
    signInButton.click();

    // we're about to authorize some permissions, but the button isn't enabled for a second
    browser.driver.sleep(1500);

    var submitApproveAccess = browser.driver.findElement(by.id('submit_approve_access'));
    submitApproveAccess.click();

    // this nap is necessary to let angular load.
    browser.driver.sleep(10000);

    // at this point the protractor functions have something to hook into and 
    // will work as normal!
    element(by.id('new-slide-dropdown-trigger')).click();
    element(by.id('new-text-slide-trigger')).click();

    var slideList = element.all(by.repeater('slide in deck.getSlides()'));
    slideList.then(function(slideElements) {
        expect(slideElements.length).toEqual(1);
    });

});
person Riley Lark    schedule 07.01.2014
comment
Я бы использовал просачивание в тестах транспортира в качестве последнего ресурса. - person demee; 23.11.2016
comment
Вместо того, чтобы спать в течение неопределенного времени, почему бы не дождаться изменения элемента в DOM? - person Lee Goddard; 28.09.2017

У меня есть объект страницы Google Auth (ниже), который выполняет всю работу за меня.

Ключ здесь «isAngularSite (false);» функция ведьма инструктирует веб-драйвер, если мы входим на «угловой» или «не угловой» веб-сайт. (реализация ниже).

/* global element, browser, by */

'use strict';

var GOOGLE_USERNAME = '[email protected]';
var GOOGLE_PASSWORD = 'password';
var ec = protractor.ExpectedConditions;

var Google = function () {
  this.emailInput = element(by.id('Email'));
  this.passwordInput = element(by.id('Passwd'));
  this.nextButton = element(by.id('next'));
  this.signInButton = element(by.id('signIn'));
  this.approveAccess = element(by.id('submit_approve_access'));

  this.loginToGoogle = function () {
    var self = this;

    /* Entering non angular site, it instructs webdriver to switch 
       to synchronous mode. At this point I assume we are on google
       login page */ 
    isAngularSite(false); 
    this.emailInput.sendKeys(GOOGLE_USERNAME);
    this.nextButton.click();

    this.passwordInput.isPresent().then(function () {
      browser.wait(ec.visibilityOf(self.passwordInput), BROWSER_WAIT).then(function () {
        self.passwordInput.sendKeys(GOOGLE_PASSWORD);
        self.signInButton.click();
        browser.wait(ec.elementToBeClickable(self.approveAccess), BROWSER_WAIT).then(function () {
          self.approveAccess.click();
          /* Now we are being redirected to our app, switch back to
             async mode (page with angular) */
          isAngularSite(true);
        });
      });
    });
  }
}

module.exports = new Google();

--- кинуть это в protractor.conf.js

onPrepare: function () {
    global.isAngularSite = function (flag) {
      console.log('Switching to ' + (flag ? 'Asynchronous' : 'Synchronous') + ' mode.')
      browser.ignoreSynchronization = !flag;
    },
    global.BROWSER_WAIT = 5000;
  }

--- вот как бы вы его использовали:

it('should login though google', function(done) {
    mainPage.loginBtn.click().
    then(function () {
      loginPage.connectWithGoogleBtn.click();
      googlePage.loginToGoogle();
      browser.wait(mainPage.userName.isPresent()).
      then(function () {
        expect(mainPage.userName.getText()).
        toEqual('[email protected]');
        done();
      });
    });
  });
person demee    schedule 20.11.2015
comment
Извините, что долго не комментировал, но что такое mainPage и loginPage? Они нигде не определены. - person tcoulson; 21.04.2017
comment
mainPage и logingPage - это в основном ваши объекты страницы, которые могут быть у вас в тестовой среде... хотя вы можете просто удалить эти переменные, и код будет иметь аналогичный смысл - person demee; 24.04.2017
comment
Хорошо, а как насчет переменной googlePage - как я могу использовать первый код, сейчас он у меня есть в другом файле, который вызывается в спецификациях. Верно ли это - извините за новые вопросы, я, вероятно, мог бы использовать чат. - person tcoulson; 24.04.2017

Вы должны использовать waitForAngularEnabled для включения/отключения ожидания задач Angular с помощью транспортира. По умолчанию он будет включен. Вы можете использовать следующее:

// do things on your Angular application
// go to external oauth page

waitForAngularEnabled(false)

// login on oauth page and redirect to your Angular application

waitForAngularEnabled(true)
browser.get('/home') // this is a page from your Angular application

waitForAngularEnabled возвращает обещание. Функция browser.get блокируется до загрузки страницы Angular.

person Babyburger    schedule 24.05.2020
comment
Я не знаю, почему за это проголосовали. Можно это уточнить? Ответ, опубликованный Деми и Райли Ларк, работает, но теперь, когда доступно waitForAngularEnabled, мы должны использовать его вместо таймеров сна. Установите слишком большое значение таймера, и ваши тесты займут много времени, установите слишком низкое значение, и ваши тесты могут завершиться неудачно. Этот ответ немедленно продолжит тестирование вашего приложения Angular, как только мы вернемся со страницы oauth. - person Babyburger; 14.06.2020