流利的等待不起作用 - Seleneium Webdriver

时间:2015-06-28 08:46:50

标签: selenium selenium-webdriver

下面的WebElement在WebPage中不存在。但是我想了解Fluent等。 当webdriver尝试识别BE_flight_flseah_btn时,它应该根据代码等待最多5分钟,但它会在几秒钟内抛出错误,说没有这样的元素。

Wait<WebDriver> w=new FluentWait<WebDriver>(dr)
        .withTimeout(5,TimeUnit.MINUTES)
        .pollingEvery(5,TimeUnit.MILLISECONDS)
        .ignoring(NoSuchElementException.class);
        WebElement we=w.until(new Function<WebDriver,WebElement>()
        {
            public WebElement apply(WebDriver dr)
            {
                return dr.findElement(By.id("BE_flight_flseah_btn"));
            }
        });

为什么它不等待5分钟,这段代码有什么问题?请帮帮我。

3 个答案:

答案 0 :(得分:1)

确保您已导入正确的NoSuchElementException课程。

import org.openqa.selenium.NoSuchElementException;

因为如果你使用像eclipse或Netbeans这样的任何ide,自动导入很可能会导入import java.util.NoSuchElementException;这是错误的

您每5毫秒轮询一次并等待5分钟。所以它将检查60000次以找到该元素。它将影响性能。将轮询TimeUnit增加到秒或将超时减少到秒

流畅等待让我们假设您有一个元素,有时会在1秒钟内出现,有些时间需要几分钟才会出现。在这种情况下,最好使用流畅的等待,因为这将尝试一次又一次地找到元素,直到找到它或直到最后的计时器用完为止。

显式等待:可能存在特定元素加载超过一分钟的实例。在这种情况下,你绝对不想为Implicit wait设置一个巨大的时间,就像你这样做一样,你的浏览器将会为每个元素等待相同的时间。

为避免这种情况,您只需在所需元素上单独设置一个时间即可。通过遵循这一点,您的浏览器隐含的等待时间对于每个元素都是短的,并且对于特定元素它将是大的。

根据您的要求而不是FluentWait和Wait,您可以使用WebDriverWaitExpectedConditions,但WebDriverWait是FluentWait的扩展。

您可以阅读comparison over this link

您的条件可以作为

处理
//timeunit in seconds.
//There are two other constructors available you can see that in the links

 WebDriverWait wait = new WebDriverWait(driver, 300);

 WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("BE_flight_flseah_btn")));

答案 1 :(得分:0)

public WebElement waitForElementDisplayed(final Supplier<By> by,
                                              final int timeToWaitInSec) {
        Wait<Browser> wait = new FluentWait<>(this)
                .withTimeout(timeToWaitInSec, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.MILLISECONDS)
                .ignoring(WebDriverException.class);
        wait.until(ExpectedConditions.presenceOfElementLocated(by.get()));
        WebElement foo = wait.until((Function<Browser, WebElement>) (Browser driver) -> {
            try {
                Element element = driver.findElement(by);
                if (element.isDisplayed()) {
                    return element;
                }
            } catch (Exception e) {

            }
            return null;
        });
        return foo;
    }

调用此方法-您的脚本应该可以正常工作。

答案 2 :(得分:0)

.ignoring(NoSuchElementException.class)-应该从导入org.openqa.selenium.NoSuchElementException;

导入

默认情况下,Eclipse要求从 java.util.NoSuchElementException; 导入NoSuchElementException类;或者 org.openqa.selenium.NoSuchElementException;

如果我们选择-java.util.NoSuchElementException;那么程序将不会等待轮询语句中提到的最长时间。

从技术上讲,代码没有什么错,只是导入了错误的包