我在第二遍时收到以下错误,同时迭代表行,其中有一个活动的删除按钮 "结果StackTrace:OpenQA.Selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档"
IWebElement baseTable = Browser.Driver.FindElement(By.XPath("//*[@id='approvalsGrid']/table/tbody"));
ICollection<IWebElement> delButton = baseTable.FindElements(By.XPath("//*[@class = 'k-grid-remove lnkDelete']"));
foreach (var button in delButton)
{
button.Click();
WaitForAjax();
//2nd delete button in popup
Browser.Driver.FindElement(By.XPath("//a[text() = ' Delete']")).Click();
WaitForAjax();
}
任何帮助将不胜感激。
答案 0 :(得分:1)
单击删除时,按钮的集合看起来很陈旧,因此删除条目后,该集合将不再可用。
在这种情况下,您可能需要更改策略以在删除新删除按钮后查找新删除按钮。这样的事情可能有用:
By delButtonsBy = By.XPath("//*[@class = 'k-grid-remove lnkDelete']");
bool delButtonExists = baseTable.FindElements(delButtonsBy).Count > 0;
while (delButtonExists)
{
baseTable.FindElements(delButtonsBy)[0].Click();
WaitForAjax();
//2nd delete button in popup
Browser.Driver.FindElement(By.XPath("//a[text() = ' Delete']")).Click();
WaitForAjax();
delButtonExists = baseTable.FindElements(delButtonsBy).Count > 0;
}
这是更昂贵的,因为你必须在一个结束时查找集合,但是你必须这样做以获得第一个元素,因为页面结构发生了变化,并且每次你的集合都已过时删除一个。
你可以进一步改变这一点,只是得到第一个要检查的元素,而不是整个集合,这可能会略微提高性能,但除非你谈论大量的按钮,否则它应该很快