SessionNotFoundException:会话ID为空。 调用quit()后使用WebDriver? (selenium)

我正在尝试使用Cucumber / Java编写一些selenium自动UI测试。 如果我的function文件中只有一个测试,一切正常。 但是如果我添加第二个测试,我会在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))中做一个if (driver.equals(null))并且如果已经初始化那么做一个不同的动作,但我不知道我知道其他行动会是什么。

这是我的代码:

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); } 

谢谢!

我不认为drivernull ,这会导致NullPointerException并且它无法知道将其转换为SessionNotFoundException 。 所以它看起来像driver已经创建然后结束,即.quit()错误消息中建议过快地调用。

这就是我认为正在发生的事情:

  1. 它开始第一次测试并调用@Before 。 这会导致InitializeWebDriver.driver被设置为新的WebDriver
  2. 只有在那之后它才会加载CommonSteps类,因此CommonSteps.driver被设置为刚刚创建的WebDriver
  3. 测试成功运行,并在@After方法中在WebDriver上调用.quit()
  4. 然后它开始第二次测试。 在@Before方法中创建了一个新的WebDriverInitializeWebDriver.driver已更新; 但是, CommonSteps.driver未更新,因为driver = InitializeWebDriver.driver; 仅在首次加载CommonSteps时发生。
  5. 因此,当它到达driver.get(value)driver是原始的WebDriver ,它已经是.quit()

这假设您正在运行测试。 如果他们并行,那么它会有所不同。

基本上问题是您正在为WebDriver使用静态属性,不应在不同的测试运行之间共享。 我已经做了这些事情已经有一段时间了,而且我不记得你如何将变量存储到测试运行中。 (在任何情况下,我都无法肯定地回答,因为你还没有说过你正在使用哪个测试框架:JUnit,还是别的什么?)所以你必须自己解决它,或者问如何在您正在使用的任何框架中获取测试范围的变量。

如果你想要正确地做到这一点。 如果你只是想要一个廉价的修复,如果你不打算并行运行测试,我怀疑你可以通过改变driver.get(value);来修复它driver.get(value); to InitializeWebDriver.driver.get(value); 。 事实上,我建议你尝试改变它,只是为了确保我是对的。