Brine
Brine

Reputation: 3731

Fixing waits in Protractor 2.0 with ExpectedCondition

Due to Protractor 2.0's breaking changes, I have to refactor my at() function. I use this on non-angular pages to both wait for the page to load, and return true, so it's expectable (if that's a word).

Because 2.0 no longer returns a promise from a locator, it's breaking my wait (wait fires immediately). Thus, I've turned to the new ExpectedConditions... which works fine. My question is, am I using this correctly, or is there a better solution?

Page object locator:

this.pageLoaded = $('div#splash[style="display: none;"]');

Works in Protractor 1.8.0 (breaks in 2.0.0):

this.at = function() {
    var that = this;
    return browser.wait(function() {
        return browser.isElementPresent(that.pageLoaded);
    });
};

My working solution for Protractor 2.0.0:

this.at = function() {
    var that = this;
    return browser.wait(function() {
        return protractor.ExpectedConditions.presenceOf(that.pageLoaded);
    });
};

And for example, I would call this like so:

expect(mainPage.at()).toBeTruthy();

Upvotes: 3

Views: 1041

Answers (1)

Ryan Gross
Ryan Gross

Reputation: 6515

It looks like there was another breaking change in the Protractor 2.0 changelog, referring to a problem in WebDriver 2.45 that makes the wait parameter required:

Due to changes in WebDriverJS, wait without a timeout will now default to waiting for 0 ms instead of waiting indefinitely.

Before:

browser.wait(fn); // would wait indefinitely

After:

browser.wait(fn, 8000) // to fix, add an explicit timeout

This will be reverted in the next version of WebDriverJS.

In our Protractor tests, we always refer to a common helper class var helper = require("..\helpers.scenario.js"). To fix this problem, we just wrapped browser.wait in the helper class and passed in a timeout.

wait: function(f) {
    return browser.wait(f, 30000);
},

We then used find-replace to change from browser.wait to helper.wait.

Upvotes: 2

Related Questions