无法找到页面元素,因为“元素不再有效”
本文关键字:元素 因为 不再 有效 | 更新日期: 2023-09-27 18:17:09
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"))
抛出"元素不再有效"异常。
我尝试了硒的等待功能,但结果是相同的。是什么导致tableTRCollection[k]
元素不再有效?
在从下拉列表中选择会导致DOM改变的页面上(javascript魔法、AJAX请求等),那么您在选择后立即找到的元素可能在您使用它们寻找更多元素时已经消失了。简单的时间轴可能是:
- 从下拉菜单中选择
- 查找元素X
- 做一些工作 DOM改变呼叫
- 异常发生。
X.FindElement(...)
页面可能看起来没有变化,但是Selenium对所有DOM变化都很敏感,并且会发出抱怨。
您通常可以通过直接使用driver.FindElements()
而不是element.FindElements()
来解决这个问题。如果你正在使用By.CssSelector()
或By.Xpath()
,你可能必须聪明地使用它们。