Selenium WebDriver FindElements 不返回足够的值

本文关键字:返回 WebDriver FindElements Selenium | 更新日期: 2023-09-27 18:34:38

我已经设置了一个类,其属性从WebDriver.FindElements((获取值。

    public IList<IWebElement> ListObjectElements
    {
        get
        {
            var container = WebDriver.FindElement(By.Id("objects"));
            return container.FindElements(By.XPath("//*[contains(@id, 'id_')]"));
        }
    }

我还实现了测试用例来测试添加新函数。

所有步骤都取得了成功。当我尝试在添加新列表后返回新列表时,它错过了 1 个项目。

我设置了一个断点来监视值。属性 ListObjectElements 有 10 个项目,但返回的 newList 只有 9 个。

    var newList = clientpage.ListObjectElements;
    return newList;

如果我添加一个 Thread.Sleep((,则返回的 newList 有 10 个与属性 ListObjectElements 相同的项目。

如何在不使用 Thread.Sleep(( 的情况下获得确切的结果?

提前感谢您的帮助。

Selenium WebDriver FindElements 不返回足够的值

听起来您正在自动化的站点将表示对象的元素动态添加到 DOM,然后您的代码将失去您在元素实际添加到 DOM 之前FindElements执行的竞争条件。您需要在代码中实现某种等待。您可能能够利用 WebDriverWait 构造,其 .NET 实现在WebDriver.Support程序集中可用。可以采用类似于以下内容的方式使用该构造:

// Assumes 'driver' is a valid IWebDriver instance.
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until<bool>((d) =>
{
    return clientPage.ListObjectElements.Count > 9;
});

在测试用例中将其放在更具体的上下文中,如下所示,具体取决于您的架构和愿望:

// Assume that the element you click on to add a new element
// is stored in the variable 'element', and your IWebDriver
// variable is 'driver'.
int originalCount = clientPage.ListObjectElements.Count;
element.Click();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
wait.Until<bool>((d) =>
{
    return clientPage.ListObjectElements.Count > originalCount;
});
return clientPage.ListObjectElements;