selenium chrome驱动程序显式等待不起作用

Jea*_*lea 1 c# selenium webdriver

我正在使用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"));
        });
Run Code Online (Sandbox Code Playgroud)

找不到该元素(它肯定在页面上).等待函数实际上并没有"等待"10秒,因为指定的ut只返回任何内容.有什么想法吗?

Jim*_*ans 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;
});
Run Code Online (Sandbox Code Playgroud)