【问题标题】:Unable to find page elements because "Element is no longer valid"无法找到页面元素,因为“元素不再有效”
【发布时间】:2015-10-12 06:44:53
【问题描述】:

当查找页面上的元素时,Selenium 会抛出异常。它抱怨“元素不再有效”。

例如,在带有下拉列表的页面上,当我选择一个选项时,我需要找到一些表格。对于前几个选项,我找到了表格,但最终搜索元素会导致异常。

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(25));

IList<IWebElement> tableTRCollection = null;
IList<IWebElement> tableTDCollection;
bool exist = false;

while(!exist)
{
  try
  {
    tableTRCollection = driver.FindElements(By.XPath("//table[@id='t1']/tbody/tr"));
    exist = true;
  }
  catch(Exception ex)
  {
    Wait(1);
  }
}

for (int k = 0; k < tableTRCollection.Count; k++) 
{ 
  tableTDCollection = tableTRCollection[k].FindElements(By.TagName("td")); // -> Element is no longer valid
}

每个下拉选项我都会遍历整个代码块一次。前几次一切正常。下次通过我看到这个:

  • 退出while循环(它找到了表和tableTRCollection
  • 进入for循环(tabletTRCollection至少包含一行)
  • tableTRCollection[k].FindElements(By.TagName("td")) 抛出“元素不再有效”异常。

我尝试了 Selenium 的等待功能,但结果是一样的。 是什么导致tableTRCollection[k] 元素不再有效?页面没有变化。

【问题讨论】:

  • 您遇到了哪个异常?
  • for (int k = 1; k
  • 你想获取页面的所有 TD 还是特定 TR 部分的所有 TD?
  • 来自特定 TR 的所有 TD(当我在初始化 trCollection 之前等待 3 秒时一切正常),但是等待时间不对。
  • 然后您可以使用显式等待并告诉网络驱动程序等待所有 TD 加载。

标签: c# .net selenium webdriver


【解决方案1】:

在从下拉列表中进行选择会导致 DOM 发生变化的页面上(javascript 魔术、AJAX 请求等),那么当您使用它们查找更多元素时,您在选择后立即找到的元素可能已经消失了。简单的时间表可能是:

  1. 从下拉列表中选择项目
  2. 查找元素 X
  3. 做一些工作
  4. DOM 更改
  5. 致电X.FindElement(...)
  6. 发生异常。

页面可能看起来没有变化,但 Selenium 对所有 DOM 变化都很敏感,会报错。

您通常可以通过直接使用driver.FindElements() 而不是element.FindElements() 来解决此问题。如果您正在使用 By.CssSelector()By.Xpath(),您可能需要聪明一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多