在重新启用复选框后,选择量角器给出错误读数

时间:2016-11-27 02:45:42

标签: angularjs selenium protractor angularjs-e2e e2e-testing

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

默认情况下/最初,启用all复选框并选中所有复选框。因此,我将取消选中所有复选框,并取消选中所有复选框。这通过了没有问题的量角器:

  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复选框。我在视觉上可以看到,在浏览器中,在成功检查/选中的所有复选框中选中了所有复选框。 Hoewever,在测试中断言他们都被选中失败了:

  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>

我看到浏览器中的所有复选框都是viusally。为什么modelChoice.isSelected()给出错误而不是真实重新启用全部复选框?

1 个答案:

答案 0 :(得分:2)

问题在于您找到复选框的方式。目前,由于您使用的是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;

或者,还有其他方法。