量角器 StaleElementReferenceError: 元素不再附加到 DOM

protractor StaleElementReferenceError: Element is no longer attached to the DOM

本文关键字:DOM 不再 StaleElementReferenceError 元素 量角器      更新时间:2023-09-26

在我的 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: Element 不再附加到 DOM

我的帮助函数的代码:

var waitElementToBeShown = function (elm) {
browser.wait(function () {
    return elm.isPresent();
},10000);
browser.wait(function () {
    return elm.isDisplayed();
},10000);
};

我正在尝试等待元素可用以进行交互。

我怀疑该错误被抛出,因为DOM在两次调用browser.wait之间发生了变化。 与其将元素承诺传递到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')));
});

我对这个答案并不完全有信心,但似乎它应该有效......