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

Selenium Webdriver删除网页表格记录触发NoSuchElement异常求解决方案

问题解决方案

问题根源

你当前报错的核心原因是:使用@FindBy注解绑定单个WebElement时,只要页面不存在匹配该XPath的元素,调用该元素的任意方法(包括isDisplayed())都会直接抛出NoSuchElementException,根本不会进入你写的if判断逻辑。

优化实现方案

最稳定的实现方式是改为查找同规则的元素列表,结合显式等待判断元素是否存在,完全避免硬等待和异常提前抛出的问题:

注意:使用显式等待需要提前导入org.openqa.selenium.support.ui.WebDriverWait、org.openqa.selenium.support.ui.ExpectedConditions相关依赖包。

1. 首先修改Page类的元素定义

将单个删除按钮元素改为元素列表:

// 原单元素定义替换为列表定义
@FindBy(xpath = "//*[@id=\"gridResourceSchedule\"]//td[6]/a[2]")
List<WebElement> deleteResourceScheduleBtns; 

2. 修改主逻辑实现

删除所有硬等待,改用Selenium自带的显式等待处理元素状态判断:

//resourceSchedulePage - Class object
schedulerPage.clickResourceSchedule().click();
logger.info("Resource schedule link is clicked");

// 定义2秒的显式等待,可根据实际页面加载速度调整时长,Selenium3版本直接传秒数即可:new WebDriverWait(driver, 2)
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));
try {
    // 等待删除按钮可见
    wait.until(ExpectedConditions.visibilityOfAllElements(deleteResourceScheduleBtns));
    // 列表不为空说明存在删除按钮,点击第一个
    if (!deleteResourceScheduleBtns.isEmpty()) {
        deleteResourceScheduleBtns.get(0).click();
        // 这里也可以替换为等待删除弹窗/成功提示出现的显式等待
        Thread.sleep(500);
    }
} catch (TimeoutException e) {
    // 等待超时说明页面没有删除按钮,直接关闭窗口
    driver.close();
}

额外优化建议

  • 所有场景优先使用显式等待替代Thread.sleep、driver.wait()这类硬等待,既可以提升执行效率,也能避免网络、服务器响应波动导致的用例不稳定。
  • 如果需要保留单个元素的判断逻辑,也可以封装异常捕获的工具方法实现存在性判断:
public boolean isDeleteBtnDisplayed() {
    try {
        return deleteResourceScheduleBtn.isDisplayed();
    } catch (NoSuchElementException e) {
        return false;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:30:00