如何从量角器中使用browser.executeScript执行的js获取返回值?

时间:2019-04-23 20:39:17

标签: javascript angularjs protractor

我正在尝试从执行脚本函数中获取一个值,并将其与Expect方法匹配。 由于isSelected不适用于应用程序中使用的许多复选框,因此我必须采用这种方式。 这是我的代码,非常感谢您的帮助。

我尝试将isSelected与这类复选框一起使用,但这不起作用。 下面的代码给我以下错误。 失败:无法读取null的属性“ 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>

2 个答案:

答案 0 :(得分:0)

对于jQuery的filter(function),您需要返回一个布尔值。

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' && nestedElem.checked;
      }).length > 0;

    });

    // return matched Dom element
    return checkedList.length > 0 && 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 :(得分:0)

因此我通过修改我的代码来使其正常工作。

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();
  });
};