我正在使用Visual Studio进行自动化测试。获取内部元素值时,它显示此错误。
它不会一直显示此错误,但有时已经成功测试。
发生OpenQA.Selenium.StaleElementReferenceException HResult = 0x80131500消息=过时的元素引用:元素未附加到页面文档
我试图解决此问题,但不幸的是我没有得到任何积极的结果。
下面是我的代码:
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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句