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 静态化。两个功能文件均已成功执行。
相关阅读:
我使用了公认的解决方案
引用的库:
特征:
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 静态化。两个功能文件均已成功执行。
相关阅读: