量角器错误--- TypeError:无法读取未定义的属性“click”

时间:2017-01-08 12:27:00

标签: javascript angularjs protractor automated-tests

我不熟悉angularjs的量角器测试。 基本上我想检查一个复选框,如果它未选中。使用以下代码,我得到错误,如标题“TypeError:无法读取属性'单击'未定义”

var PageObject = function () {
    this.hidePanelHeaderCb = element(by.id("hidePanelHeader"));

    this.checkHidePanelHeaderCb = function() {
        this.hidePanelHeaderCb.isSelected().then(function (selected) {
          if(selected !== true) {
                (this.hidePanelHeaderCb).click();
          }
        });
    };
};
module.exports = PageObject;

右键单击我获得的网页代码段 - >检查是:

<span id="hidePanelHeader" ng-class="{'icon-CheckBoxSelected': panelProperties.hidePanelHeader, 'icon-CheckBoxUnselected': !panelProperties.hidePanelHeader}" ng-click="switchHidePanelHeader()" role="button" tabindex="0" class="icon-CheckBoxSelected" style=""></span>

我尝试使用isChecked(),它会产生不同的错误。

我使用panelPropertiesPageObject.checkHidePanelHeaderCb()调用;

使用这种代码方式的所有其他功能都正常工作。我添加的复选框代码无效。所以使用“文档”而不是“这个”可能不是原因。

3 个答案:

答案 0 :(得分:3)

小心JavaScript 范围。在函数中,this指的是函数对象。因此,对于函数中的每个this.hidePanelHeaderCb语句,都可以向此对象添加属性。

相反,您可以将元素promise存储在变量中并使用它。

请试试这个:

var PageObject = function () {

    this.checkHidePanelHeaderCb = function() {
        var hidePanelHeader = element(by.id("hidePanelHeader"));
        hidePanelHeader.isSelected().then(function (selected) {
            if(selected !== true) {
                hidePanelHeader.click();
            }
        });
    };

};

module.exports = PageObject;

这就是我能告诉你的语法。没有HTML和更多JS上下文,很难添加更多。

修改:上面的示例在不同的对象上使用了三个hidePanelHeaderCb属性:

var PageObject = function () {
    // #1 PageObject.hidePanelHeaderCb (defined here)
    this.hidePanelHeaderCb = element(by.id("hidePanelHeader"));

    // PageObject.checkHidePanelHeaderCb (defined here)
    this.checkHidePanelHeaderCb = function() {
        // #2 PageObject.checkHidePanelHeaderCb.hidePanelHeaderCb (undefined)
        this.hidePanelHeaderCb.isSelected().then(function (selected) {
          if(selected !== true) {
                // #3 anonymousThenCallback.hidePanelHeaderCb (also undefined)
                (this.hidePanelHeaderCb).click();
          }
        });
    };
};
module.exports = PageObject;

答案 1 :(得分:0)

以下工作使用闭包来消除由承诺引起的问题:

this.checkHidePanelHeaderCb = function() {
    var that = this;
    this.hidePanelHeaderCb.isSelected().then(function(selected) {
      if(selected !== true) {
            that.hidePanelHeaderCb.click();
      }
    });
};

答案 2 :(得分:0)

使用ES2015(ES6):

如果您使用的是ES2015(ES6),可以通过以下方式修复:

var PageObject = function () {
  this.hidePanelHeaderCb = element(by.id("hidePanelHeader"));

  this.checkHidePanelHeaderCb = () => {
    this.hidePanelHeaderCb.isSelected().then(selected => {
      if(!selected) {
        this.hidePanelHeaderCb.click();
      }
    });
  };
};
module.exports = PageObject;

我建议阅读fat arrow syntax and lexical scoping