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

Serenity Cucumber无法在Sauce Labs执行 仅本地运行问题排查

问题描述

首次配置Sauce Labs远程执行环境运行Serenity+Cucumber自动化测试时,测试未调度到Sauce Labs平台执行,全部在本地机器启动运行,不清楚远程执行模式需要调整的配置项,相关代码、配置及现象如下:

相关代码与配置

测试启动类 Runner.java

package Global.ExecutionManager;

import io.cucumber.junit.CucumberOptions;
import net.serenitybdd.cucumber.CucumberWithSerenity;
import org.junit.runner.RunWith;

@RunWith(CucumberWithSerenity.class)
@CucumberOptions(plugin = {"pretty"},
        features = "Test",
        glue = "foo"
)
public class TestRunner {

}

测试用例Feature文件

Feature: foo boo.

  Scenario: test
    Given Login with valid "foo" credentials

步骤定义文件

import io.cucumber.java.en.Given;
import net.thucydides.core.annotations.Step;

public class credentails extends Auth {

    public credentails() throws SQLException {
        open();
    }

    @Step
    @Given("^Login with valid \"([^\"]*)\" credentials$")
    public void login_with_valid_credentials(String userType) throws InterruptedException {
      // 业务逻辑代码 ....
    }
}

Serenity配置文件 serenity.properties

saucelabs.target.platform=Windows 10
saucelabs.driver.version=latest
saucelabs.url=https://f00:boo@ondemand.eu-central-1.saucelabs.com:443/wd/hub
saucelabs.access.key=boo
saucelabs.user.id=foo
saucelabs.test.name=testing

现象对比

  • 预期结果:测试任务调度到Sauce Labs云平台执行
  • 实际结果:测试仅在本地机器启动执行

修复方案

现有配置和代码存在两个核心问题,按以下步骤调整即可让测试跑在Sauce Labs平台:

  1. 补充远程驱动核心配置
    现有配置只声明了Sauce Labs相关参数,但没有告诉Serenity需要使用远程驱动执行,Serenity默认会走本地浏览器逻辑。调整serenity.properties配置如下,删除原有把账号密码拼接在地址里的saucelabs.url项,避免配置优先级冲突导致鉴权失败:

    # 指定使用的浏览器类型
    webdriver.driver=chrome
    # 指定Sauce Labs远程执行地址
    webdriver.remote.url=https://ondemand.eu-central-1.saucelabs.com:443/wd/hub
    # Sauce Labs鉴权信息,Serenity会自动完成鉴权拼接,不需要手动写在url里
    saucelabs.username=foo
    saucelabs.accessKey=boo
    saucelabs.target.platform=Windows 10
    saucelabs.driver.version=latest
    saucelabs.test.name=testing
    
  2. 修正open()方法调用位置
    在步骤定义类的构造方法中直接调用open()是核心错误点:步骤类构造方法执行时,Serenity还未完成WebDriver实例的初始化配置,此时调用open()会直接触发本地浏览器启动逻辑,完全绕过Sauce Labs远程配置。
    删掉构造方法内的open()调用,将其移到具体的步骤方法内即可。步骤方法执行时Serenity已经完成了远程驱动的初始化,此时调用open()会自动向Sauce Labs平台发起请求创建浏览器实例,调整后的步骤类代码参考:

    import io.cucumber.java.en.Given;
    import net.thucydides.core.annotations.Step;
    
    public class credentails extends Auth {
    
        public credentails() throws SQLException {
            // 删除原有构造方法内的open()调用
        }
    
        @Step
        @Given("^Login with valid \"([^\"]*)\" credentials$")
        public void login_with_valid_credentials(String userType) throws InterruptedException {
            open(); // open方法移到步骤方法内执行
            // 其余业务逻辑代码 ....
        }
    }
    
  3. 生效验证
    调整完成后启动测试前,先关闭本地所有运行中的chromedriver、geckodriver等驱动进程,启动测试后登录Sauce Labs控制台即可看到正在运行的测试会话,本地不会再弹出浏览器窗口。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 12:25:00