Fluent Wait 不起作用-Seleneium Webdriver

J_C*_*der 2 selenium selenium-webdriver

下面的 WebElement 不存在于网页中。不过我想了解流畅的等待。这里,当 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"));
            }
        });
Run Code Online (Sandbox Code Playgroud)

为什么它没有等待 5 分钟,这段代码有什么问题吗?请帮我解决这个问题。

Mad*_*han 5

确保您导入了正确的NoSuchElementException类。

\n\n
import org.openqa.selenium.NoSuchElementException;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

您每 5 毫秒轮询一次并等待 5 分钟。因此它将检查 60000 次才能找到该元素。这会影响性能。要么将轮询 TimeUnit 增加到秒,要么将超时减少到秒

\n\n

Fluent Wait:让\xe2\x80\x99s 假设你有一个元素,有时只需要 1 秒就出现,有时需要几分钟才能出现。在这种情况下,最好使用流畅等待,因为这将尝试一次又一次地查找元素,直到找到它或直到最终计时器耗尽。

\n\n

显式等待:有时可能会出现特定元素加载时间超过一分钟的情况。在这种情况下,您绝对不喜欢为隐式等待设置很长的时间,因为如果您这样做,您的浏览器将为每个元素等待相同的时间。

\n\n

为了避免这种情况,您只需在所需的元素上放置一个单独的时间即可。通过遵循这一点,您的浏览器隐式等待时间对于每个元素来说都会很短,而对于特定元素来说则会很长。

\n\n

对于您的要求,您可以使用WebDriverWaitExpectedConditions代替 FluentWait 和 Wait ,尽管 WebDriverWait 是 Fl​​uentWait 的扩展。

\n\n

您可以通过此链接阅读比较

\n\n

您的情况可以处理为

\n\n
//timeunit in seconds.\n//There are two other constructors available you can see that in the links\n\n WebDriverWait wait = new WebDriverWait(driver, 300);\n\n WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("BE_flight_flseah_btn")));\n
Run Code Online (Sandbox Code Playgroud)\n