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

kro*_*761 5 java selenium-chromedriver cucumber-jvm selenium-webdriver

我正在尝试使用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'
Run Code Online (Sandbox Code Playgroud)

基本上,我在一个包中初始化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
Run Code Online (Sandbox Code Playgroud)

InitializeWebDriver.java

public class InitializeWebDriver {

    public static WebDriver driver = null;

    @Before
    public void beforeScenario() {
        driver = new ChromeDriver();
    }

    @After
    public void afterScenario() {
        driver.quit();
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)

谢谢!

Dav*_*ipe 18

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

这就是我的想法:

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

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

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

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