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(( 的情况下获得确切的结果?
提前感谢您的帮助。
听起来您正在自动化的站点将表示对象的元素动态添加到 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;