c Selenium Webdriver--遍历表行并单击每行中的按钮

c Selenium Webdriver--遍历表行并单击每行中的按钮,selenium,selenium-webdriver,c#-3.0,Selenium,Selenium Webdriver,C# 3.0,我在第二次遍历表行时收到以下错误,其中有一个活动的删除按钮。 结果StackTrace:OpenQA.Selenium.StaleElementReferenceException:stale元素引用:元素未附加到页面文档 IWebElement baseTable = Browser.Driver.FindElement(By.XPath("//*[@id='approvalsGrid']/table/tbody")); ICollection&

我在第二次遍历表行时收到以下错误,其中有一个活动的删除按钮。 结果StackTrace:OpenQA.Selenium.StaleElementReferenceException:stale元素引用:元素未附加到页面文档

            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();
            }

任何帮助都将不胜感激。

当您单击其中一个按钮上的“删除”按钮时,按钮集合似乎会过时,因此一旦您删除一个条目,该集合将不再可用

在这种情况下,您可能需要更改策略,以便在删除按钮后查找新的删除按钮。类似的方法可能会奏效:

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;
}    
这样做的代价更高,因为您必须一次又一次地查找集合,但无论如何您都必须这样做才能获得第一个元素,因为页面结构会发生变化,并且每次删除一个集合时,集合都会过期


您可以进一步修改它,只需检查第一个元素,而不是整个集合,这可能会稍微提高性能,但无论哪种方式,它都应该非常快,除非您谈论的是大量按钮。

这是一个私有网页还是我们可以查看它?这是dev服务器上的私有网页。必须在网络中才能访问它。可能发生的情况是,第二次迭代可能会找到上一个删除按钮,因为它运行得太快了。这就解释了为什么您会得到一个陈旧的元素异常。您可以尝试将click函数包装在一个try-catch中,或者在单击delete按钮之前插入另一个类似的sleep/wait命令。当您单击一个按钮时,页面的结构会发生变化,使所有其他按钮都过时。在每次迭代中重新查找第一个delete按钮可能会更好,并根据找到的delete按钮进行迭代,而不是在集合中的每个按钮上进行迭代。