我正在使用selenium 2和chrome驱动程序,无论我做什么,似乎无法明确等待工作。我试图点击一个元素,它通过ajax动态生成一些数据(没有重新加载),然后在页面出现时搜索一个元素。
这是我的代码
leagueNameItem.Click();
IList<IWebElement> outerTables_forEachLeague = new List<IWebElement>();
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
outerTables_forEachLeague = wait.Until<IList<IWebElement>>((d) =>
{
return d.FindElements(By.ClassName("boxVerde"));
});
找不到元素(并且它肯定在页面上)。等待函数实际上并没有“等待”10秒,因为指定的ut只返回任何内容。有什么想法吗?
答案 0 :(得分:9)
问题是FindElements
立即返回,如果找不到元素,则返回有效的空列表对象。你有两个选择。您可以在等待中使用单个FindElement
,如果该元素不存在则会引发异常。 WebDriverWait
对象将捕获该异常并重试,直到找到该元素。
但是,既然您想从等待中返回一个列表,那么您需要更加聪明,这将导致您的第二个选择。改变你的等待看起来像这样:
leagueNameItem.Click();
IList<IWebElement> outerTables_forEachLeague = new List<IWebElement>();
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
outerTables_forEachLeague = wait.Until<IList<IWebElement>>((d) =>
{
var elements = d.FindElements(By.ClassName("boxVerde"));
if (elements.Count == 0)
{
return null;
}
return elements;
});