Angular Googleでの認証、一部のスコープの付与などが必要なアプリがあり、自動e2eテストを設定しようとしています。分度器がうまく機能しています。一般的には、Google認証ページにアクセスしてログインし、リダイレクトされると、「結果を待っている間にドキュメントがアンロードされた」ため、分度器はテストに失敗します。
各テストの前に開発Googleアカウントへの認証に使用できるツールまたは手法はありますか?
昔ながらのWebドライバーがログインを駆動している間、フレームワークを1秒間保持し、ターゲットページに到達した後にangularのものだけを実際にアクティブ化することができれば、それは完璧です。 !!
重要なのは、_browser.driver.get
_の代わりに_browser.get
_を使用し、browser.driver.sleep(someMilliseconds)
を使用して、angular-を使用する前に最終目的地で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);
});
});
_
私は私のためにすべての仕事をするGoogleAuthページオブジェクト(下)を持っています。
ここで重要なのは「isAngularSite(false);」です。関数witchは、「angular」または「nonangular」のWebサイトにアクセスするかどうかを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();
});
});
});