Javascript 为什么在这种情况下会发生过时元素异常?
我有以下webdriver功能: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
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”异常,但在我搜索该元素时该元素存在,但在到达下一行代码时该元素已经消失,这对我来说没有意义。)您必须使用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在那里列出。您知道其他地方有哪些更为最新的文档吗?