由于NoSuchElementError,测试失败

时间:2014-08-20 12:44:49

标签: javascript angularjs jquery-mobile protractor

我的测试有时会失败。我非常希望每次都能通过。 它是一个页面,显示一个带有数字气泡的开放图层地图。 当页面打开时,我们点击状态过滤器,然后期望在其中一个气泡中显示某个数字。

错误是: NoSuchElementError:没有这样的元素。

它没有说明它找不到哪个元素。 当我看截图时,我可以看到它从未点击过滤器复选框。或至少在屏幕截图中没有显示。 (当测试通过时,它会显示单击的复选框)

这是测试代码:

beforeEach(function() {
    ptor = protractor.getInstance();
    ptor.ignoreSynchronization = true;

});

function waitForMap(){
    ptor.wait(function () {
        return element(by.css('label[for="checkbox-status-all"]')).isPresent();
    }, 5000);

}

it('should click checkbox and expect 30 to be shown in bubble', function () {
    browser.get(ptor.params.testurl).then(function () {
        waitForMap();
        element(by.css('label[for="checkbox-status-b0"]')).click();
        var bedscount = ptor.findElement(protractor.By.id('marker_10'));
        expect(bedscount.getInnerHtml()).toEqual('<span>30</span>');
    });
});

1 个答案:

答案 0 :(得分:1)

如果页面确实是Angular页面,则删除此行:

  

ptor.ignoreSynchronization = true;

所以Protractor可以正常等待。

您不需要ptor = protractor.getInstance()使用最新版本的量角器,只需开始使用browser代替ptor

我还会拆分测试步骤,而不是在一个it()块内做太多。它有助于日志和调试问题,如我的测试在哪里破解?

// TODO: Move to page object file
var mapElm = $('label[for="checkbox-status-all"]');
var chkElm = $('label[for="checkbox-status-b0"]');
var bedscountElm = $('#marker_10 span');

// A more general function to wait for elements on non-angular pages
function waitForElmPresent(elmFinder) {
    browser.wait(function() {
        return elmFinder.isPresent();
    }, 5000);
}

it('opens the test page', function() {
    browser.get(browser.params.testurl);
});

it('waits for the map', function() {
    // shouldn't be necessary with ignoreSyncronization is left alone
    waitForElmPresent(mapElm);
});

it('also waits for the checkbox before clicking', function() {
    // shouldn't be necessary with ignoreSyncronization is left alone
    waitForElmPresent(chkElm);
});

it('clicks the checkbox', function() {
    chkElm.click();
});

it('and also waits for the bubble to be present', function() {
    // shouldn't be necessary with ignoreSyncronization is left alone
    waitForElmPresent(bedscountElm);
});

it('expect 30 to be shown in bubble', function() {
    expect(bedscountElm.getText()).toEqual('30');
});