SessionNotFoundException: Идентификатор сеанса имеет значение null. С помощью WebDriver после вызова функции quit ()? (Селен)

Я пытаюсь написать несколько автоматических тестов пользовательского интерфейса seleniumа с использованием Cucumber / Java. Если в моем файле свойств есть только один тест, все работает нормально. Но если я добавлю второй тест, я получаю эту ошибку на 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' 

В принципе, я инициализирую переменную webdriver в classе InitializeWebdriver в одном пакете, а затем ссылаюсь на нее в других classах определения шага. У меня было определение шага, перечисленное ниже, как часть classа InitializeWebdriver, и оно отлично работало (до перехода на другой этап в другом classе. Поэтому я переместил этот шаг в файл 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(); } } 

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() был вызван слишком рано, как это предлагается в сообщении об ошибке.

Вот что я думаю, что происходит:

  1. Он запускает первый тест и вызывает @Before . Это приведет к тому, что InitializeWebDriver.driver будет установлен как новый WebDriver .
  2. Только после этого он загружает class CommonSteps , поэтому CommonSteps.driver установлен в только что созданный WebDriver .
  3. Тест выполняется успешно, и .quit() вызывается в WebDriver в методе @After .
  4. Затем он начинает второй тест. В методе @Before создан новый WebDriver . Обновлен InitializeWebDriver.driver ; однако CommonSteps.driver не обновляется, потому что driver = InitializeWebDriver.driver; происходит только при первом загрузке CommonSteps .
  5. Поэтому, когда он добирается до driver.get(value) , driver является исходным WebDriver , который уже был .quit() .

Это предполагает, что вы запускаете тесты последовательно. Если они будут параллельны, это будет немного иначе.

В основном проблема заключается в том, что вы используете статические атрибуты для WebDriver , которые не должны использоваться для разных тестовых прогонов. Прошло некоторое время с тех пор, как я сделал это, и не помню, как вы храните переменные, охваченные тестовым прогоном. (В любом случае я не смог бы ответить с уверенностью, так как вы не сказали, какую тестовую структуру вы используете: JUnit или что-то еще?) Таким образом, вам придется исправить это самостоятельно или спросить, как получить переменные с областью тестирования в любых рамках, которые вы используете.

Вот если вы хотите сделать это правильно. Если вы просто хотите дешевое исправление, и если вы не планируете параллельно запускать тесты, я подозреваю, что вы можете исправить это, изменив driver.get(value); для InitializeWebDriver.driver.get(value); , На самом деле, я предлагаю вам попробовать изменить это в любом случае, просто чтобы убедиться, что я прав по этому поводу.