【问题标题】:SessionNotFoundException: Session ID is null. Using WebDriver after calling quit()? (Selenium)SessionNotFoundException:会话 ID 为空。调用 quit() 后使用 WebDriver? (硒)
【发布时间】:2022-01-27 05:02:12
【问题描述】:

我正在尝试使用 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 文件以查看它是否然后会失败,它确实发生了。所以现在我被卡住了。我正在考虑在@Before 中执行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

初始化WebDriver.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);
    }

谢谢!

【问题讨论】:

  • 我在使用driver.quit()方法后尝试截屏时出现此错误。只好换线了。

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


【解决方案1】:

我不认为drivernull,这会导致NullPointerException 并且它无法知道将其转换为SessionNotFoundException。所以看起来driver 已创建然后结束,即.quit() 被调用得太早,如错误消息中所建议的那样。

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

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

这是假设您正在连续运行测试。如果它们是并行的,那就有点不同了。

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

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

【讨论】:

  • 是的,在 CommonSteps.java 中将 driver 更改为 InitializeWebDriver.driver 修复了它。但是,正如您所说,这不是一个很好的解决方案。我使用 Junit 作为我的断言,但我使用 Cucumber 作为挂钩 (cucumber.api.java.Before/After)。我不知道如何设置它,所以任何帮助都会非常有帮助。
  • 您可以尝试更改此问题的标签。与junit相关的东西会有所帮助吗?当然,您不需要 selenium-webdriver 和 selenium-chromedriver 标签,因为我们已经同意这是一个测试变量范围问题。
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2020-03-28
相关资源
最近更新 更多