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

如何在Selenium Java框架中复用登录会话执行Feature文件场景测试

复用Selenium会话实现单登录多场景测试

针对你的需求,这里给出一套基于Java+Cucumber的实现方案,确保同一用户仅登录一次,所有Feature场景复用该会话,同时适配并行执行要求:

1. 全局会话管理类

实现单例模式的会话管理器,负责创建、存储已登录的WebDriver实例,避免重复初始化和登录:

public class SessionManager {
    private static WebDriver driver;
    private static boolean isLoggedIn = false;

    // 获取全局WebDriver实例,不存在则创建
    public static WebDriver getDriver() {
        if (driver == null) {
            // 根据你的浏览器配置初始化Driver,这里以Chrome为例
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--start-maximized");
            driver = new ChromeDriver(options);
        }
        return driver;
    }

    // 仅在未登录时执行登录操作
    public static void loginIfNotLoggedIn() {
        if (!isLoggedIn) {
            WebDriver driver = getDriver();
            driver.get("你的登录页面URL");
            
            // 执行登录逻辑,替换为你的实际元素定位和操作
            driver.findElement(By.id("username-input")).sendKeys("你的测试用户名");
            driver.findElement(By.id("password-input")).sendKeys("你的测试密码");
            driver.findElement(By.id("login-submit-btn")).click();
            
            // 等待登录完成(显式等待首页元素出现)
            new WebDriverWait(driver, Duration.ofSeconds(10))
                .until(ExpectedConditions.visibilityOfElementLocated(By.id("home-page-header")));
            
            isLoggedIn = true;
        }
    }
}

2. Cucumber钩子配置

通过Cucumber的钩子方法,确保每个场景复用全局会话,仅在所有场景结束后释放资源:

public class TestHooks {
    // 每个场景执行前的准备:获取会话、确保已登录、重置页面状态
    @Before
    public void setupScenario() {
        WebDriver driver = SessionManager.getDriver();
        SessionManager.loginIfNotLoggedIn();
        
        // 场景执行前重置到应用初始页面(避免上一场景的状态污染)
        driver.get("你的应用首页URL");
    }

    // 所有场景执行完成后,统一关闭浏览器、清理会话
    @AfterAll
    public static void teardownAllScenarios() {
        WebDriver driver = SessionManager.getDriver();
        if (driver != null) {
            // 可选:如果需要清理登录状态,执行登出操作
            // driver.findElement(By.id("logout-btn")).click();
            
            driver.quit();
            SessionManager.driver = null;
            SessionManager.isLoggedIn = false;
        }
    }
}

3. 适配并行执行的配置

由于客户端不允许同一用户多次登录,需确保同一Feature的所有场景共享一个会话。在Cucumber的配置文件(如junit-platform.properties)中设置并行策略为按Feature分组:

# 启用并行执行
cucumber.execution.parallel.enabled=true
# 按Feature分配线程,同一Feature的场景串行执行
cucumber.execution.parallel.strategy=FEATURE
# 可选:设置最大线程数
cucumber.execution.parallel.config.fixed.parallelism=3

4. 场景状态处理注意事项

  • 不要在单个场景的@After钩子中执行登出或关闭Driver操作,避免会话提前销毁。
  • 如果场景间存在状态依赖(如某场景修改了用户设置),可在@Before钩子中通过调用后端接口、重置页面元素等方式恢复干净状态,无需重新登录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:57:38