【问题标题】:Why is a Stale Element exception occurring in this case?为什么在这种情况下会发生 Stale Element 异常?
【发布时间】:2019-10-14 13:42:29
【问题描述】:

我有以下 webdriver 功能:

this.clickButton = async function () {
  try {
    var buttonElement = await driver.findElement(By.className('button-class'));
    await buttonElement.click();
  }
  catch (err) {
    console.log(err);
  }
}

这有时会给出Stale Element exception

即使我将其更改为,我有时也会遇到该异常:

this.clickButton = async function () {
  try {
    await driver.findElement(By.className('button-class')).click();
  }
  catch (err) {
    console.log(err);
  }
}

我的问题是:

  1. 在此函数中是否会出现Stale Reference exception 是否正常/预期,我在其中获取元素引用,然后在下一行甚至同一行使用它,对页面不执行任何其他操作? (如果不存在“按钮类”的元素,我可以理解得到一个“未找到元素”异常,但对我来说,该元素在我搜索它的时间存在是没有意义的,但它是在到达下一行代码时消失了。)

  2. 如果问题 1 的答案是肯定的,那怎么可能?找到的元素会立即采取行动,就像在这种情况下一样?如您所见,我没有重用定位器/元素;该函数每次调用时都会搜索元素,并在单击后立即结束。

  3. 单击按钮会将自身从页面中删除是否相关?也就是说,我是否会因为单击后按钮消失而收到此异常?

【问题讨论】:

  • stackoverflow.com/questions/43471166/… 请检查此页面中的答案。他提到'它试图等待 (click()) 永远不会被调用,因为 Promise 没有 click() 函数'
  • 我认为链接的答案并不完全正确。在那一个中​​,提问者得到了一个“不是函数”的错误。就我而言,无论我使用的是函数的 1 行版本还是 2 行版本,有时都会遇到 Stale Element 异常。
  • StaleElementReference 有时会在加载过时的 DOM 时发生,因此在同一个查找器中存在多个元素。例如,有一次我测试了一个 Web 应用程序,它保持 3 个页面的 DOM 加载,并且我在所有三个页面上都有一个具有相同 finder ref 的按钮。我的代码非常适合第 1 页按钮,但是我在第 2 页上得到了 StaleElementRefernce,因为第一页的 DOM 也已加载,我得到的是第 1 页的按钮而不是第 2 页。只是为了调试尝试使用精确的 xpath 来查找元素或其他独特的查找器。
  • @sameeksha sahib 这是一件好事,但在这种情况下,我正在搜索的内容在页面中已经是独一无二的,除非它很快被添加和删除或其他东西。
  • 检查 Ardesco 她的stackoverflow.com/questions/16166261/… 的答案(并使用 try/catch 再次查找元素,以防旧元素被抛出)

标签: javascript selenium-webdriver


【解决方案1】:

你必须使用 selenium 的 wait-until-clickable 操作符,出现这个错误是因为它仍然没有出现在 DOM 中或者仍然不可点击。 示例代码:

var webDriver= new ChromeDriver(Constants.DriverPath);
WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(5));
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.ClassName('button-class')));

然后你就可以做你的操作了:

var buttonElement = await webDriver.FindElement(By.ClassName('button-class'));
    await buttonElement.Click();

在 JavaScript 中没有可点击,但您可以检查可见并启用状态,例如:

driver.findElement(webdriver.By.name('q')).then(function (element) {
    driver.wait(function () {
        return element.isDisplayed().then(function (displayed) {
            if (!displayed)
                return false;

            return element.isEnabled();
        });
    });
    element.sendKeys('webdriver');
});

【讨论】:

  • 不幸的是,我所有的测试自动化都在 JavaScript 中,而且看起来这个答案是特定于 .Net / C# 的(至少,我在网上找到的所有 SeleniumExtras 参考都是针对那个环境的)。
  • 它们之间没有什么不同,你也可以在 JavaScript 中找到这个类,逻辑是相同的,直到 clack-able,我确信有与 Javascript 中相同的方法
  • 你在哪里见过这个功能?我一直在查看我认为是 JavaScript webdriver (seleniumhq.github.io/selenium/docs/api/javascript/module/…) 的官方文档,但我没有看到其中列出的 SeleniumExtras、ExpectedConditions 或 ElementToBeClickable。是否有其他地方的文档您知道哪些是最新的?
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2013-08-02
  • 2018-12-19
  • 2021-04-30
相关资源
最近更新 更多