【问题标题】:Why doesn't my wait method wait until 30 seconds?为什么我的等待方法不等到 30 秒?
【发布时间】:2017-06-05 14:05:06
【问题描述】:

为什么我的等待方法不等到 30 秒?

如果方法找不到元素,我的方法应该在 30 秒后超时,当前返回 true 或 false 没有任何超时,有什么想法吗?

    public boolean WaitUntilWebElementIsVisiblePredicate(WebElement element) {
FluentWait<WebElement> wait = new FluentWait<WebElement>(element)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(100, TimeUnit.MILLISECONDS)
        .ignoring(NoSuchFieldException.class);

Function<WebElement, Boolean> f = new Function<WebElement, Boolean>() {
    @Override
    public Boolean apply(WebElement element) {
        if (!element.isDisplayed()) {
            System.out.println("Method failed: WaitUntilWebElementIsVisiblepPredicate, using locator: " + element.toString());
            return false;
        }
        System.out.println("Element visible, using method: WaitUntilWebElementIsVisiblepPredicate, Locator: " + element.toString());
        return true;                
    }
};
return wait.until(f);
}

【问题讨论】:

    标签: java selenium selenium-webdriver webdriver


    【解决方案1】:

    一旦apply(WebElement element) 中的条件返回false,代码将等待pollingEvery 中定义的时间。然后,将实际开始时间(由 FluentWait 在开始时捕获)与当前时间进行比较。如果wait 开始时间和当前时间的差小于withTimeout(30, TimeUnit.SECONDS) 中设置的时间,则再次执行函数f,直到timeout expirescondition becomes true

    所以 IMO,如果它早于超时期限返回,apply(WebElement element) 似乎已经返回true

    查看方法签名here

    【讨论】:

    • 感谢您的评论,即使该方法返回 false,它也不会继续轮询,并且会等待最长 30 秒超时到期
    • 我看不出这段代码有什么问题,除了你将return wait.until(f);返回一个布尔函数,但我猜until方法返回类型是WebElement。
    • 我唯一的问题是我需要将 WebElement(id 定位器)作为参数传递
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2019-07-04
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多