SessionNotFoundException:会话 ID 为空。调用 quit() 后使用 WebDriver? (硒)
SessionNotFoundException: Session ID is null. Using WebDriver after calling quit()? (Selenium)
我正在尝试使用 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 class 上初始化 webdriver 变量,然后在另一个(步骤定义)class 中引用它。我确实将下面列出的步骤定义作为 InitializeWebdriver class 的一部分,并且它工作得很好(直到移动到另一个 class 中的不同步骤。所以我将该步骤移动到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
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);
}
谢谢!
我不认为 driver
是 null
,这会导致 NullPointerException
,并且它无法知道将其转换为 SessionNotFoundException
。所以看起来 driver
已经创建然后结束,即 .quit()
被调用得太早,如错误消息中所建议的那样。
这是我认为正在发生的事情:
- 它开始第一个测试并调用
@Before
。这导致 InitializeWebDriver.driver
被设置为新的 WebDriver
.
- 只有在那之后它才会加载 class
CommonSteps
,因此 CommonSteps.driver
设置为刚刚创建的 WebDriver
。
- 测试 运行 成功,并且在
@After
方法中对 WebDriver
调用了 .quit()
。
- 然后开始第二次测试。在
@Before
方法中创建了一个新的 WebDriver
。 InitializeWebDriver.driver
已更新;但是,CommonSteps.driver
不会更新,因为 driver = InitializeWebDriver.driver;
仅在 CommonSteps
首次加载时发生。
- 所以到了
driver.get(value)
的时候,driver
就是原来的WebDriver
,已经是.quit()
.
这是假设您运行进行系列测试。如果它们是平行的,那么它会有点不同。
基本上,问题是您正在为 WebDriver
使用静态属性,不应在不同的测试 运行 之间共享。自从我完成这些工作以来已经有一段时间了,我不记得你是如何存储范围限定为测试的变量 运行。 (无论如何我都不能肯定地回答,因为你还没有说你正在使用哪个测试框架:JUnit,还是其他什么?)所以你必须自己修复它,或者询问如何在您使用的任何框架中获取测试范围的变量。
如果你想正确地做到这一点。如果你只是想要一个便宜的修复,并且如果你不打算并行 运行 测试,我怀疑你可以通过将 driver.get(value);
更改为 InitializeWebDriver.driver.get(value);
来修复它。事实上,我建议您无论如何都尝试更改它,以确保我对此是正确的。
我正在尝试使用 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 class 上初始化 webdriver 变量,然后在另一个(步骤定义)class 中引用它。我确实将下面列出的步骤定义作为 InitializeWebdriver class 的一部分,并且它工作得很好(直到移动到另一个 class 中的不同步骤。所以我将该步骤移动到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
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);
}
谢谢!
我不认为 driver
是 null
,这会导致 NullPointerException
,并且它无法知道将其转换为 SessionNotFoundException
。所以看起来 driver
已经创建然后结束,即 .quit()
被调用得太早,如错误消息中所建议的那样。
这是我认为正在发生的事情:
- 它开始第一个测试并调用
@Before
。这导致InitializeWebDriver.driver
被设置为新的WebDriver
. - 只有在那之后它才会加载 class
CommonSteps
,因此CommonSteps.driver
设置为刚刚创建的WebDriver
。 - 测试 运行 成功,并且在
@After
方法中对WebDriver
调用了.quit()
。 - 然后开始第二次测试。在
@Before
方法中创建了一个新的WebDriver
。InitializeWebDriver.driver
已更新;但是,CommonSteps.driver
不会更新,因为driver = InitializeWebDriver.driver;
仅在CommonSteps
首次加载时发生。 - 所以到了
driver.get(value)
的时候,driver
就是原来的WebDriver
,已经是.quit()
.
这是假设您运行进行系列测试。如果它们是平行的,那么它会有点不同。
基本上,问题是您正在为 WebDriver
使用静态属性,不应在不同的测试 运行 之间共享。自从我完成这些工作以来已经有一段时间了,我不记得你是如何存储范围限定为测试的变量 运行。 (无论如何我都不能肯定地回答,因为你还没有说你正在使用哪个测试框架:JUnit,还是其他什么?)所以你必须自己修复它,或者询问如何在您使用的任何框架中获取测试范围的变量。
如果你想正确地做到这一点。如果你只是想要一个便宜的修复,并且如果你不打算并行 运行 测试,我怀疑你可以通过将 driver.get(value);
更改为 InitializeWebDriver.driver.get(value);
来修复它。事实上,我建议您无论如何都尝试更改它,以确保我对此是正确的。