2017-01-08 5 views
1

Я новичок в анализе утяжителей углов. В принципе, я хочу установить флажок, если он не установлен. С помощью следующего кода я получаю сообщение об ошибке, как в названии «TypeError: Не удается прочитать свойство„нажмите кнопку“неопределенных»Ошибка уклонителя --- ТипError: Невозможно прочитать свойство 'click' of undefined

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(), и это дает другую ошибку.

Я позвонил с помощью панелиPropertiesPageObject.checkHidePanelHeaderCb();

Все остальные функции, использующие этот код, работают нормально. Его код, который я добавил, который не работает. Поэтому использование «документа» вместо «этого», вероятно, не является причиной.

+0

Похоже, что вы не получили элемент DOM правильно. Попробуйте найти элемент document.getElementById («hidePanelHeader») –

+0

@SandeepSharma Щелчок достаточно глубокий, это больше похоже на ответ Константина, что контекст 'this' уже не тот, которого он ожидает – Icepickle

+0

Да, здесь это также связано с вызовом context: - не привязаны к внешнему глобальному. –

ответ

3

Будьте осторожны с JavaScript scopes. В функциях this относится к объекту функции. Поэтому с каждым оператором this.hidePanelHeaderCb в функции вы добавляете свойство к этому объекту.

Вместо этого вы можете хранить обещание элемента в переменной и работать с ним.

Пожалуйста, попробуйте следующее:

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.


Edit: В приведенном выше примере используются три 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; 
+0

Я добавил дополнительную информацию к моему вопросу, поскольку ваш предыдущий ответ был основан на отсутствии этой информации. – win

+0

№ '(this.hidePanelHeaderCb) .click();' все еще ссылается на функцию 'hidePanelHeaderCb'on object '(выбрано) {...}'. Это не определено. –

+0

Спасибо за ваше время Константин. Я не мог понять, почему другой код, который использовал «это» таким же образом, работал. Но теперь коллега рассказал мне об этом из-за обещания, что этот объект не будет виден внутри обещания. Из-за некоторого закрытия способ, которым это работает, это ... this.checkHidePanelHeaderCb = function() { var that = this; . this.hidePanelHeaderCb.isSelected(), а затем (функция (выбирается) { если (== выбрано верно) { that.hidePanelHeaderCb.click (!), } }); }; – win

0

следующие работы с использованием закрытия для отпадет вопрос, вызванный обещанием:

this.checkHidePanelHeaderCb = function() { 
    var that = this; 
    this.hidePanelHeaderCb.isSelected().then(function(selected) { 
     if(selected !== true) { 
      that.hidePanelHeaderCb.click(); 
     } 
    }); 
}; 
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.