在我的Angular应用程序中,当用户打开页面时,我们最初加载缓存的内容,然后通过对服务器的异步调用进行跟踪,以轮询实际数据并更新页面。我正在尝试访问已经显示的元素,但元素的指针已更改,因为页面内容已更新,即使该特定元素上没有任何内容实际更改。
我尝试了不同的解决方案,但仍然无法让它像我想的那样稳定。我需要类似try / catch块的东西,因为我不想使用browser.wait。
从描述看起来像
browser.waitForAngular();
应该处理$ http调用,但它没有帮助。
以下是代码示例:
element(by.id('closeEditTagsModal')).click();
helper.waitElementToDisappear(element(by.css('body[class$="modal-open"]')));
element(by.id('myBookingsTab')).click();
helper.waitElementToDisappear(element(by.css('body[class$="loading"]')));
try {
(helper.waitElementToBeShown(element(by.repeater('b in currentbookings').row(0)).element(by.cssContainingText('.tagPill', 'TestTag')))).then(function() {
}, function(err) {
console.log('element was not found');
throw err;
});
}
catch (err) {
helper.waitElementToBeShown(element(by.repeater('b in currentbookings').row(0)).element(by.cssContainingText('.tagPill', 'TestTag')));
}
这是我尝试使用try / catch的另一个示例,但看起来我做错了。我在try块中有这个错误:
StaleElementReferenceError:元素不再附加到DOM
我的帮助功能代码:
var waitElementToBeShown = function (elm) {
browser.wait(function () {
return elm.isPresent();
},10000);
browser.wait(function () {
return elm.isDisplayed();
},10000);
};
我正在尝试等待元素可以与之交互。
答案 0 :(得分:0)
我怀疑错误被抛出,因为DOM在browser.wait
的两次调用之间发生了变化。您应该传递更间接的内容,而不是将elementPromise传递给browser.wait
。您可以直接传递定位器:
var waitElementToBeShown = function (elmLoc) {
browser.wait(function () {
return element(elmLoc).isPresent();
},10000);
browser.wait(function () {
return element(elmLoc).isDisplayed();
},10000);
}
但是你并不总是有一个简单的定位器表达式。也许传递一个查找元素的函数?这样,查找将在每次等待中重新评估:
var waitElementToBeShown = function (elmFunc) {
browser.wait(function () {
return elmFunc().isPresent();
},10000);
browser.wait(function () {
return elmFunc().isDisplayed();
},10000);
}
然后你可以这样称呼它:
waitElementToBeShown(function() {
return element(by.repeater('b in currentbookings').row(0)).element(by.cssContainingText('.tagPill', 'TestTag')));
});
我对这个答案并不完全有信心,但它似乎应该有效......