当前位置: 首页 > 面试题库 >

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

燕禄
2023-03-14
问题内容

我正在尝试使用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执行一个操作,如果已经初始化,则执行其他操作,但是我不知道其他操作会是什么。

这是我的代码:

测试功能

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);
    }

谢谢!


问题答案:

我不认为drivernull,这将导致NullPointerException它无法知道将它转化成一个方式SessionNotFoundException。因此,看起来像driver已经创建然后结束了,即.quit()如错误消息中所建议的那样被调用得太早。

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

  1. 它开始第一个测试并调用@Before。这导致InitializeWebDriver.driver被设置为新的WebDriver
  2. 只有在此之后,它才会加载class 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);。实际上,我建议您还是尝试更改此设置,以确保我对此是正确的。



 类似资料:
  • 我正在尝试使用Cucumber/Java编写一些selenium自动化UI测试。如果我的功能文件中只有一个测试,则一切正常。但是如果我添加第二个测试,我会在<code>driver.get()上得到这个错误。</code>: 基本上,我在一个包中初始化 InitializeWebdriver 类上的 webdriver 变量,然后在其他(步骤定义)类中引用它。我确实将下面的步骤定义列为 Initi

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

  • 我的测试项目在BaseTest中有@BeforeClass和@AfterClass。类别: 和它的第一次测试。类: WebDriver单例: 而且效果很好。直到我添加了新的案例,我想在新的浏览器实例中开始。 我补充的是: 当我使用testgnconfiguration启动测试时。xml > 第一组通过 浏览器窗口关闭 WebDriver的新实例打开新的浏览器窗口 转到URL 当开始与第一组运行期间

  • 我使用Selenium WebDriver和Chrome在我的应用程序中进行功能测试。我已经用rspec、capybara和selenium成功地设置了多个rails应用程序,但我不知道为什么这个不能工作。 问题是:当我第一次运行特性测试时,它会按照计划工作。但是,如果我再次运行它,selenium会崩溃,并出现以下消息: Selenium::WebDriver::Error::NoSuchDri

  • 问题内容: 我继承了一个非常古老的JSP应用程序(JDK 1.3.1_15),并试图插入会话固定漏洞。 在使用身份验证后,我成功使当前会话无效,但是在创建新会话时,将重新使用旧会话ID。 我可以在HTTP监视器中看到新的会话分配,只是再次使用了相同的数字。 在我之前,根本没有第二个响应头。 有人对如何生成新的会话ID有任何建议吗?我对JRUN4不太熟悉,但是在配置文档中拖拉并没有发现任何东西。 问

  • 问题内容: 为了进行记录,我想创建一个记录器,该记录器将当前会话的ID自动添加到记录的行中。 对于已登录的用户,这不是问题: 问题是,在用户登录之前的回报。是否有另一种获取会话ID的方法,而无需引用当前响应或此类响应? 问题答案: 您可以使用 这依赖于Spring的,因此应与Spring MVC一起使用,否则您应该有一个声明。如果不存在,还将创建会话。