web-dev-qa-db-ja.com

SessionNotFoundException:セッションIDがnullです。 quit()を呼び出した後にWebDriverを使用していますか? (セレン)

Cucumber/Javaを使用していくつかのSelenium自動UIテストを記述しようとしています。機能ファイルにテストが1つしかない場合、すべてが正常に機能します。しかし、2番目のテストを追加すると、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'

基本的に、1つのパッケージのInitializeWebdriverクラスでwebdriver変数を初期化してから、他の(ステップ定義)クラスでそれを参照しています。 InitializeWebdriverクラスの一部として以下にリストされているステップ定義があり、それは正常に機能していました(別のクラスの別のステップに移動するまで。そのステップをCommonSteps.Javaファイルに移動して、失敗しました。それで失敗しました。だから今は行き詰まっています。@Beforeif (driver.equals(null))を実行し、すでに初期化されている場合は別のアクションを実行することを考えていましたが、他のアクションがどうなるかを知っている。

これが私のコードです:

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);
    }

ありがとう!

8
kroe761

drivernullだとは思わない。NullPointerExceptionが発生し、SessionNotFoundExceptionに変換する方法がわからなくなる。そのため、エラーメッセージで提案されているように、driverが作成されてから終了したようです。つまり、.quit()の呼び出しが早すぎます。

これが私が起こっていると思うものです:

  1. 最初のテストを開始し、@Beforeを呼び出します。これにより、InitializeWebDriver.driverが新しいWebDriverとして設定されます。
  2. その後、クラスCommonStepsが読み込まれるだけなので、作成されたWebDriverCommonSteps.driverが設定されます。
  3. テストは正常に実行され、WebDriver@Afterメソッドで.quit()が呼び出されます。
  4. 次に、2番目のテストを開始します。新しいWebDriver@Beforeメソッドに作成されます。 InitializeWebDriver.driverが更新されました。ただし、CommonSteps.driverCommonStepsが最初にロードされたときにのみ発生するため、driver = InitializeWebDriver.driver;は更新されません。
  5. したがって、driver.get(value)に到達すると、driverは元のWebDriverであり、すでに.quit()になっています。

これは、テストを連続して実行していることを前提としています。それらが並行している場合は、少し異なります。

基本的に問題は、WebDriverの静的属性を使用していることです。これは、異なるテスト実行間で共有しないでください。私がこれをやったのは久しぶりで、テスト実行にスコープされた変数をどのように保存するか覚えていません。 (いずれの場合でも、使用しているテストフレームワークを言っていないので、確実に答えることはできません:JUnitまたは他の何か?)したがって、自分で修正するか、方法を尋ねる必要があります使用しているフレームワークでテストスコープの変数を取得します。

それはあなたがそれを適切にしたい場合です。安価な修正が必要なだけで、テストを並行して実行する予定がない場合は、driver.get(value);InitializeWebDriver.driver.get(value);に変更することで修正できると思います。実際、私がこれについて正しいことを確認するために、とにかくそれを変更してみることをお勧めします。

20
David Knipe