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

时间:2016-12-27 21:07:46

标签: java selenium-webdriver selenium-chromedriver cucumber-jvm

我正在尝试使用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);
    }

谢谢!

1 个答案:

答案 0 :(得分:18)

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

以下是我的想法:

  1. 它开始第一次测试并调用@Before。这会导致InitializeWebDriver.driver设置为新的WebDriver
  2. 仅在此之后加载了课程CommonSteps,因此CommonSteps.driver设置为刚刚创建的WebDriver
  3. 测试成功运行,并在.quit()方法的WebDriver上调用@After
  4. 然后开始第二次测试。在WebDriver方法中创建了新的@BeforeInitializeWebDriver.driver已更新;但是,CommonSteps.driver未更新,因为driver = InitializeWebDriver.driver;仅在首次加载CommonSteps时发生。
  5. 因此,当它到达driver.get(value)时,driver是原始的WebDriver,已经是.quit()
  6. 这是假设您正在连续运行测试。如果它们并行,则会有所不同。

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

    如果你想做得好的话。如果您只是想要一个廉价的修补程序,并且如果您不打算并行运行测试,我怀疑您可以通过将driver.get(value);更改为InitializeWebDriver.driver.get(value);来解决此问题。事实上,我建议你尝试改变它,只是为了确保我对此有所了解。