TypeError:无法调用未定义的方法“click”

时间:2015-09-25 09:12:01

标签: javascript angularjs selenium promise protractor

我想通过第二列值从表中选择特定元素(我删除了渲染的空格),然后找到该元素后我想点击它(返回为真)。我试过这个,但它没有点击它,只是找到了元素。

我要选择的字段的html代码如下:

<table ng-table="tableParams" id="Panel" class="tbl-option-list" template-pagination="directives/controls/Pager/Pager.html">
    <caption translate>Orders</caption>
    <tr id="Panel">
        <!-- 1 -->
        <th class="fixed-width-glyphicon"></th>
        <!-- 2 -->
        <th translate>Identifier</th>
    </tr>
        <tr ng-repeat="item in $data track by $index" ng-class="{'active-bg': order.$selected}" ng-click="changeSelection(order,  getRowActions(order))">
        <!-- 1 -->
        <td class="fixed-width-glyphicon">
            <div class="fixed-width-glyphicon">
                {{item.priority.toUpperCase()[0]}}
            </div>
        </td>
        <!-- 2 -->
        <td>{{item.identifierCode}}</td>
    </tr>
</table>

量角器的select命令是:

var deferred = protractorData.p.promise.defer();
element.all(by.repeater('item in $data track by $index')).filter(function(row) {
    row.getText().then(function(txt) {
        txt = txt.replace(/\s/g, '');
        var found = txt.split('ID0001');
        return found.length > 1;
    });
}).then(function(elem) {
        deferred.fulfill(elem[0]);
    });
    return deferred.promise;
}

我收到以下错误:

  

TypeError:无法调用未定义的方法'click'。

3 个答案:

答案 0 :(得分:3)

似乎元素没有返回被点击。尝试下面的示例,单击并查看它是否在过滤器函数中正常工作,而不是使用promises -

返回元素
element.all(by.repeater('item in $data track by $index')).filter(function(row) {
    //return found element
}).then(function(elem) {
    elem[0].click(); //click it here
});

或者以下面的方式返回元素,然后在测试规范中单击它。这是怎样的 -

var clickElement = element.all(by.repeater('item in $data track by $index')).filter(function(row) {
    //return found element
}).then(function(elem) {
    return elem[0]; //return the element
});
return protractor.promise.fulfilled(clickElement);

希望它有所帮助。

答案 1 :(得分:0)

为什么不回复元素?没有必要承诺。在这里提出:

return element.all(by.repeater('item in $data track by $index')).filter(function(row) {
    row.getText().then(function(txt) {
    txt = txt.replace(/\s/g, '');
    var found = txt.split('ID0001');
    return found.length > 1;
});
}).then(function(elem) {
    return elem[0];
});

请注意在开头添加的返回值,这样您就会返回return elem[0];

的承诺

答案 2 :(得分:0)

.filter函数应该返回一个值。 在你的例子中,我认为它应该是(在第三行):

return row.getText().then(function(txt) {