当前位置: 首页 > 知识库问答 >
问题:

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

龚凌
2023-03-14

我正在尝试使用Cucumber/Java编写一些selenium自动化UI测试。如果我的功能文件中只有一个测试,则一切正常。但是如果我添加第二个测试,我会在<code>driver.get()上得到这个错误。</code>:

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)),如果已经初始化,则执行不同的操作,但我不知道其他操作会是什么。

这是我的代码:

测试.功能

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个答案

罗昊空
2023-03-14

我不认为< code>driver为< code>null,这将导致< code > NullPointerException ,并且它无法知道如何将其转换为< code > SessionNotFoundException 。所以看起来像是< code>driver已经被创建然后结束,即< code >。quit()调用得太快,如错误消息所示。

我认为事情是这样的:

  1. 它启动第一个测试,并在之前html" target="_blank">调用<code>。这会导致<code>初始化WebDriver。将驱动程序设置为新的WebDriver
  2. 只有在这之后,它才会加载类<code>CommonSteps</code>,因此<code>CommonSteps。驱动程序设置为刚刚创建的WebDriver
  3. 测试成功运行,并且<code>。quit()在WebDriver,在@After方法中调用
  4. 然后开始第二次测试。一个新的<code>WebDriver<code>将在<code>Before<code>方法中创建<代码>初始化WebDriver。驱动程序已更新;然而,是CommonSteps。驱动程序未更新,因为驱动程序=InitializeWebDriver。司机仅在首次加载<code>CommonSteps
  5. 因此,当它到达<code>驱动程序时。获取(值),driver是原始的WebDriver,它已经是.quit()

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

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

如果你想把它做好的话。如果您只是想要一个便宜的修复程序,并且不打算并行运行测试,我怀疑您可以通过更改<code>驱动程序来修复它。获取(值)to初始化WebDriver.driver.get(值) 。事实上,我建议你无论如何都尝试改变这一点,只是为了确保我在这一点上是正确的。

 类似资料:
  • 问题内容: 我正在尝试使用Cucumber / Java编写一些硒自动UI测试。如果我的功能文件中只有一个测试,则一切正常。但是,如果我添加第二个测试,则会在上出现此错误: 基本上,我将在一个包中的InitializeWebdriver类上初始化webdriver变量,然后在其他(步骤定义)类中对其进行引用。我确实将下面的步骤定义作为InitializeWebdriver类的一部分列出,并且工作正

  • 我得到会话ID为空。调用quit()后使用WebDriver?当任何测试用例的runmode设置为no时发生异常。我使用的是TestNg框架。 如果所有测试用例的Runmode都是Yes,那么它工作正常。 我为套件创建了一个Java类,并为单个测试用例创建了多个内部类。

  • 我正面临“调用quit()后FirefoxDriver无法使用”的问题。请帮助。 请帮忙

  • 我只是尝试输入一个异常,用户输入一个非数值,这样程序就会给出一条错误消息并退出。但是,像我一样使用,它仍然尝试运行代码的结尾(错误),并给我一个内核已死亡的错误。在异常情况下退出代码的正确方法是什么?

  • 我想在LiveData-Object上更新存储库中对象的成员变量。问题是,如果我调用getValue()方法,我总是会得到一个NullPointerExctive,尽管这个值确实存在于我的房间库中。 我现在的问题是,如何在不调用observe()方法的情况下从LiveData对象获取值?(我无法在我的存储库中调用observe方法,因为该方法希望我输入一个LifeCycleOwner-refere

  • 我有下面的AuthenticationResponse模型,用于使用Reform2的3个api调用。如果我进行verifyEmail调用f.e.,JSON响应主体只包含有效电子邮件的属性(例如{“validEmail”:true})。其他2个调用仅包含“ResetSuccessful”或其他4个调用的属性。 我如何确保/检查收到verifyEmail呼叫f.e.的响应时,它包含validEmail