1

我正在使用 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 只是什么都不返回。有什么想法吗?

4

1 回答 1

10

问题是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;
});
于 2013-04-19T12:56:46.243 回答