提问者:小点点

流畅等待不做任何轮询


我在 SO 上遇到了一个答案,其中共享了两种 Fluent 等待方法,其中只有 1 种轮询其他方法不这样做。

第一:

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)));

第二个1先轮询不。还在控制台中打印它尝试了30秒,间隔为5秒。

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

  1. 场景 2 - 在控制台中打印,但找不到元素,但元素始终存在。
  2. 场景 1 - 完全相反,即它在控制台中不打印任何关于轮询的内容,但能够立即找到元素,只有当元素已经在 DOM 中存在时。这意味着当需要轮询时它会失败。

现在我两者都用,有时是1号,有时是2号。

没有偏好,我只是期望,因为它是流畅的,等待它应该这样表现。

我做错了什么?


共1个答案

匿名用户

在第一个场景中,轮询没有发生,因为您返回的是非空值,这是因为
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;
                }
            }
        });

在second scna Rio:for expected conditions . presenceofallementslocatedby(By locator)中,用于检查网页上是否至少存在一个元素的预期值。