Как получить возвращаемое значение из js, выполняемого с использованием browser.executeScript в транспортире?

#javascript #angularjs #protractor

#javascript #angularjs #транспортир

Вопрос:

Я пытаюсь вернуть значение из функции execute script и сопоставить его с ожидаемым методом. поскольку IsSelected не работает со многими флажками, которые используются в приложении, я должен пойти этим путем. Вот мой код, и я действительно ценю вашу помощь.

Я пробовал использовать IsSelected с такими флажками, но это не работает. Приведенный ниже код выдает следующую ошибку. Сбой: не удается прочитать свойство ‘getText’, равное нулю

 exports.verifyRegularCheckboxChecked = function () {
  browser.driver.executeScript(function() {
    var special_list = $('div > div');
    var returnValue = 'itIsTrue';
    var label, label_children;
    special_list.filter(function(index, elem) {
      label = elem.children;
      label_children = $(label).children();
      label_children.filter(function(nestedIndex, nestedElem) {
        if(nestedElem.tagName === 'INPUT') {
          if(nestedElem.checked) {
            return returnValue;
            }
          }
        });
      });
    }).then(function (returnValue) {
    expect(returnValue.getText()).toBe('itIsTrue');
  });
};
  

HTML-код:

 <div class="form-group">
  <div class="checkbox"> 
    <label> 
       <input class="ark-checkbox ng-untouched ng-valid ng-dirty ng-valid-parse" 
             ng-model="block.properties.milestoneIsVariable.value" type="checkbox"> 
       <span aria-label="ark-checkbox"> ::before </span> use variable 
     </label> 
  </div>
</div>
  

Комментарии:

1. пожалуйста, покажите HTML-код

2. Вот HTML, но, пожалуйста, обратите внимание, что все входные теги выделены серым цветом при проверке, поэтому выглядят как скрытые. Вот почему я не могу использовать локаторы, такие как ng-model, было бы просто. <div class="form-group"> <div class="checkbox"> <label> <input class="ark-checkbox ng-untouched ng-valid ng-dirty ng-valid-parse" ng-model="block.properties.milestoneIsVariable.value" type="checkbox"> <span aria-label="ark-checkbox"> ::before </span> use variable </label> </div> </div>

Ответ №1:

Для фильтра(функции) jQuery вам необходимо вернуть логическое значение.

 exports.verifyRegularCheckboxChecked = function () {

  let result = browser.driver.executeScript(function() {

    let special_list = $('div > div');
    let label, label_children;

    let checkedList = special_list.filter(function(index, elem) {
      label = elem.children;
      label_children = $(label).children();

      return label_children.filter(function(nestedIndex, nestedElem) {
        return estedElem.tagName === 'INPUT' amp;amp; nestedElem.checked;
      }).length > 0;

    });

    // return matched Dom element
    return checkedList.length > 0 amp;amp; checkedList.get(0);        
  }); // end of executeScript

  expect(result.getText()).toBe('itIsTrue');
};
  

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

 exports.verifyRegularCheckboxChecked = function () {

  let result = browser.driver.executeScript(function() {

    return $('div > div').filter(function(){ 
      return $('input:checked', this).length > 0;
    })
    .get(0);

  });

  expect(result.getText()).toBe('itIsTrue');
};
  

Комментарии:

1. Как вы можете видеть в моем комментарии выше, вставлен html. Я ищу решение, в котором я могу передать фактическое значение текста флажка функции, как use variable в приведенном выше html, а затем проверить, установлен флажок или нет. Ваши вышеуказанные решения возвращают что-то вроде этого, если я просто console.log(результат) ManagedPromise { flow_: ControlFlow { propagateUnhandledRejections_: true, activeQueue_: TaskQueue { name_: 'TaskQueue::22696', flow_: [Circular], tasks_: [Array], interrupts_: null, pending_: null, subQ_

Ответ №2:

Итак, я заставил его работать, изменив свой код следующим образом.

 exports.verifyRegularCheckboxChecked = function () {
  var result = browser.driver.executeScript(function() {
    var returnValue = false;
    var special_list = $('div > div');
    var label, label_children;
    special_list.filter(function(index, elem) {
      label = elem.children;
      console.log('inner text is: '   label.textContent);
      label_children = $(label).children();
      label_children.filter(function(nestedIndex, nestedElem) {
        if(nestedElem.tagName === 'INPUT') {
          if(nestedElem.checked) {
            returnValue = true;
            }
          }
        });
      });
    return returnValue;
    });
  result.then(function (value) {
    expect(value).toBeTruthy();
  });
};