Selenium中NoSuchElementException处理:表单必填项错误消失校验问题
问题根因
你调用cp.getEmailIdError()时,该方法内部直接使用findElement查找对应错误提示元素,当错误提示消失后该元素已从DOM中移除,findElement会直接抛出NoSuchElementException,异常发生在软断言执行之前,所以你包裹断言的try-catch自然捕获不到。
正确处理方案
方案1:改用findElements判断元素是否存在(推荐)
findElements在匹配不到元素时会返回空列表,不会抛出异常,你可以新增判断错误提示是否展示的方法:
// 页面对象类中新增方法,替换原有直接返回元素的逻辑 public boolean isEmailErrorVisible() { // 匹配错误提示元素,判断是否存在且可见 return driver.findElements(By.id("email-err")).stream() .anyMatch(WebElement::isDisplayed); } public boolean isForeNameErrorVisible() { return driver.findElements(By.id("forename-err")).stream() .anyMatch(WebElement::isDisplayed); }
之后修改软断言逻辑即可:
softAssert.assertFalse(cp.isForeNameErrorVisible(), "输入姓名后对应必填错误提示未消失"); softAssert.assertFalse(cp.isEmailErrorVisible(), "输入邮箱后对应必填错误提示未消失");
方案2:给原有获取元素的方法添加异常捕获
如果你不想修改原有断言写法,可以在获取错误元素的方法中捕获异常,元素不存在时返回null:
public WebElement getEmailIdError() { try { return driver.findElement(By.id("email-err")); } catch (NoSuchElementException e) { return null; } }
该写法可以直接兼容你现有的assertNull断言逻辑。
额外注意
如果你的错误提示消失逻辑是前端加了display: none/visibility: hidden样式,而非直接从DOM移除元素,必须加上isDisplayed()判断,避免元素存在但不可见时断言误判。
内容的提问来源于stack exchange,提问作者Tester
相关产品推荐
相关产品推荐

