Shared WebDriver 在使用 PicoContainer 的第二种情况下变为空

Shared WebDriver becomes null on second scenario using PicoContainer

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

引用的库:

特征:

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

}

但是,驱动程序 "dies" 在场景 A 的 tearDown() 之后,在场景 B 的 Given 步骤上变为 null(两个场景都使用相同的 Given)。我没有使用 Maven。

是因为这一行:

private static boolean isInitialized = false;

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

静态 isInitialized 布尔值不是实例的一部分,它绑定到它所在的 class 并且在 JVM 关闭之前它一直有效。第一个场景设置为true,意思是第二个场景启动时还是true,不会在setUp()方法中重新初始化驱动

您可能希望将 driver 设置为静态,以便在两种情况下共享同一个实例。

根据 Luciano 的回答,这就是我最终得到的结果:

特点:

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 中的相同给定。 ScenarioC 的 When and Then 在 FeatureBStep 中定义。我没有使用 PicoContainer 在 BaseStep 中使 WebDriver 静态化。两个功能文件均已成功执行。


相关阅读: