Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

e2e protractor test requiring oauth authentication

Tags:

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."

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

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!

like image 952
Riley Lark Avatar asked Jan 06 '14 21:01

Riley Lark


1 Answers

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.

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('[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);     });  }); 
like image 135
Riley Lark Avatar answered Sep 17 '22 18:09

Riley Lark