Hassan Mehmood
Hassan Mehmood

Reputation: 1402

browser.get returning before the given URL completely loads using Protractor

I'm using Protractor with Cucumber to write some tests but I'm stuck at some point. In step after login, I'm rerouting to another page using browser.get(url) function provided by protractor. But it always returns before the page is completely loaded. I have tried many solutions so far but no luck. I have tried with browser.wait, browser.get(url).then(function(){ // code when it loads}) but Im getting 0 positive results.

Here's my code:

  // Steps will be implemented here
  this.Given(/^I am logged in as user \'([^\']*)\'$/, function (user, callback) {
    console.log('USER: ' + user);
    browser.driver.get('https://cit-was70-l06/ipa')
    browser.driver.findElement(by.xpath('my_xpath')).sendKeys(user);
    browser.driver.findElement(by.xpath('my_xpath')).sendKeys(user);
    browser.driver.findElement(by.xpath('my_xpath')).click().then(callback);
  });

  this.Then(/^The screen is shown, with title \'([^\']*)\'$/, function (title, callback) {
    console.log('Title from feature file: ' + title);
    var url = 'some/url/in/application/';
    browser.get(url).then(function(){
      // This portion executes before page is completely loaded.
      // So if I try to get any element, it throws me an error.
      // [15:32:13] E/launcher - "process.on('uncaughtException'" error, see 
      // launcher
      // [15:32:13] E/launcher - Process exited with error code 199
      // It works if I add static delay to wait for page load completely
      // but that will not be a good solution if I have too much pages to test
      callback();
    });
    console.log('After page laoad');
  });

Any suggested work around will be much appreciated.

Upvotes: 0

Views: 1549

Answers (3)

Optimworks
Optimworks

Reputation: 2547

Use protractor.ExpectedConditions to check visibility of any elements on page which will be displayed after successful login. Write a customized method as shown below.

If element displayed, then navigate other page using browser.get();

Code Snippet

 EC = protractor.ExpectedConditions;
 //targetElement=element(locator);
 this.isElementVisible = function (targetElement, timeOut) {
   'use strict';
   timeOut = timeOut !== undefined ? timeOut : 8000;
   browser.wait(EC.visibilityOf(targetElement), 
      timeOut).thenCatch(function()   
       {
        assert.fail(' element is not visible');
      });
 };

Upvotes: 0

Raphael
Raphael

Reputation: 1812

Try the below code.check whether it helps.

browser.get(url);
browser.waitForAngular();
then try to call your function.

Upvotes: 0

Ram Pasala
Ram Pasala

Reputation: 5231

  [15:32:13] E/launcher - "process.on('uncaughtException'" error, see launcher
  [15:32:13] E/launcher - Process exited with error code 199

The above error can be caused due to various reasons mostly related to promises. But it should throw the correct message. There is already a work around provided here https://github.com/angular/protractor/issues/3384 to catch the exact error message.

You could change the launcher.ts file in your protractor dependency as mentioned in above forum to catch the error inorder to debug your issue.

And I would suggest you to return your promises instead of callbacks when writing step definitions in protractor-cucumber, in this way cucumber would know when to complete its async actions.

Upvotes: 2

Related Questions