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
}
每个下拉选项我遍历整个代码块一次。前几次一切都好。下次我看到这个:
tableTRCollection
)tabletTRCollection
至少包含一行)tableTRCollection[k].FindElements(By.TagName("td"))
抛出“元素不再有效”异常。我尝试了Selenium的等待函数,但结果是一样的。
是什么导致tableTRCollection[k]
元素不再有效?页面没有变化。
答案 0 :(得分:0)
在从下拉列表中选择导致DOM更改(javascript魔术,AJAX请求等)的页面上,选择后立即找到的元素可能会在您使用它们以查找更多元素时消失。简单的时间表可能是:
X.FindElement(...)
页面可能看起来没有变化,但Selenium对所有DOM更改都很敏感,并会抱怨。
您通常可以直接使用driver.FindElements()
而不是element.FindElements()
来解决此问题。如果你正在使用By.CssSelector()
或By.Xpath()
,你可能必须聪明一点。