在element.all语句中的while循环中,我试图通过单击它突出显示表上的元素,然后单击删除按钮,然后在确认弹出窗口中单击“确定”。
问题在于,当我运行量角器时,看起来while循环只是遍历表上的行 - 即:只有items [j] .click();并且j ++似乎在while循环中执行,而我的两个jquery点击直到最后一次才执行。我在'element.all then statement'中错过了一些特殊的while循环吗?
请帮忙!
it('ADD MULTIPLE CAMERAS AND VERIFY', function() {
browser.get('http://localhost:3000');
var singleCamsToAdd = 5;
var multiCamsToAdd = 2;
var totalCams = singleCamsToAdd + multiCamsToAdd - 1;
var newDesign = element(by.css('[ng-click="fileManager.newFile()"]'));
var addCamera = element(by.css('[ng-click="design.addCamera()"]'));
newDesign.click();
//Multiple cameras added as many different rows
for(i=0; i<singleCamsToAdd ; i++)
addCamera.click();
//Multiple cameras added in one camera row
var quantity = element(by.css('[ng-model="cameraForm.qty"]'));
quantity.clear();
quantity.sendKeys(multiCamsToAdd);
//Verify # rows corresponds with # cameras
element.all(by.css('tbody[class ="bso ng-scope"] tr')).then(function(items) {
expect(items.length).toBe(singleCamsToAdd);
expect(items.length + (multiCamsToAdd-1) ).toBe(totalCams);
var j = 0;
while(j < items.length) {
items[j].click();
$('[ng-click="editCamera.delete()"]').click();
$('[data-ng-click="modalOptions.ok();"]').click();
j++;
}
});
});
答案 0 :(得分:1)
我不是循环问题,而是等待。在点击之前尝试等待模态:
var modalLocator = by.css('[data-ng-click="modalOptions.ok();"]');
element(by.css('[ng-click="editCamera.delete()"]')).click();
browser.driver.wait(protractor.until.elementLocated(modalLocator), 5000);
element(by.css(modalLocator)).click();
如果页面加载时你的模态已经在dom中,你可能需要等待它变得可见:
var modal = element(by.css('[data-ng-click="modalOptions.ok();"]')); //hidden element
element(by.css('[ng-click="editCamera.delete()"]')).click();
browser.driver.wait(protractor.until.elementIsVisible(modal), 5000);
element(by.css(modalLocator)).click();
<强>更新强> 另外,尝试将elementFinder调用移动到循环中,可能在某些时候dom结构发生变化,量角器无法在dom中找到先前找到的元素(这只是我的猜测):
var rowsLocator = by.css('tbody[class ="bso ng-scope"] tr');
element.all(rowsLocator).then(function(items) {
var i;
for (i=0; i<items.length; i++) {
elements.all(rowsLocator).get(i).click();
$('[ng-click="editCamera.delete()"]').click();
$('[data-ng-click="modalOptions.ok();"]').click();
}
}
答案 1 :(得分:0)
请务必注意,您在问题中声明的不在循环中执行jQuery点击。 Protractor overrides the $ operator所以你正在做的是创建一个ElementFinder,它将异步找到该元素,然后对其执行点击操作。
所以我认为问题是items[j].click();
很快就会解析,因为已经找到了元素,但$('[ng-click="editCamera.delete()"]').click();
和$('[data-ng-click="modalOptions.ok();"]').click();
解析得很慢,因为他们需要在DOM中找到元素,当你反复循环遍历这个块时,所有这些都会导致时序问题。我建议拉一个库来明确处理异步循环,例如async。我相信您可以使用eachSeries()
函数完成目标:
async.eachSeries(items, function(item, callback) {
item.click();
$('[ng-click="editCamera.delete()"]').click();
$('[data-ng-click="modalOptions.ok();"]').click();
callback();
}, function(err){
throw err;
});