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;
或者,还有其他方法。
我有一个复选框列表,在顶部有一个 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;
或者,还有其他方法。