Protractor isSelected 在重新启用复选框后给出错误读数

Protractor isSelected giving false reading after re-enabling checkboxes

我有一个复选框列表,在顶部有一个 all 复选框。切换所有复选框时,所有复选框都将被取消选择或选中。

通过 default/initially,all 复选框已启用,所有复选框均已选中。所以,我将取消选择所有复选框,所有复选框都将取消选中。这通过了 no,量角器没有问题:

  it('all checkbox is deselected', function() {
    modelsAllCheckbox.click();
    expect(modelsAllCheckbox.isSelected()).to.eventually.be.false;
  });

  it('all models should be deselected', function() {
    ppvPercentages.modelChoices().then(function(modelChoices) {
      modelChoices.forEach(function(modelChoice) {
        expect(modelChoice.isSelected()).to.eventually.be.false;
      });
    });
  });

  this.modelChoices = function(rowNumber) {
    return element.all(by.repeater('model in vehicleCheckboxes.models'));
  }

然后我重新启用 all 复选框。我可以直观地看到,在浏览器中,所有复选框中的所有复选框都被成功选中 checked/selected。然而,在断言它们都被选中的测试中失败了:

  it('all button is re-enabled', function() {
    modelsAllCheckbox.click();
    expect(modelsAllCheckbox.isSelected()).to.eventually.be.true;
    // give time for all models to set
    browser.sleep(3000)
  });

  it('all models are selected', function() {
    ppvPercentages.modelChoices().then(function(modelChoices) {
      modelChoices.forEach(function(modelChoice) {
        expect(modelChoice.isSelected()).to.eventually.be.true;
      });
    });
  })

<div class="overflow-container">

  <!-- all checkbox -->
  <input type="checkbox"
    ng-model="vehicleAllCheckbox.models"
    ng-change="toggleAllModels(vehicleAllCheckbox, vehicleCheckboxes.models, vehicleCheckboxes.year)">All

  <div ng-repeat="model in vehicleCheckboxes.models | orderBy: 'description' track by model.description">
    <!-- the rest of the checkboxes -->
    <input type="checkbox"
      ng-change="modelCheckboxToggle()"
      ng-model="model.checked" >
    {{model.description}}
  </div>
</div>

我看到浏览器中的所有复选框都被选中了。为什么 modelChoice.isSelected() 给出 false 而不是 true 重新启用所有复选框?

问题在于您定位复选框的方式。目前,您正在定位父 div 元素,因为您使用的是 by.repeater() 定位器:

<div ng-repeat="model in vehicleCheckboxes.models | orderBy: 'description' track by model.description">

相反,将 modelChoices 指向 input 个元素(您的复选框):

this.modelChoices = function(rowNumber) {
  return element.all(by.repeater('model in vehicleCheckboxes.models')).all(by.model('model.checked'));
}

作为旁注,我认为您可以通过使用 .each():

来改进您期望复选框被选中的方式
ppvPercentages.modelChoices().each(function (modelChoice) {
    expect(modelChoice.isSelected()).to.eventually.be.true;
});

或者,使用 .reduce():

var allSelected = ppvPercentages.modelChoices().reduce(function (acc, modelChoice) {
    return modelChoice.isSelected().then(function (isSelected) {
        return acc && isSelected;
    });
}, true);
expect(allSelected).to.eventually.be.true;

或者,还有其他方法。