2

ウェブサイトをテストするための自動化フレームワークの構築を支援しています。テスト ケースは Chrome、Firefox、および IE に対して実行する必要があるため、現在、ドライバーの WebDriver オブジェクトを渡しています。このオブジェクトは、場合によっては、実際には ChromeDriver、FirefoxDriver、または InternetExplorerDriver のいずれかになります。

私が抱えている問題は、テストを検証するために、このドライバーに新しいウィンドウを開かせたいということです。これを行うために私が見つけた唯一の方法は、javascript を実行することです。こちらを参照してください。

JavaScript を実行するには、ドライバは JavascriptExecutor インターフェイスを実装する必要があります。使用するすべてのドライバーは実際には JavascriptExecutor ですが、WebDriver インターフェイスを使用しているため、これは保証されません。少なくとも概念実証として、javascript を実行しようとしていますが、3 つのドライバーのどれを明示的に指定しなくても javascript を実行できるように、ドライバー オブジェクトを適切に編成する方法も知りたいです。

これは、新しいウィンドウを開くJavaScriptメソッドをテストするためだけに試みたものです。それは動かなかった:

    if (ChromeDriver.class.isInstance(driver)) {
            ChromeDriver chrome = (ChromeDriver)driver;
            chrome.executeScript("window.open()");
        }
    for (String handle : driver.getWindowHandles()) {
            System.out.println(handle);
        }

上記のケースでは、テストに Chrome を使用していたので、ドライバーが実際には ChromeDriver であることがわかりました。新しいドライバー オブジェクトをインスタンス化していたため、コードが新しいウィンドウを開くことができなかったと推測していますが、これは Selenium では実際には機能しないと思います。それが機能していれば、(driver.getWindowHandles を使用して) ウィンドウを識別し、新しいウィンドウに URL をロードすることに移ったでしょう。

Seleniumが嫌いな新しいドライバーオブジェクトを作成/キャストしていた新しいウィンドウをコードが開けなかったのはなぜですか? もしそうなら、適切な解決策は何ですか?Chrome、Firefox、および IE ドライバーと JavascriptExecutor インターフェースの間に挟まれた新しいインターフェースを作成する必要がありますか? このようなものですか?

     public interface SpecialDriver extends WebDriver, JavascriptExecutor {

     }

これは機能していないようです-少なくとも、WebDriverとJavascriptExecutorの両方を実装しているにもかかわらず、ChromeDriverは新しい結合インターフェースを明示的に実装していないため、ChromeDriverをSpecialDriverに割り当てることはできません。このアプローチで完全に間違ったツリーを吠えていますか? 前もって感謝します。

4

1 に答える 1

5

正しいアプローチは、次のようなことを行うことです。

// WARNING! Untested code. Not guaranteed
// to work or even compile.
// Assume driver is a valid WebDriver object
// TODO: Wrap in try-catch to handle invalid 
// cast exception
 ((JavascriptExecutor)driver).executeScript("return 'your script goes here';");

WebDriver オブジェクトが JavascriptExecutor も実装するという保証はありませんが、現実には、現在のすべての実装で実装されています。

于 2012-09-04T13:34:10.277 に答える