SessionNotFoundException:Session ID 为 null。在调用 quit() 后使用 WebDriver?(硒)

我正在尝试使用Cucumber / Java编写一些硒自动化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();
    }
}

常见步骤.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

我不认为是,这会导致a,并且它无法知道将其转换为。因此,它看起来像是已经创建然后结束,即 调用得太早,如错误消息中所示。drivernullNullPointerExceptionSessionNotFoundExceptiondriver.quit()

以下是我认为正在发生的事情:

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

这假设您正在串联运行测试。如果它们是并行的,那么情况会有所不同。

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

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


答案 2

推荐