2

我在这里使用了公认的解决方案并提出了以下代码:

参考图书馆:

pico_ref_libs

特征:

Feature: FeatureA

  Scenario: ScenarioA
    Given 
    When 
    Then

  Scenario: ScenarioB
    Given 
    When 
    Then

基本步骤:

public class BaseStep {
    protected WebDriver driver = null;
    private static boolean isInitialized = false;

    @Before
    public void setUp() throws Exception {
        if (!isInitialized) {
            driver = SeleniumUtil.getWebDriver(ConfigUtil.readKey("browser"));
            isInitialized = true;
        }
    }

    @After
    public void tearDown() {
        driver.quit();
    }

}

步骤A:

public class StepA {
    private BaseStep baseStep = null;
    private WebDriver driver = null;

    // PicoContainer injects BaseStep class
    public StepA(BaseStep baseStep) {
        this.baseStep = baseStep;
    }

    @Given("^I am at the Login page$")
    public void givenIAmAtTheLoginPage() throws Exception {
        driver = baseStep.driver;
        driver.get(ConfigUtil.readKey("base_url"));
    }

    @When
    @When
    @Then
    @Then

}

但是,驱动程序在 ScenarioA 之后“死亡”并在tearDown()ScenarioB 的 Given 步骤中变为 null(两种场景都使用相同的 Given)。我没有使用 Maven。

4

2 回答 2

3

这是因为这条线:

private static boolean isInitialized = false;

对于每个场景,cucumber 都会为涉及的每个步骤文件创建一个新实例。因此,当场景开始时, driverinBaseStep始终为空。

静态isInitialized布尔值不是实例的一部分,它绑定到它所在的类,并且在 JVM 关闭之前它一直存在。第一个场景将它设置为true,这意味着当第二个场景开始时它仍然是true并且它不会重新初始化setUp()方法中的驱动程序。

您可能希望使driverstatic 与两种方案共享相同的实例。

于 2017-08-20T11:28:16.597 回答
1

从卢西亚诺的回答来看,这就是我最终得到的结果:

特征:

Feature: FeatureA

  Scenario: ScenarioA
    Given I am at the Login page
    When 
    Then

  Scenario: ScenarioB
    Given I am at the Login page
    When 
    Then


Feature: FeatureB

  Scenario: ScenarioC
    Given I am at the Login page
    When 
    Then

基本步骤:

public class BaseStep {
    protected WebDriver driver = null;

    @Before
    public void setUp() throws Exception {
        driver = SeleniumUtil.getWebDriver(ConfigUtil.readKey("browser"));
    }

    @After
    public void tearDown() {
        driver.quit();
    }

}

脚步:

public class FeatureAStep {
    private WebDriver driver = null;

    // PicoContainer injects BaseStep class
    public FeatureAStep(BaseStep baseStep) {
        this.driver = baseStep.driver;
    }

    @Given("^I am at the Login page$")
    public void givenIAmAtTheLoginPage() throws Exception {
        driver.get(ConfigUtil.readKey("base_url"));
    }

  @When
  @When
  @Then
  @Then
}


public class FeatureBStep {
    private WebDriver driver = null;

    // PicoContainer injects BaseStep class
    public FeatureBStep(BaseStep baseStep) {
        this.driver = baseStep.driver;
    }

  @When
  @Then
}

我有 2 个功能文件和 2 个步骤定义类。场景 C 与 FeatureAStep 中定义的场景 A 和 B 共享相同的 Given。ScenarioC的When和Then在FeatureBStep中定义。我没有使用 PicoContainer 在 BaseStep 中将 WebDriver 设为静态。两个功能文件都成功执行。


相关阅读:

于 2017-08-20T14:26:18.873 回答