J'essaie d'écrire des tests d'interface utilisateur automatisés Selenium en utilisant Cucumber/Java. Si je n'ai qu'un seul test dans mon fichier de fonctionnalités, tout fonctionne bien. Mais si j'ajoute un deuxième test, j'obtiens cette erreur sur 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'
Fondamentalement, j'initialise la variable webdriver sur la classe InitializeWebdriver dans un package, puis je la référence dans les autres classes (définition d'étape). J'ai eu la définition d'étape répertoriée ci-dessous dans le cadre de la classe InitializeWebdriver, et cela fonctionnait très bien (jusqu'à ce que l'on passe à une étape différente dans une classe différente. J'ai donc déplacé cette étape dans un fichier CommonSteps.Java pour voir si elle échouerait alors, et il l'a fait. Alors maintenant, je suis juste coincé. Je pensais faire une if (driver.equals(null))
dans le @Before
et faire une action différente si elle avait déjà été initialisée, mais je Je ne sais pas ce que serait cette autre action.
Voici mon code:
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);
}
Merci!
Je ne pense pas que driver
soit null
, cela provoquerait un NullPointerException
et il n'aurait aucun moyen de savoir le convertir en SessionNotFoundException
. Il semble donc que driver
ait été créé puis terminé, c'est-à-dire que .quit()
a été appelée trop tôt, comme suggéré dans le message d'erreur.
Voici ce que je pense qui se passe:
@Before
. Cela provoque InitializeWebDriver.driver
À être défini comme le nouveau WebDriver
.CommonSteps
, donc CommonSteps.driver
Est défini sur WebDriver
qui vient d'être créé..quit()
est appelée sur WebDriver
, dans la méthode @After
.WebDriver
est créé dans la méthode @Before
. InitializeWebDriver.driver
Est mis à jour; cependant, CommonSteps.driver
n'est pas mis à jour, car driver = InitializeWebDriver.driver;
ne se produit que lorsque CommonSteps
est chargé pour la première fois.driver.get(value)
, driver
est le WebDriver
d'origine, qui a déjà été .quit()
.Cela suppose que vous exécutez les tests en série. S'ils sont en parallèle, ce sera un peu différent.
Fondamentalement, le problème est que vous utilisez des attributs statiques pour WebDriver
, qui ne doivent pas être partagés entre différents tests. Cela fait un moment que je n'ai pas fait ça, et je ne me souviens pas comment vous stockez les variables étendues à un test. (En tout cas, je ne serais pas en mesure de répondre avec certitude, puisque vous n'avez pas dit quel framework de test vous utilisez: JUnit, ou autre chose?) Vous devrez donc le réparer vous-même, ou demander comment obtenez des variables de portée de test dans le cadre que vous utilisez.
C'est si vous voulez le faire correctement. Si vous voulez juste un correctif bon marché et si vous ne prévoyez pas d'exécuter des tests en parallèle, je soupçonne que vous pouvez le corriger en changeant driver.get(value);
en InitializeWebDriver.driver.get(value);
. En fait, je vous suggère d'essayer de changer cela de toute façon, juste pour vous assurer que j'ai raison à ce sujet.