Selenium WebDriver FindElements没有返回足够的值

时间:2014-12-19 06:55:49

标签: c# selenium selenium-webdriver nunit

我已经使用WebDriver.FindElements()设置了一个具有属性获取值的类。

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

我还实现了测试用例以测试Add New功能。

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

我设定了一个观察价值的断点。 ListObjectElements属性有10个项目,但返回newList只有9个。

    var newList = clientpage.ListObjectElements;

    return newList;

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

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

先谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

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

// 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;