运行代码时,我收到了陈旧的元素异常。但是在调试时我没有得到这个例外。 这是我的一段代码。有谁能够帮我 ?感谢
public static bool CheckListFilterResult(IList<IWebElement> gridColumns, IList<IWebElement> gridRows, string filterColumn, List<string> filters)
{
bool checkResult = false;
{
int filterColumnIndex = GetColumnIndex(gridColumns, filterColumn);
if (gridRows.Count > 0 )
{
foreach (IWebElement row in gridRows)
{
TestManager.Doc.Step("before bool match");
bool filterMatch = filters.Contains(row.FindElements(By.TagName("td"))[filterColumnIndex].Text.Trim());
if (filterMatch)
{
checkResult = true;
}
else
{
checkResult = false;
break;
}
}
}
}
return checkResult;
}
}
答案 0 :(得分:0)
从查看代码开始,该行是您从rows
集合访问某些内容的第一行。我的猜测是它与此有关。你拉了rows
集合,然后应用过滤器,然后调用这个函数?如果是这样,那可能就是问题所在。您需要应用过滤器,然后拉出rows
集合,然后调用该函数。
答案 1 :(得分:0)
当您运行selenium代码时,可能是您的IWebElement行已通过javascript更新。
如此处所述:http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp,当UI上的对象可能已刷新但您尝试访问同一对象时,会发生过时元素引用异常。因此,即使该行对用户可见,它可能已被javascript更新/替换,然后它是一个不同的对象。
它之所以偶然发生,但并非总是如此,当你在调试模式下运行时,你停在你的selenium代码的每一行,但是javascript代码没有停止,所以UI上的元素已经刷新了,然后你的selenium代码获得IWebElement行的新副本。
有几种方法可以解决此问题。
希望有所帮助