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ファイルに移動して、失敗しました。それで失敗しました。だから今は行き詰まっています。@Before
でif (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);
}
ありがとう!
driver
がnull
だとは思わない。NullPointerException
が発生し、SessionNotFoundException
に変換する方法がわからなくなる。そのため、エラーメッセージで提案されているように、driver
が作成されてから終了したようです。つまり、.quit()
の呼び出しが早すぎます。
これが私が起こっていると思うものです:
@Before
を呼び出します。これにより、InitializeWebDriver.driver
が新しいWebDriver
として設定されます。CommonSteps
が読み込まれるだけなので、作成されたWebDriver
にCommonSteps.driver
が設定されます。WebDriver
の@After
メソッドで.quit()
が呼び出されます。WebDriver
が@Before
メソッドに作成されます。 InitializeWebDriver.driver
が更新されました。ただし、CommonSteps.driver
はCommonSteps
が最初にロードされたときにのみ発生するため、driver = InitializeWebDriver.driver;
は更新されません。driver.get(value)
に到達すると、driver
は元のWebDriver
であり、すでに.quit()
になっています。これは、テストを連続して実行していることを前提としています。それらが並行している場合は、少し異なります。
基本的に問題は、WebDriver
の静的属性を使用していることです。これは、異なるテスト実行間で共有しないでください。私がこれをやったのは久しぶりで、テスト実行にスコープされた変数をどのように保存するか覚えていません。 (いずれの場合でも、使用しているテストフレームワークを言っていないので、確実に答えることはできません:JUnitまたは他の何か?)したがって、自分で修正するか、方法を尋ねる必要があります使用しているフレームワークでテストスコープの変数を取得します。
それはあなたがそれを適切にしたい場合です。安価な修正が必要なだけで、テストを並行して実行する予定がない場合は、driver.get(value);
をInitializeWebDriver.driver.get(value);
に変更することで修正できると思います。実際、私がこれについて正しいことを確認するために、とにかくそれを変更してみることをお勧めします。