c# - 在特定的 IWebElement 上使用 webdriverwait

标签 c# selenium webdriver selenium-webdriver

我正在将 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/

相关文章:

c# - 在该类的构造函数中实例化类变量

javascript - Selenium WebDriver - 等待 Angular 请求(Java)

python - 使用 Selenium (Python) 获取输入框的值

java - Selenium ;如何运行多个实例并维护不同的 session

python - selenium webdriver 加载页面的时间太长

java - Selenium webdriver 在页面更改后获取元素

python - 使用 Selenium WebDriver 选择元素后跟文本

c# - ScriptManager.RegisterClientScriptBlock 不工作

c# - 使用 C# 将数据存储在数据库中的最快方法

c# - 无法从 X.509 存储获取当前用户证书