需要 oauth 身份验证的 e2e 量角器测试

需要 oauth 身份验证的 e2e 量角器测试

问题描述:

我有一个 Angular 应用程序,需要通过 Google 进行身份验证、授予某些范围等,我正在尝试为其设置自动 e2e 测试.我的量角器总体上对我来说很好用,但是当我们进入 google auth 页面、登录并重定向时,量角器无法通过测试,因为文档在等待结果时被卸载".

I've got an Angular app that requires authentication with Google, granting of some scopes, etc, and I'm trying to set up automatic e2e tests for it. I have protractor working well for me in general, but when we get to the google auth page, login, and get redirected, protractor fails the test because "document unloaded while waiting for result."

有没有什么工具或技术可以让我在每次测试之前验证 Google 开发帐户的身份?

Is there a tool or technique I can use to authenticate to a development google account beforeEach test?

如果我能让框架保持一秒钟,而普通旧的 webdriver 驱动登录,并且只有在我到达我的目标页面后才真正激活 angular 的东西,那将是完美的!

If I could just get the framework to hold on for a second while plain-old webdriver drives the login, and only really activate the angular stuff after I get to my target page, that would be perfect!

关键是使用browser.driver.get 而不是browser.get,并且使用browser.driver.sleep(someMilliseconds) 在使用特定于角度的命令之前让角度加载到您的最终目的地.

The key is to use browser.driver.get instead of browser.get, and to use browser.driver.sleep(someMilliseconds) to let angular load at your final destination before using the angular-specific commands.

这是我的工作量角器规范,首先向 Google 授权,然后在中继器中计算项目:

Here's my working protractor spec that first authorizes to Google and then counts the items in a repeater:

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('user@googleappsdomain.com');

    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);
    });

});