SreeN
SreeN

Reputation: 33

need help using for loop and getText() in protractor

browser.findElements(protractor.By.repeater('cat in cats')).then(function(rows) {
        for (i = 0; i < rows.length; i++) { //which is always 3
            var tmp = element(by.repeater('cat in cats').row(i)).element(by.binding('cat.name')).getText();
            tmp.then(function(text) {
                console.log('text is : ' + text);
                console.log('iteration number is: ' + i);
                if (text == 'someText') {
                    element(by.repeater('cat in cats').row(i)).element(by.binding('cat.action')).click();
                }
            });
        }

In this case the value of 'i' inside the function is always returning 3. I have get text and then check if the text is what I want and click on an element.

The value of 'i' in the 'if' statement is always returned as 3. Something to do with promises, but I am not sure. Any help with modified code is much appreciated.

Thanks!

Upvotes: 2

Views: 1927

Answers (1)

alecxe
alecxe

Reputation: 473833

Don't call by.repeater() multiple times; instead, use map() and "chain" the promises like this:

element.all(By.repeater('cat in cats')).map(function(elm) {
    return {
        text: elm.element(by.binding('cat.name')).getText(),
        action: elm.element(by.binding('cat.action'))
    };
}).then(function(arr) {
    for (var i = 0; i < arr.length; i++) { 
        if (arr[i].text == 'someText') {
            return arr[i].action;
        }
    }
    throw new Error('Text not found');
}).then(function(elm) {
    elm.click();
});

All of the credits go to @Andres for the solution provided here:

Also see:

Upvotes: 4

Related Questions