如何通过Java try-catch实现多分支动态页面动作逻辑?
统一处理登录后多动态场景的实现方案
要实现统一逻辑处理三种动态场景,不用单独编写各自的代码,可以通过依次尝试场景+异常捕获或者场景检查标记的方式来实现,下面给出两种可行的Java实现方案:
方案一:基于异常分层捕获的实现
这种方式贴近你想要的try-catch结构,通过自定义异常或利用元素查找异常来区分场景,按顺序尝试每种操作:
// 自定义异常用于区分场景 class AddButtonDisabledException extends Exception {} public void handlePostLoginAction() { try { // 尝试场景1:操作可点击的Add链接 WebElement addLink = driver.findElement(By.linkText("Add")); if (addLink.isDisplayed() && addLink.isEnabled()) { addLink.click(); performAddUserLogic(); // 执行新增用户的具体逻辑 return; } else { // Add链接存在但禁用,抛出对应异常 throw new AddButtonDisabledException(); } } catch (NoSuchElementException e) { // 找不到Add链接,尝试场景2:检查禁用的Add按钮及提示 try { WebElement disabledAddBtn = driver.findElement(By.cssSelector("button[disabled]:contains('Add')")); if (disabledAddBtn.isDisplayed()) { // 校验提示信息 WebElement errorMsg = driver.findElement(By.id("user-add-error")); assert errorMsg.isDisplayed() && errorMsg.getText().equals("无法新增用户"); return; } } catch (NoSuchElementException ex) { // 场景2不匹配,尝试场景3:操作Link New按钮 try { WebElement linkNewBtn = driver.findElement(By.buttonText("Link New")); if (linkNewBtn.isDisplayed() && linkNewBtn.isEnabled()) { linkNewBtn.click(); performLinkNewUserLogic(); // 执行关联新用户的具体逻辑 return; } } catch (NoSuchElementException exc) { // 所有场景都不匹配,抛出异常 throw new IllegalStateException("未识别到登录后预期的任何操作场景"); } } } catch (AddButtonDisabledException e) { // 处理Add链接禁用的场景,校验提示信息 WebElement errorMsg = driver.findElement(By.id("user-add-error")); assert errorMsg.isDisplayed() && errorMsg.getText().equals("无法新增用户"); } } // 新增用户逻辑封装 private void performAddUserLogic() { // 这里写新增用户的具体步骤,比如填写表单、提交等 } // 关联新用户逻辑封装 private void performLinkNewUserLogic() { // 这里写关联新用户的具体步骤,比如选择用户、确认关联等 }
方案二:基于标记位的顺序尝试实现
这种方式避免了深层嵌套的try-catch,通过标记位判断是否已处理场景,代码可读性更强:
public void handlePostLoginAction() { boolean isHandled = false; // 尝试场景1:Add链接可点击 try { WebElement addLink = driver.findElement(By.linkText("Add")); if (addLink.isDisplayed() && addLink.isEnabled()) { addLink.click(); performAddUserLogic(); isHandled = true; } } catch (NoSuchElementException ignore) {} // 场景1未处理,尝试场景2:Add按钮禁用+校验提示 if (!isHandled) { try { WebElement disabledAddBtn = driver.findElement(By.cssSelector("button[disabled].add-button")); if (disabledAddBtn.isDisplayed()) { WebElement errorMsg = driver.findElement(By.className("error-message")); assert errorMsg.getText().contains("无法新增用户"); isHandled = true; } } catch (NoSuchElementException ignore) {} } // 场景1、2未处理,尝试场景3:Link New按钮操作 if (!isHandled) { try { WebElement linkNewBtn = driver.findElement(By.buttonText("Link New")); if (linkNewBtn.isDisplayed() && linkNewBtn.isEnabled()) { linkNewBtn.click(); performLinkNewUserLogic(); isHandled = true; } } catch (NoSuchElementException ignore) {} } // 所有场景都未匹配,抛出异常 if (!isHandled) { throw new RuntimeException("未匹配到任何登录后预期的操作场景"); } } // 下面两个方法同方案一 private void performAddUserLogic() { /* ... */ } private void performLinkNewUserLogic() { /* ... */ }
方案说明
- 两种方案都是按场景优先级依次尝试,你可以根据实际业务调整场景的尝试顺序。
- 元素定位方式(
By.linkText、By.cssSelector等)需要根据你页面的实际DOM结构修改。 - 断言部分可以替换为你项目中使用的测试断言框架(如TestNG、JUnit的断言方法)。
内容的提问来源于stack exchange,提问作者mmar
相关产品推荐
相关产品推荐

