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

时间:2017-07-24 17:16:15

标签: selenium selenium-webdriver c#-3.0

我在第二遍时收到以下错误,同时迭代表行,其中有一个活动的删除按钮 "结果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();
            }

任何帮助将不胜感激。

1 个答案:

答案 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;
}    

这是更昂贵的,因为你必须在一个结束时查找集合,但是你必须这样做以获得第一个元素,因为页面结构发生了变化,并且每次你的集合都已过时删除一个。

你可以进一步改变这一点,只是得到第一个要检查的元素,而不是整个集合,这可能会略微提高性能,但除非你谈论大量的按钮,否则它应该很快