量角器无法在element.all语句中的while循环内执行单击操作

时间:2015-05-23 00:37:06

标签: javascript jquery protractor

在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++;
    }

    });

});

2 个答案:

答案 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;
});