web-dev-qa-db-fra.com

SessionNotFoundException: l'ID de session est nul. Vous utilisez WebDriver après avoir appelé quit ()? (Sélénium)

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!

8
kroe761

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:

  1. Il démarre le premier test et appelle le @Before. Cela provoque InitializeWebDriver.driver À être défini comme le nouveau WebDriver.
  2. Ce n'est qu'après cela qu'il charge la classe CommonSteps, donc CommonSteps.driver Est défini sur WebDriver qui vient d'être créé.
  3. Le test s'exécute avec succès et .quit() est appelée sur WebDriver, dans la méthode @After.
  4. Ensuite, il démarre le deuxième test. Un nouveau 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.
  5. Par conséquent, quand il arrive à 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.

20
David Knipe