Serenity BDD中withTimeoutOf超时后isPresent()抛出TimeoutException而非返回Boolean的疑问
Serenity BDD中withTimeoutOf超时后isPresent()抛出TimeoutException而非返回Boolean的疑问
嘿,我来帮你理清这个问题~ 你之所以遇到TimeoutException,是因为误解了waitFor()方法的核心逻辑,不是isPresent()的问题哦!
先看你的代码:
@FindBy(id = "privacy-iframe") WebElementFacade cookieBannerIFrame; Boolean cookieDisplayed = withTimeoutOf(Duration.ofSeconds(20)).waitFor(cookieBannerIFrame).isPresent();
这里的waitFor(cookieBannerIFrame)本身就带有“等待元素出现”的强制逻辑——它会在20秒内反复检查这个iframe是否存在,只有当元素出现时才会继续执行后面的isPresent();如果超时了元素还没出现,它直接就抛出TimeoutException了,根本轮不到isPresent()返回false。
你看到的文档里说isPresent()返回Boolean,没错,但那是在元素对象已经被初始化的前提下,用来判断它当前是否在页面上。但结合waitFor()使用时,waitFor()的优先级更高,它先替你做了“必须等到元素出现”的校验,不满足就直接报错。
如果你的需求是“等待20秒,不管元素最后出现没出现,都返回它的存在状态”,那可以换用waitForCondition()来实现,写法如下:
Boolean cookieDisplayed = withTimeoutOf(Duration.ofSeconds(20)) .waitForCondition(() -> cookieBannerIFrame.isPresent());
这个写法会在20秒内反复检查isPresent()的结果,超时后直接返回最后一次检查的布尔值,不会抛出异常,完美符合你的预期~
另外补充一点:Serenity里的waitFor()系列方法,大部分都是“等待条件满足”的语义,不满足就抛异常;而如果你要获取最终状态而非强制等待成功,就要用waitForCondition()或者自己实现循环检查逻辑。
备注:内容来源于stack exchange,提问作者Ragnarsson
相关产品推荐
相关产品推荐

