流利的等待不会进行任何轮询

时间:2018-07-31 07:27:46

标签: selenium selenium-webdriver wait fluent

我在SO上遇到了一个答案,其中只有一种会轮询,而另一种不会。

第一

List<WebElement> eList = null;
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(Duration.ofSeconds(30))
                .pollingEvery(Duration.ofSeconds(5)).ignoring(NoSuchElementException.class);

            eList  = (List<WebElement>) wait.until(new Function<WebDriver, List<WebElement>>() {
                public List<WebElement> apply(WebDriver driver) {
                    return driver.findElements(By.xpath(xpathExpression)));
                }
            });

第二:

只需更改#1中的内容

eList = (List<WebElement>) wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(xpathExpression)));

第二个不会先进行轮询。还会在尝试以30秒为间隔5秒的控制台中打印

我不担心为什么不能在控制台中打印,我的问题是

  1. 方案2-在控制台中打印,但找不到元素,但是元素始终存在。
  2. 场景1-进行完全相反的操作,即它在控制台中不打印任何有关轮询的内容,但仅在DOM中已有元素时才能够立即找到该元素。这意味着在需要轮询时失败。

现在我最终会同时使用#1和#2。

我没有期望,因为它很流畅,所以它应该表现得如此。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

在第一种情况下,由于返回的是非null值,所以没有进行轮询,这是因为
1. findElements()方法返回所有WebElement的列表,如果没有匹配项,则返回一个空列表,并且
2. until()方法将等待,直到条件计算得出的值既不为null也不为false。

因此,由于首先,您可以返回null以保持轮询,直到找到所需的元素为止(这是当列表大小大于零时) 您可以尝试以下代码

eList  = (List<WebElement>) wait.until(new Function<WebDriver, List<WebElement>>() {
            public List<WebElement> apply(WebDriver driver) {
                List<WebElement> list=driver.findElements(By.xpath(xpathExpression));
                if(list.size()==0){
                    return null;
                }else{
                    return list;
                }
            }
        });

在第二个方案中:对于ExpectedConditions.presenceOfAllElementsLocatedBy(By locator),期望检查网页上是否存在至少一个元素。