3

私はCucumber/Javaを使用していくつかのセレン自動UIテストを作成しようとしています。フィーチャーファイルに1つのテストしかない場合、すべて正常に動作します。私は2番目のテストを追加した場合でも、私はdriver.get()に、このエラーを取得する:SessionNotFoundException:セッションIDがnullです。 quit()を呼び出した後でWebDriverを使用していますか? (Selenium)

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

ありがとう!

答えて

10

私はNullPointerExceptionを引き起こす、drivernullだとは思わないし、それがSessionNotFoundExceptionに変換するために知る方法はありません。したがって、driverが作成されて終了した、つまり、エラーメッセージに示唆されているように、.quit()があまりにも早く呼び出されたようです。

  1. それは最初のテストを開始し、@Beforeを呼び出します。

    は、ここで私が起こっていると思うものです。これにより、InitializeWebDriver.driverが新しいWebDriverとして設定されます。

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

これは、一連のテストを実行していることを前提としています。もしそれらが並行していれば、少し違うでしょう。

基本的に問題は、異なるテスト実行間で共有されるべきでないWebDriverの静的属性を使用していることです。私はこのことをしてからしばらくしていますが、テスト実行にスコープされた変数をどのように保存するのか覚えていません。 (どんな場合でも、あなたが使っているテストフレームワーク、つまりJUnitなんて言わないから、確実に答えることができないでしょう)それで、あなた自身で修正しなければなりません。使用しているフレームワークでテストスコープの変数を取得します。

これは適切に行う場合です。安価な修正がほしいのであれば、テストを並行して実行するつもりがない場合は、driver.get(value);InitializeWebDriver.driver.get(value);に変更することで修正できます。実際には、私はあなたがこれについて正しいと確信するために、とにかくそれを変更しようとお勧めします。

+0

うん、CommonSteps.javaで 'driver'を' InitializeWebDriver.driver'に変更すると修正されました。あなたが言ったように、しかし、素晴らしい解決策ではありません。私は主張のためにJunitを使用していますが、フックのためにCucumberを使用しています( 'cucumber.api.java.Before' /' After')。私はこれをどのように設定するのか分からないので、本当にどんな助けもスーパーに役立ちます。 – kroe761

+0

この質問のタグを変更してみることができます。何かjunit関連のヘルプですか?確かに、セレンのwebdriverタグとselenium-chromedriverタグは必要ありません。なぜなら、これはテスト変数スコープの問題だからです。 –

関連する問題