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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:13:11