使用现有定位器单击转发器中的元素

时间:2016-06-28 13:34:47

标签: protractor repeater

我正在测试的应用程序使用转发器输出一个列表,我希望能够找到特定行并单击该行中的编辑按钮。

我正在使用.filter查找相关行,然后单击编辑按钮,但这只有在我指定按钮的定位器时才有效,而不是我指的是现有定义:

this.editWineButton = element(by.buttonText('edit'));

this.editWine = function (wineName) {
    this.wineListEntries.filter(function(row){
        return row.element(by.binding('wine.name')).getText().then(function(name){
            return name === wineName; 
        });
    }).then(function (elem) {   
    //THIS WORKS
        var button = elem[0].element(by.buttonText('edit'));
    //THIS FAILS
        //var button = elem[0].editWineButton;
        button.click();
    });
};

已经为编辑按钮定义了定位器,我需要做些什么才能将其与过滤器的结果一起使用?

当我运行代码的失败版本时,我收到错误

“失败:无法读取属性'点击'未定义”。

我确信答案必须明显,但我看不出自己的错误。任何建议都会非常受欢迎。

2 个答案:

答案 0 :(得分:0)

您必须使用var button = elem[0].this.editWineButton;,请在此网站上查看如何在javascript中更有效地使用thishttp://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/

答案 1 :(得分:0)

我尝试了igniteram1对elem [0] .this.editWineButton的建议,但它没有解决问题。但是,我找到了解决方案。这两个关键部分使用了Protractor Chained Elements by Using Variables?中描述的element.locator()。其次,添加

_this = this;

修订后的代码是:

this.editWineButton = element(by.buttonText('edit'));

this.editWine = function (wineName) {
    var _this = this;
    this.wineListEntries.filter(function(row){
        return row.element(by.binding('wine.name')).getText().then(function(name){
            return name === wineName; 
        });
    })
    .then(function (elem) {   
        var button = elem[0].element(_this.editWineButton.locator());
        button.click();
    });
};