我正在使用visual studio进行自动化测试。获取内部元素值时,它显示此错误。
它不会一直显示此错误,但有时会成功测试。
发生OpenQA.Selenium.StaleElementReferenceException HResult = 0x80131500 Message =陈旧元素引用:元素未附加到页面文档
我试图解决这个问题,但不幸的是我没有得到任何积极的结果。
以下是我的代码:
public List<CaseListEntry> GetCaseListEntries()
{
var CaseGridTrs = CaseListGrid.FindElements(By.XPath(".//tr"));
var entryList = CaseGridTrs.Select(x =>
{
var CaseEntryTds = x.FindElements(By.XPath(".//td"));
var RegisterDate = CaseEntryTds.ElementAt(1).Text;
var RegisterNo = CaseEntryTds.ElementAt(3).Text;
return new CaseListEntry
{
ListNo = CaseEntryTds.ElementAt(0).FindElement(By.XPath(".//a")).Text,
RegDate = DateTime.ParseExact(RegisterDate, "dd.MM.yyyy",
CultureInfo.InvariantCulture),
DocumentType = CaseEntryTds.ElementAt(2).Text,
};
}).ToList();
return entryList;
}
我在第8行得到这个陈旧的异常错误。我也尝试使用webdriver.wait它仍然显示相同的错误。
我也尝试等待页面加载
var customWait = new WebDriverWait(new SystemClock(), driver, TimeSpan.FromSeconds(5), TimeSpan.FromMilliseconds(1));
//ignore the timeout exception
try
{
customWait.Until(CustomExpectedCond.ElementHasClass(LoadingIndicator, "t-icon t-refresh t-loading"));
customWait.Until(CustomExpectedCond.ElementHasClass(LoadingIndicator, "t-icon t-refresh"));
}
catch (WebDriverTimeoutException) { /*ignore and hope for the best*/ }
}
你可以这样做:
public List<CaseListEntry> GetCaseListEntries()
{
var CaseGridTrs = CaseListGrid.FindElements(By.XPath(".//tr"));
var entryList = CaseGridTrs.Select(x =>
{
var CaseEntryTds = x.FindElements(By.XPath(".//td"));
var ListNoElement = GetElementOrNull(CaseEntryTds,0);
var RegisterDateElement = GetElementOrNull(CaseEntryTds,1);
var DocumentTypeElement = GetElementOrNull(CaseEntryTds,2);
var RegisterNoElement = GetElementOrNull(CaseEntryTds,3);
var RegisterDate = (RegisterDateElement != null)? RegisterDateElement.Text : "";
var RegisterNo = (RegisterNoElement != null)? RegisterNoElement.Text : "";
var ListNo = (ListNoElement != null) ? ListNoElement.FindElement(By.XPath(".//a")).Text : "";
var DocumentType = (DocumentTypeElement != null) ? DocumentTypeElement.Text : "";
return new CaseListEntry
{
ListNo = ListNo ,
RegDate = DateTime.ParseExact(RegisterDate, "dd.MM.yyyy",
CultureInfo.InvariantCulture),
DocumentType = DocumentType
};
}).ToList();
return entryList;
}
public IWebElement GetElementOrNull(IList<IWebElement> CaseEntryTds, int elementAtPosition, int maxSeconds = 1) {
IWebElement element = null;
IWait<IWebDriver> wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(maxSeconds));
wait.Until(d => {
try {
element = CaseEntryTds.ElementAt(elementAtPosition);
return element.Displayed;
} catch (WebDriverTimeoutException) {
return false;
} catch (NoSuchElementException) {
return false;
}
});
return element;
}