量角器循环无法单击正确的项目

时间:2016-02-06 08:55:54

标签: javascript protractor

循环并尝试打印到控制台,我的选择和点击无法正常工作。我的每个列表项都有文本,列表项本身是可点击的。我试图遍历列表以匹配文本(choice_item),如果匹配则打印到控制台并单击该项。

但是当我检查输出时,它会点击它之后的下一个项目。 例如,它将打印:

第1项

第2项

选择发现:第2项

第3项

然后单击项目3而不是项目2(我想在列表中找到的choice_item)。任何有关如何解决这个和/或控制流程错误的解释将不胜感激!

this.getListItems = function(choice_item){
    var choice = "";
    this.getSelectionsList().filter(function(elem, index) {
        return elem.element(by.css('.choicename')).getText().then(function(text) {
            if(text === choice_item){
                console.log("choice found:"+ choice_item);
                choice = text;
                elem.click();
                return true;
            }
        });
    }).then(function(items) {
        expect(choice).toBe(choice_item);
    });
};

2 个答案:

答案 0 :(得分:2)

....addConverterFactory(GsonConverterFactory.create(gson)) 文字过滤元素,然后点击它:

choice_item

请注意,此处不需要this.getListItems = function(choice_item) { var listItems = this.getSelectionsList().filter(function(elem) { return elem.element(by.css('.choicename')).getText().then(function(text) { return text === choice_item; }); }); listItems.first().click(); }; ,因为您在过滤列表项时已经应用了expect()检查。

答案 1 :(得分:1)

我认为这是一个控制流错误。 试试这个:

this.getListItems = function(choice_item){
    var choice = "";
    this.getSelectionsList().filter(function(elem, index) {
        return elem.element(by.css('.choicename')).getText(); //it returns promise

    }).then(function(text) {
        //getText() Promise fulfill
        if(text === choice_item){
            console.log("choice found:"+ choice_item);
            choice = text;
            elem.click();
            browser.sleep(2000);
            expect(choice).toBe(choice_item);
        }

    });
};

点击方法的最佳方式。做工厂功能,例如:

var click1 = function (element){
    element.click();
    return new Promise (function (fulfill, reject){
      setTimeout(function(){
      fulfill();
      },2000);
    }    
});

你可以使用它:

click1(elem).then(function (){
 //the code
});

但是在您的代码中,click()事件不会影响任何内容,因为getText()早于click()