【问题标题】:Execute selenium/cucumber test in parallel, but all tests are running on the same Chrome instance并行执行 selenium/cucumber 测试,但所有测试都在同一个 Chrome 实例上运行
【发布时间】:2021-03-06 20:02:29
【问题描述】:

我用maven、spring-boot、cucumber(jvm5)、selenium等搭建了一个测试框架。 该框架在很长一段时间内都可以正常工作(并行),但我最近得到了这种有线行为。当我并行运行两个测试时,我可以看到两个 chrome 实例已启动,但只有一个实例正确打开了 URL(另一个有数据;在 url 字段中)。同时在该 chrome 实例上执行了两个测试。 (例如在输入框中同时输入两个不同的用户名。)

欢迎任何意见。谢谢。

下面是我的 pom.xml 并行设置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M3</version>
    <configuration>
    <parallel>methods</parallel>
    <!--<threadCount>4</threadCount>-->
    <useUnlimitedThreads>true</useUnlimitedThreads>
    <argLine>
        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
        -Xmx1024m -XX:MaxPermSize=256m
    </argLine>
    <systemPropertyVariables>
    <allure.results.directory>${project.build.directory}/allure-results
    </allure.results.directory>
    </systemPropertyVariables>
    </configuration>
    ....
</plugin>

这是跑步者类:

@RunWith(Cucumber.class)
@CucumberOptions(
        strict = true,
        features = {"src/test/resources/features"},
        plugin = {
                "pretty",
                "html:target/cucumber-html-report",
                "json:target/cucumber/cucumber.json",
                "junit:target/cucumber/cucumber.xml",
                "io.qameta.allure.cucumber5jvm.AllureCucumber5Jvm",
                "rerun:target/rerun.txt"
        },
        glue = {"com.demo.bss.steps", "com.demo.bss.hook"},
        stepNotifications = true,
        monochrome = true,
        tags = {"not @deprecated"})
public class CukeTest {

}

这里是步骤定义:

//Globel step state class
@Component
public class GlobalStepState {

  protected WebDriver driver;
  protected WebDriverWait wait;

  protected LoginPage loginPage;
  protected CrmMainPage crmMainPage;
  protected ProdCatalogMainPage prodCataPage;

  @Value("${spring.url.bss}")
  protected String url;

}

//Global shared stepdefs
public class GlobalStepDef implements En {

  @Autowired
  GlobalStepState state;
  @Autowired
  CukeHook cukeHook;

  public GlobalStepDef() {
    Before(
        1,
        () -> {
          state.driver = cukeHook.getWebDriver();
          state.wait = new WebDriverWait(state.driver, 30);

          state.loginPage = new LoginPage(state.driver);
          state.crmMainPage = new CrmMainPage(state.driver);
          state.prodCataPage = new ProdCatalogMainPage(state.driver);
        });

    Given("^open COMARCH BSS login page$", () -> {

      state.driver.get(state.url);

    });
  }

}

//normal stepdefs
public class LoginStepDefs implements En {

  @Autowired
  private GlobalStepState state;

  public LoginStepDefs() {

    When("^I login with a user \"([^\"]*)\" and \"([^\"]*)\"$", (String email, String password) -> {
      state.loginPage.inputEmail.sendKeys(email);
      state.loginPage.inputPassword.sendKeys(password);
      state.loginPage.btnLogin.click();
    });

    Then("^the (.*) user name show display as (.*)$", (String type, String userName) -> {
      WebElement eleUserName = type.equals("CRM") ? state.crmMainPage.strCrmUserName : state.prodCataPage.strCatalogUserName;
      state.wait.until(ExpectedConditions.visibilityOf(eleUserName));
      Assert.assertEquals(userName, eleUserName.getText());
    });
  }
}

【问题讨论】:

    标签: java selenium cucumber browser-automation


    【解决方案1】:

    Spring 中的组件是单例的。因此,当您创建两个 webdrivers 时,您将它们分配给同一对象的同一字段。这意味着只使用一个。

    大概您在升级到 v5 后已经开始遇到这种行为。由于 v5 Cucumber 将在线程之间共享 spring 应用程序上下文(就像所有其他 spring 测试一样)。

    https://github.com/cucumber/cucumber-jvm/blob/main/CHANGELOG.md#500-rc4-2019-12-21

    为确保组件不在场景之间共享,您必须使用 @ScenarioScope 对其进行注释。

    https://github.com/cucumber/cucumber-jvm/tree/main/spring

    【讨论】:

    • 谢谢,Korstanje,终于知道如何让它工作了。你在 Github 上的示例代码真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多