我已经使用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()的情况下获得准确的结果?
先谢谢你的帮助。
答案 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;