web-dev-qa-db-ja.com

oauth認証を必要とするe2e分度器テスト

Angular Googleでの認証、一部のスコープの付与などが必要なアプリがあり、自動e2eテストを設定しようとしています。分度器がうまく機能しています。一般的には、Google認証ページにアクセスしてログインし、リダイレクトされると、「結果を待っている間にドキュメントがアンロードされた」ため、分度器はテストに失敗します。

各テストの前に開発Googleアカウントへの認証に使用できるツールまたは手法はありますか?

昔ながらのWebドライバーがログインを駆動している間、フレームワークを1秒間保持し、ターゲットページに到達した後にangularのものだけを実際にアクティブ化することができれば、それは完璧です。 !!

19
Riley Lark

重要なのは、_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);
    });

});
_
20
Riley Lark

私は私のためにすべての仕事をする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();
      });
    });
  });
7
demee