You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Selenide在重试过程中刷新页面且不触发错误?

优化Selenide页面状态更新后的元素校验逻辑

针对缓存冷启动/预热导致的页面状态更新后,Selenide无法自动识别状态变化的问题,可以通过自定义带刷新的重试逻辑替代原有try-catch写法,解决原代码的诸多缺陷:

方案1:自定义重试方法(Kotlin)

import com.codeborne.selenide.ex.ElementNotFound
import java.time.Duration

fun waitForElementWithRefresh(selector: com.codeborne.selenide.By, maxRetries: Int = 2) {
    var attempts = 0
    while (attempts < maxRetries) {
        try {
            // 设置短超时,避免不必要的长时间等待
            element(selector).shouldBe(com.codeborne.selenide.Condition.visible, Duration.ofSeconds(2))
            return
        } catch (e: ElementNotFound) {
            attempts++
            if (attempts < maxRetries) {
                refresh() // 仅在重试时刷新页面
            } else {
                throw e // 最后一次重试失败,抛出原异常,保留报错逻辑
            }
        }
    }
}

// 调用示例
element(byAttribute("type", "submit")).click()
waitForElementWithRefresh(byText("some specific text"))

方案2:使用Selenide Wait API

import com.codeborne.selenide.ex.ElementNotFound
import java.time.Duration

element(byAttribute("type", "submit")).click()

// 总超时10秒,每2秒轮询一次
Wait().withTimeout(Duration.ofSeconds(10))
      .pollingEvery(Duration.ofSeconds(2))
      .until {
          try {
              element(byText("some specific text")).isDisplayed
          } catch (e: ElementNotFound) {
              refresh()
              false
          }
      }

// 最终校验元素可见性
element(byText("some specific text")).shouldBe(visible)

方案优势

  • 精准异常处理:仅在重试次数内捕获ElementNotFound,最后一次失败仍会抛出异常,不会掩盖真正的元素不存在问题
  • 减少无效副作用:只有最后一次重试失败才会触发错误截图等Selenide默认报错行为,避免无效的调试信息生成
  • 灵活重试配置:可自定义重试次数,适配不同缓存预热时长的场景
  • 提升效率:使用短超时或轮询机制,无需等待完整默认超时即可刷新页面,缩短测试执行时间

原写法的核心问题

  • 无差别捕获所有ElementNotFound异常,可能掩盖真正的元素缺失问题
  • 首次失败就触发错误截图,生成无效的调试信息
  • 仅支持单次重试,无法适配缓存预热较慢的场景
  • 等待完整默认超时后才刷新,浪费测试时间

内容的提问来源于stack exchange,提问作者wotanii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:50:24