2014-01-06 56 views
14

我有一個角度的應用程序,要求與谷歌認證,一些示波器等發放,我試圖建立自動端到端測試它。我有量角器一般工作對我來說很好,但是當我們到了谷歌AUTH頁面,登錄名和重定向,量角器測試失敗,因爲「在等待結果的文件卸載。」E2E量角器測試需要OAuth認證

是否有工具或技術,我可以用它來驗證到發展谷歌帳戶beforeEach測試?

如果我能得到的框架,舉行了第二次,而普通老式硬盤的webdriver登錄,只有真正激活角的東西后,我去我的目標網頁,這將是完美的!

回答

17

關鍵是使用browser.driver.get而不是browser.get,並使用browser.driver.sleep(someMilliseconds)在使用角度特定命令之前讓角度加載到最終目的地。

這是我的工作量角器規範,首先授權谷歌和然後計算在中繼器中的項目:

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

我有一個谷歌驗證頁面對象(如下圖),做整個工作對我來說。

這裏的關鍵是 「isAngularSite(假);」如果我們進入'角度'或'非角度'網站,功能女巫會指示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

好的,google.com變量怎麼樣 - 我怎樣才能使用第一個代碼,我目前在另一個文件中被調用。沒錯 - 對於新問題抱歉,我可以使用聊天。 – tcoulson