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平台:
补充远程驱动核心配置
现有配置只声明了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修正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方法移到步骤方法内执行 // 其余业务逻辑代码 .... } }生效验证
调整完成后启动测试前,先关闭本地所有运行中的chromedriver、geckodriver等驱动进程,启动测试后登录Sauce Labs控制台即可看到正在运行的测试会话,本地不会再弹出浏览器窗口。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

