Я пытаюсь написать несколько автоматических тестов пользовательского интерфейса 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()
был вызван слишком рано, как это предлагается в сообщении об ошибке.
Вот что я думаю, что происходит:
@Before
. Это приведет к тому, что InitializeWebDriver.driver
будет установлен как новый WebDriver
. CommonSteps
, поэтому CommonSteps.driver
установлен в только что созданный WebDriver
. .quit()
вызывается в WebDriver
в методе @After
. @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);
, На самом деле, я предлагаю вам попробовать изменить это в любом случае, просто чтобы убедиться, что я прав по этому поводу.