SessionNotFoundException: ID de Session est null. À l'aide de WebDriver après l'appel quit()? (Sélénium)
Je suis en train d'écrire quelques sélénium automatisé de tester l'INTERFACE utilisateur à l'aide de Concombre/Java. Si j'ai un seul test dans ma fonction fichier, tout fonctionne bien. Mais si j'ajoute un deuxième essai, j'ai 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, je suis d'initialisation de l'webdriver variable sur la InitializeWebdriver classe dans un package, puis de référencement dans l'autre (l'étape de définition de classes. J'ai eu l'étape de définition de la liste ci-dessous une partie de la InitializeWebdriver classe, et ça fonctionnait très bien (jusqu'à ce passée à une autre étape dans une classe différente. J'ai donc déménagé de cette étape, pour un CommonSteps.java fichier pour voir s'il serait alors un échec, et il l'a fait. Alors maintenant, je suis juste coincé. Je pensais faire une if (driver.equals(null))
dans le @Before
et de faire une action différente si a déjà été initialisé, mais je ne sais pas ce que d'autres mesures seraient.
Voici mon code:
tests.fonction
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!
OriginalL'auteur kroe761 | 2016-12-27
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que
driver
estnull
, qui serait la cause d'uneNullPointerException
et il n'aurait aucun moyen de le savoir pour le convertir en unSessionNotFoundException
. De sorte qu'il ressembledriver
a été créé et terminé, c'est à dire.quit()
a été appelé trop tôt, comme le suggère le message d'erreur.Voici ce que je pense qui se passe:
@Before
. Cela provoqueInitializeWebDriver.driver
être définie comme la nouvelleWebDriver
.CommonSteps
, doncCommonSteps.driver
est définie à l'WebDriver
qui vient d'être créé..quit()
est appelée sur leWebDriver
, dans le@After
méthode.WebDriver
est créé dans le@Before
méthode.InitializeWebDriver.driver
est mis à jour; toutefois,CommonSteps.driver
n'est pas à jour, parce que ladriver = InitializeWebDriver.driver;
ne se produit que lorsqueCommonSteps
est tout d'abord chargé.driver.get(value)
,driver
est à l'origineWebDriver
, qui a déjà été.quit()
.C'est en supposant que vous exécutez les tests en série. Si elles sont parallèles, alors il sera un peu différent.
Fondamentalement le problème, c'est que vous êtes en utilisant les attributs statiques pour
WebDriver
, qui ne devrait pas être partagés entre les différents essais. C'est un moment depuis que j'ai fait ce genre de choses, et je ne me souviens pas de la façon dont vous stockez les variables étendues à l'exécution d'un test. (En tout cas je ne serais pas en mesure de répondre avec certitude, puisque vous n'avez pas dit qui test framework que vous utilisez: JUnit, ou autre chose?) De sorte que vous aurez à résoudre vous-même, ou demandez comment obtenir de test de portée des variables dans quel cadre vous êtes en utilisant.C'est si vous voulez le faire correctement. Si vous voulez juste un prix fix, et si vous ne prévoyez pas de faire des tests en parallèle, je pense que vous pouvez y remédier en changeant
driver.get(value);
àInitializeWebDriver.driver.get(value);
. En fait, je vous suggère d'essayer de changer cela, de toute façon, juste pour s'assurer que je suis juste à ce sujet.driver
àInitializeWebDriver.driver
dans CommonSteps.java il fixe. Comme vous l'avez dit, cependant, pas une bonne solution. Je suis en utilisant Junit pour mes affirmations, mais je suis en utilisant le Concombre pour les crochets (cucumber.api.java.Before
/After
). Je n'ai aucune idée de comment le mettre en place, de sorte vraiment de l'aide serait super utile.Vous pouvez essayer de modifier les balises pour cette question. Serait quelque chose de junit d'aide? Certes, vous n'avez pas besoin de le sélénium, le webdriver et de sélénium chromedriver balises, puisque nous avons convenu que c'est une variable de test de portée de problème.
OriginalL'auteur David Knipe