2

Selenium Web Driver のインスタンスを利用する Java ライブラリを作成しました。このライブラリと Selenium2Library で作成したテストを実行したいと思います。ある意味では、Java ライブラリーは私が必要とするいくつかの機能 (Ajax 要素の操作) を追加しますが、テストの多くは Selenium2 キーワードで記述できます。

Selenium2Library でインスタンス化された webdriver を外部ライブラリに渡して、同じテストを実行できるようにする方法はありますか?

ご意見ありがとうございます。

4

1 に答える 1

1

現在のブラウザーは、保護されている WebDriverCache フィールドに格納されます。Selenium2Library を拡張して WebDriver を公開することもできますが、この単純なユース ケースでは、代わりにリフレクションを使用する方がよいと思います。このようにして、元の Selenium2Library を操作できます。他の人は違うと感じるかもしれません。両方をデモンストレーションします。

どちらのソリューションも Get Current Browser キーワードを提供しており、結果を取得してライブラリのコンストラクターなどに渡すことができます。

これは、リフレクションを使用して WebDriverCache にアクセスし、それを公開するキーワードを持つライブラリです。

// default package
import java.lang.reflect.Field;

import org.openqa.selenium.WebDriver;
import org.robotframework.selenium2library.keywords.BrowserManagement;
import org.robotframework.selenium2library.utils.WebDriverCache;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Misc {
    public static void goToGoogle() {
        getCurrentBrowser().get("http://www.google.com");
    }

    public static WebDriverCache getWebDriverCache() {
        try
        {
            BrowserManagement bm = (BrowserManagement) getLibraryInstance("Selenium2Library");
            Field cacheField = BrowserManagement.class.getDeclaredField("webDriverCache");
            cacheField.setAccessible(true);
            return (WebDriverCache) cacheField.get(bm);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static WebDriver getCurrentBrowser() {
        return getWebDriverCache().getCurrent();
    }

    private static Object getLibraryInstance(String library) throws ScriptException {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");
        engine.put("library", library);
        engine.eval("from robot.libraries.BuiltIn import BuiltIn");
        engine.eval("instance = BuiltIn().get_library_instance(library)");
        return engine.get("instance");
    }
}

以下に、Selenium2Library キーワードとその他のキーワードを組み合わせて使用​​する方法を示します。

*** Settings ***
Test Teardown    Close All Browsers
Library    Selenium2Library
Library    Misc

*** Test Cases ***
Get Current Browser Test
    Open Browser    http://slashdot.org
    Go To Google
    Title Should Be    Google

代わりにカスタム Selenium2Library を使用したい場合 (継承)、以下に例を示します。

// default package
import org.openqa.selenium.WebDriver;


public class MySelenium2Library extends Selenium2Library
{
    public WebDriver getCurrentBrowser() {
        return this.webDriverCache.getCurrent();
    }
}

Robot Framework から直接 WebDriver インスタンスと対話して、例をより単純にします。

*** Settings ***
Test Teardown    Close All Browsers
Library    MySelenium2Library

*** Test Cases ***
Get Current Browser Test
    Open Browser    http://slashdot.org
    ${driver}=    Get Current Browser
    Call Method    ${driver}    get    http://www.google.com
    Title Should Be    Google
于 2013-08-15T20:24:51.930 に答える