Protractor 保证在量角器中工作而不解决问题

Protractor 保证在量角器中工作而不解决问题,protractor,Protractor,下面是我的页面对象代码 this.getRowBasedOnName = function (name) { return this.tableRows.filter(function (elem, index) { return elem.element(by.className('ng-binding')).getText().then(function (text) { return text.toUpperCase().substring(

下面是我的页面对象代码

this.getRowBasedOnName = function (name) {
    return this.tableRows.filter(function (elem, index) {
        return elem.element(by.className('ng-binding')).getText().then(function (text) {
            return text.toUpperCase().substring(0, 1) === name.toUpperCase().substring(0, 1);
        });
    });
};
上述函数在另一个函数的同一页对象中调用,该函数为

this.clickAllProductInProgramTypeBasedOnName = function (name) {
   this.getRowBasedOnName(name).then(function (requiredRow) {
        requiredRow.all(by.tagName('label')).get(1).click();
    });
};
但是上面的代码在控制台中抛出一个错误,即requiredRow。all不是一个函数

但当我做以下事情时:

this.clickAllProductInProgramTypeBasedOnName = function (name) {
    var row = this.getRowBasedOnName(name)
    row.all(by.tagName('label')).get(1).click();
};
这可以正常工作,并单击所需的元素


但是这个.getRowBasedName()函数返回一个承诺,在使用然后使用函数解析它之后应该也可以使用它。为什么只将其分配给变量就可以工作?

当您解析
getRowBasedName()
的结果时,这是一个
ElementArrayFinder
,您会得到一个没有
all()
方法的规则元素数组

您根本不需要解析
getRowBasedName()
的结果-让它成为一个
ElementArrayFinder
,您可以像在第二个示例中那样与
all()
链接:

var row = this.getRowBasedOnName(name);
row.all(by.tagName('label')).get(1).click();

换句话说,
requiredRow
不是
ElementArrayFinder
,而是
row

您的方法
就是这样。GetRowBasedName(name)
返回一个用web元素(
ElementArrayFinder
)的方法扩充的承诺。对这些方法的调用将带来新的希望。因此,在第一种情况下,您处理的是一个承诺,在第二种情况下,您处理的是承诺的结果,它是一个数组。