我正在尝试使用Cucumber / Java编写一些selenium自动UI测试。如果我的功能文件中只有一个测试,一切正常。但是,如果我添加第二个测试,我会在driver.get()
上收到此错误:
org.openqa.selenium.remote.SessionNotFoundException: Session ID is null. Using WebDriver after calling quit()?
Build info: version: '2.51.0', revision: '1af067dbcaedd7d2ab9af5151fc471d363d97193', time: '2016-02-05 11:20:57'
基本上,我在一个包中初始化InitializeWebdriver类上的webdriver变量,然后在其他(步骤定义)类中引用它。我确实将下面列出的步骤定义作为InitializeWebdriver类的一部分,并且它工作正常(直到转移到另一个类中的不同步骤。所以我将该步骤移动到CommonSteps.java文件以查看它是否然后它会失败,它就会失败。所以现在我只是卡住了。我想在if (driver.equals(null))
中做一个@Before
并做一个不同的动作,如果已经初始化了,但我没有知道其他行动会是什么。
这是我的代码:
tests.feature
Feature: Two tests
Background:
Given I navigate to "http://www.google.com"
Scenario: Test one
When something happens
Scenario: Test two
When something else happens
InitializeWebDriver.java
public class InitializeWebDriver {
public static WebDriver driver = null;
@Before
public void beforeScenario() {
driver = new ChromeDriver();
}
@After
public void afterScenario() {
driver.quit();
}
}
CommonSteps.java
import myPackage.InitializeWebDriver;
public class CommonSteps {
static WebDriver driver = InitializeWebDriver.driver;
@Given("^I navigate to \"([^\"]*)\"$")
public void i_navigate_to(String url) {
driver.get(value);
}
谢谢!
答案 0 :(得分:18)
我认为driver
不是null
,这会导致NullPointerException
,并且无法知道将其转换为SessionNotFoundException
。所以看起来driver
已经创建然后结束,即.quit()
已经过早调用,如错误消息中所示。
以下是我的想法:
@Before
。这会导致InitializeWebDriver.driver
设置为新的WebDriver
。CommonSteps
,因此CommonSteps.driver
设置为刚刚创建的WebDriver
。.quit()
方法的WebDriver
上调用@After
。WebDriver
方法中创建了新的@Before
。 InitializeWebDriver.driver
已更新;但是,CommonSteps.driver
未更新,因为driver = InitializeWebDriver.driver;
仅在首次加载CommonSteps
时发生。driver.get(value)
时,driver
是原始的WebDriver
,已经是.quit()
。这是假设您正在连续运行测试。如果它们并行,则会有所不同。
基本上问题是您正在使用WebDriver
的静态属性,这些属性不应在不同的测试运行之间共享。已经有一段时间了,因为我已经完成了这些工作,而且我不记得你如何将变量存储到测试运行中。 (无论如何我无法肯定地回答,因为你还没有说过你正在使用哪个测试框架:JUnit,还是其他什么?)所以你必须要自己修复它,或者询问如何在你正在使用的任何框架中获得测试范围的变量。
如果你想做得好的话。如果您只是想要一个廉价的修补程序,并且如果您不打算并行运行测试,我怀疑您可以通过将driver.get(value);
更改为InitializeWebDriver.driver.get(value);
来解决此问题。事实上,我建议你尝试改变它,只是为了确保我对此有所了解。