使用PicoContainer,共享WebDriver在第二种情况下变为null

时间:2017-08-20 10:04:18

标签: java selenium cucumber picocontainer

我使用了已接受的解决方案here并提出了以下代码:

参考图书馆:

pico_ref_libs

功能

Feature: FeatureA

  Scenario: ScenarioA
    Given 
    When 
    Then

  Scenario: ScenarioB
    Given 
    When 
    Then

BaseStep:

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的给定步骤上变为null(两个场景都使用相同的Given)。我没有使用Maven。

2 个答案:

答案 0 :(得分:2)

这是因为这一行:

private static boolean isInitialized = false;

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

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

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

答案 1 :(得分:0)

从卢西亚诺的回答中,这就是我最终的结果:

功能

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

<强> BaseStep:

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个步骤定义类。 ScenarioC与FeatureAStep中定义的场景A和B共享相同的给定。在FeatureBStep中定义ScenarioC的时间和时间。我没有使用PicoContainer在BaseStep中使WebDriver静态化。两个Feature文件都成功执行。

相关阅读: