【问题标题】:c# Selenium Webdriver -- Iterating through table rows and click button in each rowc# Selenium Webdriver -- 遍历表行并单击每行中的按钮
【发布时间】:2017-07-24 17:16:14
【问题描述】:

在遍历有活动删除按钮的表行时,我在第二遍时收到以下错误。
“结果 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();
            }

任何帮助将不胜感激。

【问题讨论】:

  • 这是一个私人网页还是我们可以查看它?
  • 这是开发服务器上的私有页面。必须在网络内才能访问它。
  • 可能发生的情况是第二次迭代可能会找到前一个删除按钮,因为它太快了。这将是有道理的,为什么你会得到一个陈旧的元素异常。在单击删除按钮之前,您可以尝试将单击功能包装在 try catch 中或放入另一个类似这样的睡眠/等待命令 (stackoverflow.com/questions/20798752/…)
  • 当您单击一个按钮时,页面结构会发生变化,从而使所有其余按钮都过时。每次迭代时重新查找第一个删除按钮可能会更好,并根据您找到的删除按钮进行迭代,而不是在集合中的每个按钮上进行迭代。

标签: selenium selenium-webdriver c#-3.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;
}    

这更昂贵,因为您必须一遍又一遍地查找集合,但无论如何您都必须这样做才能获得第一个元素,因为页面结构会发生变化,并且每次删除一个集合时集合都已过期.

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

【讨论】:

  • 这段代码有点神奇。有用!我发现这段代码在查找表本身方面要好一些:IWebElement tableElement = driver.FindElement(By.Id("resultTableHeader"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多