我正在将 selenium webdriverwait 方法应用于特定的 IWebElement 以在可用时获取此 IWebElement 的一些子元素。这是我的代码...
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IList<IWebElement> elementsA = wait.Until<IList<IWebElement>>((d) =>
{
return driver.FindElements(By.XPath("//table[@class='boxVerde']"));
});
foreach (IWebElement iwe in elementsA)
{
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IList<IWebElement> elementsB = wait.Until<IList<IWebElement>>((d) =>
{
return iwe.FindElements(By.XPath("tr/td/div/a"));
//trying to fetch the anchor tags from the element
});
}
它一直给我一个错误,说“元素不再附加到 DOM”...我认为 webdriver 等待根本不起作用。我做错了什么吗?非常感谢
最佳答案
听起来您正在遭受陈旧元素的困扰。
Selenium 找到的每个 WebElement 实际上都是对 DOM 中元素的引用
有时网站上使用的 JavaScript 会破坏并重新创建一个元素,当这种情况发生时,您现有的引用会变得陈旧,您会看到一个 StaleElementReferenceException(至少在 Java 领域是这样称呼的,您应该会看到非常相似的东西) .
因此,如果您看到 StaleElementReferenceException 或一条消息,指出“元素不再附加到 DOM”,这意味着对 DOM 中您曾经拥有的元素的引用不再有效,因为您拥有的元素对的引用已被销毁。
这在视觉上并不总是很明显,因为原始元素可能已被破坏,然后重新创建了一个相同的元素,但是它是一个新元素,因此您需要创建一个新的引用才能与之交互。
创建新引用的方法是重新查找元素。
您的问题并不完全清楚,但我假设您在找到表格后遍历 anchor 元素列表时遇到了问题。如果是这种情况,则表明在您找到表格元素然后开始遍历表格内的 anchor 元素之间的时间点,表格已被销毁并重新创建。
如果是这种情况,您将需要再次找到该表,一个有用的技巧是等待该表变得陈旧,然后再尝试再次找到它。通过这种方式,您可以有理由相信页面上破坏表格然后重新创建表格的任何 JavaScript 已完成处理。 .NET ExpectedConditions class不如 Java ExpectedConditions class 成熟.我建议看看一些 Java 的并将它们移植到 .NET(它应该相当简单,结构非常相似),特别感兴趣的是等待元素变得陈旧的 Java。
关于c# - 在特定的 IWebElement 上使用 webdriverwait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15804916/