2014-01-06 7 views
14

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

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

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

ответ

17

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

Вот мой рабочий транспортир спецификации, что первый дает право на 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); 
    }); 

}); 
+0

спасибо, помогли с подобным вопросом я имел – flaky

+0

Я использовал бы просачивание в испытаниях транспортира в качестве последнего ресурса. – demee

+0

Вместо того, чтобы спать в течение неопределенного времени, почему бы не дождаться изменения элемента в DOM? – LeeGee

3

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

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

/* 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(); 
     }); 
    }); 
    }); 
+0

Извините за долгое время до комментария, но что такое mainPage и loginPage? Они нигде не определены. – tcoulson

+0

mainPage и logingPage - это в основном ваши объекты страницы, которые могут быть у вас в тестировании фреймворка ... хотя вы можете просто удалить эти переменные, и код будет иметь схожий смысл. – demee

+0

Итак, как насчет переменной googlePage - как я могу использовать первый кода, в настоящее время я имею его в другом файле, который вызывается в спецификациях. Это правильно - извините за вопросы newb, я, вероятно, мог бы использовать чат. – tcoulson