2014-01-06 2 views
14

Google과의 인증, 일부 범위 부여 등의 각도 응용 프로그램이 있는데이를 위해 자동 e2e 테스트를 설정하려고합니다. 나는 일반적으로 나를 위해 잘 작동하는 각도기를 가지고 있지만 Google 인증 페이지, 로그인 및 리다이렉션에 도달 할 때 "문서가 결과를 기다리는 동안 언로드 되었기 때문에 각도기가 테스트에 실패합니다."oauth 인증을 요구하는 e2e 각도기 테스트

이전에 개발 용 Google 계정 인증에 사용할 수있는 도구 나 기술이 있습니까?

평범한 webdriver가 로그인을 구동하는 동안 프레임 워크를 얻을 수 있고 내 타겟 페이지에 도착한 후에 앵글 액티브 만 활성화하면 완벽 할 것입니다.

답변

17

열쇠는 browser.get 대신 browser.driver.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

저는 마지막 리소스로서 각도기 테스트에서 seeps를 사용할 것입니다. – demee

+0

DOM에서 요소가 변경 될 때까지 기다리지 않는 이유는 무엇입니까? – LeeGee

3

내가 나를 위해 모든 일을 (아래) 구글 인증 페이지 개체가 있습니다.

여기의 키는 "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(); 
     }); 
    }); 
    }); 
+0

댓글까지 오랜 시간 동안 죄송 합니다만, mainPage와 loginPage는 무엇입니까? 그것들은 어디에도 정의되어 있지 않습니다. – tcoulson

+0

mainPage 및 logingPage는 기본적으로 프레임 워크를 테스트하는 데 사용할 수있는 페이지 객체입니다 ... 그 변수를 제거하면 코드가 비슷한 의미를 갖습니다. – demee

+0

그래, googlePage 변수는 어떻게 될까요? 코드, 나는 현재 사양에서 호출되면 다른 파일에 있습니다. 맞습니다 - newb 질문에 유감스럽게 생각합니다. 아마 채팅을 사용할 수 있습니다. – tcoulson