web-dev-qa-db-ja.com

Javaで、Selenium WebDriverが終了したかどうかを確認する最良の方法

ページオブジェクトのコレクションをチェックして、それぞれについて、WebDriverでquit()が呼び出されているかどうかを確認する必要があります。

WebDriverの状態を確認する次のメソッドを作成しました。

public static boolean hasQuit(WebDriver driver) {
        try {
            driver.getTitle();
            return false;
        } catch (SessionNotFoundException e) {
            return true;
        }
}

問題は次のとおりです。ブール値の真理を発見するために例外をスローしてキャッチする必要はありませんが、 WebDriver API ドライバーが終了したかどうかを確認する方法を提供しません。

だから私の質問は、 webDriverが終了したかどうかを確認するより良い方法はありますか?

同様の(より一般的な)質問を見つけました ここ、しかし、質問には試されたコードはなく、唯一の答えは、終了後に常にWebDriverをnullに設定することでした(私は必ずしも制御できません)。

31
James Dunn

quit()が呼び出された場合、driver.toString()はnullを返します。

>>> FirefoxDriver: firefox on XP (null))

それ以外の場合は、オブジェクトのハッシュコードを返します。

>>> FirefoxDriver: firefox on XP (9f897f52-3a13-40d4-800b-7dec26a0c84d)

したがって、ブール値を割り当てるときにnullをチェックできます。

boolean hasQuit = driver.toString().contains("(null)");
17
Dingredient

状況に応じて、基本的に2つのアプローチがあります。

状況1:WebDriverの拡張は現実的なオプションではありません。

これが最も一般的な状況です。 WebDriverが終了したかどうかを確認する便利な方法を必要とする実際の状況でSeleniumを操作するほとんどの開発者は、既に確立されたテストフレームワークで作業し、 WebDriversのカスタム拡張のみが使用されることを保証するフレームワークは、おそらくそれが価値があるよりも厄介です。

この場合、RemoteWebDriver#stopClient()のオーバーライドはオプションではないため、Sajanの回答とGiliの彼の回答の推奨は役に立ちません。 (それがあったとしても、ほとんどの人は簡単な答えを探しています。)

Seleniumに付属するWebDriverの標準実装(FirefoxDriver、ChromeDriver、InternetExplorerDriver、SafariDriverなど)のみを使用している限り、WebDriverをRemoteWebDriverにキャストして、sessionIdがnull(Patが右側にあるかどうか)を確認できます。追跡しますが、toString())を使用するよりもsessionIdを直接呼び出す方が適切です。

public static boolean hasQuit(WebDriver driver) {
    return ((RemoteWebDriver)driver).getSessionId() == null;
}

RemoteWebDriverを実装していないWebDriverをどのくらいの頻度で使用するのか、この回答はすべてのケースの95%に適しているはずです。 (それほど頻繁ではありません。)

状況2:あなた[〜#〜] can [〜#〜] WebDriverを現実的に拡張します。

この状況はあまり一般的ではありませんしかし、おそらくあなたは次のいずれかです:
(a)適切に設計され抽象化されたフレームワークを使用する、または
(b)Seleniumテストフレームワークをゼロから開始する。

この場合、WebDriverを拡張する独自のインターフェイスを作成できます。

public interface CustomDriver extends WebDriver {

    boolean hasQuit();

}

そして、そのように標準のWebDriverを拡張できます(この例では、ChromeDriver):

public class CustomChromeDriver extends ChromeDriver implements CustomDriver {

    boolean hasQuit = false;

    @Override
    public boolean hasQuit() {
        return hasQuit;
    }

    @Override
    public void stopClient() {
        super.stopClient();
        hasQuit = true;
    }
}
12
James Dunn

StopClient メソッドはquitRemoteWebDriver Source )が呼び出された後に呼び出されます。RemoteWebDriverのインスタンスをサブクラス化し、stopClientメソッドをオーバーライドし、フラグを設定してフラグをチェックできますWebdriverが閉じているかどうかを判断する(quit)。

5
Sajan Chandran