javascript - Protractor StaleElementReferenceError : Element is no longer attached to the DOM

标签 javascript selenium protractor angularjs-e2e e2e-testing

在我的 Angular 应用程序中,当用户打开页面时,我们首先加载缓存的内容,然后通过异步调用服务器来轮询实际数据并更新页面。我正在尝试访问已显示的元素,但该元素的指针已更改,因为页面内容已更新,即使该特定元素上的任何内容实际上都没有更改。

我尝试了不同的解决方案,但仍然无法使其像我想要的那样稳定。我需要像 try/catch block 这样的东西,因为我不想使用 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 block 中遇到此错误:

StaleElementReferenceError: Element is no longer attached to the DOM

我的帮助功能的代码:

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

我正在尝试等待该元素可供交互。

最佳答案

我怀疑抛出错误是因为 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')));
});

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

关于javascript - Protractor StaleElementReferenceError : Element is no longer attached to the DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28211053/

相关文章:

angular - chromedriver 版本错误。 Protractor 要求 2.31

javascript - 在表的所有行中发出验证

javascript - 用于启用/禁用 div 内容滚动的复选框

javascript - 如何针对特定的 axios 调用模拟 jest.spyOn

java - 断言文本框在 Selenium 中为空

excel - Selenium Webdriver (VBA) : Explicit Wait

javascript - 信令、防火墙和 NAT 穿越 simplewebRTC

javascript - 应用程序中的 Meteor 服务器端渲染

excel - 用于从 Internet Explorer 转换为 Edge 或 chrome 浏览器的 VBA 脚本

javascript - 延迟执行 Protractor elementArrayFinder.map