无法找到页面元素,因为“元素不再有效”

时间:2015-10-12 06:44:53

标签: c# .net selenium webdriver

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]元素不再有效?页面没有变化。

1 个答案:

答案 0 :(得分:0)

在从下拉列表中选择导致DOM更改(javascript魔术,AJAX请求等)的页面上,选择后立即找到的元素可能会在您使用它们以查找更多元素时消失。简单的时间表可能是:

  1. 从下拉列表中选择项目
  2. 查找元素X
  3. 做一些工作
  4. DOM更改
  5. 致电X.FindElement(...)
  6. 发生异常。
  7. 页面可能看起来没有变化,但Selenium对所有DOM更改都很敏感,并会抱怨。

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