Javascript 为什么在这种情况下会发生过时元素异常?

Javascript 为什么在这种情况下会发生过时元素异常?,javascript,selenium-webdriver,Javascript,Selenium Webdriver,我有以下webdriver功能: this.clickButton = async function () { try { var buttonElement = await driver.findElement(By.className('button-class')); await buttonElement.click(); } catch (err) { console.log(err); } } 这有时会导致陈旧元素异常 即使我将其更改为: t

我有以下webdriver功能:

this.clickButton = async function () {
  try {
    var buttonElement = await driver.findElement(By.className('button-class'));
    await buttonElement.click();
  }
  catch (err) {
    console.log(err);
  }
}
这有时会导致
陈旧元素异常

即使我将其更改为:

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

  • 在这个函数中,如果我获取元素引用,然后在下一行,甚至在同一行使用它,对页面不做任何其他操作,则会发生
    陈旧引用异常
    是否正常/预期?(如果“button class”的元素不存在,我可以理解得到一个“element not found”异常,但在我搜索该元素时该元素存在,但在到达下一行代码时该元素已经消失,这对我来说没有意义。)

  • 如果问题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');
    });
    

    您必须使用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');
    });
    

    请检查本页中的答案。他提到“它正在尝试等待(click())从未被调用,因为承诺没有click()函数。”我认为链接的答案并不准确。在那个例子中,询问者得到了一个“非函数”错误。在我的例子中,无论我使用的是1行还是2行版本的函数,有时都会出现Stale元素异常。如果加载了Stale DOM,并且因此同一查找器中存在多个元素,则有时会发生StaleElementReference。例如,有一次我测试了一个web应用程序,它可以加载3个页面的DOM,我有一个按钮,在所有3个页面上都有相同的finder ref。我的代码对第1页的按钮非常有效,但是我在第2页得到了StaleElementReference,因为第一页的DOM也被加载了,我得到的是第1页的按钮而不是第2页的按钮。只是为了调试,请尝试使用精确的xpath查找元素或另一个唯一的查找程序。@sameeksha sahib这是一个很好的查找方法,但在这种情况下,我搜索的内容在页面中已经是唯一的,除非它很快被添加和删除或其他什么。请检查她的答案(并使用try/catch再次查找元素,以防抛出过时的元素)请检查此页面中的答案。他提到“它正在尝试等待(click())从未被调用,因为承诺没有click()函数“我不认为链接的答案是正确的。在这一点上,询问者得到了一个“非函数”错误。在我的情况下,无论我使用的是1行还是2行版本的函数,我有时会得到一个Stale元素异常。如果加载了Stale DOM,并且因此加载了多个元素,则有时会发生StaleElementReference例如,有一次我测试了一个web应用程序,它加载了3个页面的DOM,我有一个按钮在所有三个页面上都有相同的finder ref。我的代码对第1页的按钮非常有效,但我在第2页上得到了StaleElementReference,因为第一页的DOM也被加载了,我得到了第1页的按钮第2页的。只是为了调试,请尝试使用精确的xpath查找元素或另一个唯一的查找程序。@sameeksha sahib这是一个很好的查找方法,但在这种情况下,我搜索的内容在页面中已经是唯一的,除非它很快被添加和删除或其他什么。请检查她的答案(并使用try/catch再次查找元素,以防抛出过时的元素)不幸的是,我所有的测试自动化都是用JavaScript实现的,而且这个答案似乎是针对.Net/C#的(至少,我在网上找到的所有对SeleniumExtras的引用都是针对该环境的)。它们之间没有什么不同。你也可以在JavaScript中找到这些类,逻辑是一样的,等待clack-able,当然,我确信有与JavaScript相同的方法。你在哪里看到过这些功能?我一直在看JavaScript webdriver()的官方文档,我没有看到SeleniumExtras、ExpectedConditions或ElementToBelickable在那里列出。您知道其他地方有哪些文档更为最新吗?不幸的是,我所有的测试自动化都是用JavaScript实现的,看起来这个答案是针对.Net/C#的(至少,我在网上找到的有关SeleniumExtras的所有参考资料都是针对该环境的)。它们之间没有什么不同。你也可以在JavaScript中找到这些类,逻辑是一样的,等待clack-able,当然,我确信有与JavaScript相同的方法。你在哪里看到过这些功能?我一直在看JavaScript webdriver()的官方文档,我没有看到SeleniumExtras、ExpectedConditions或ElementTobelickable在那里列出。您知道其他地方有哪些更为最新的文档吗?