1

Selenium Webdriver を使用して、html2canvas JS スクリプトをテストし、Web ページまたはその一部の「スクリーンショット」をブラウザーで直接取得します。テスト用にこの C# コードを作成しましたが、obj は常に null です。

参照用の C# コード

        IWebDriver Driver = new FirefoxDriver();
        Driver.Navigate().GoToUrl("http://www.monsite.com");

        string scriptJS = File.ReadAllText("html2canvas.js");
        scriptJS += @"
            html2canvas(document.body, {
                onrendered: function(canvas) {
                    var img = canvas.toDataURL("image/png");
                    return img;
                }
            });";

        IJavaScriptExecutor executorJS = Driver as IJavaScriptExecutor;
        var obj = executorJS.ExecuteScript(scriptJS);
4

1 に答える 1

1

間違っているのは次の 2 つの考えです。

  1. return img関数によって返される値ですonrendered。つまりhtml2canvas()、コードで期待どおりに呼び出しが画像を返さないということです。

  2. executorJS.ExecuteScriptIWebElement、Int64、Boolean、String、List<IWebElement|Int64|Boolean|String> または null を返します。したがって、この画像を戻り値として取得することはできません。詳細については、ドキュメントを参照してください。

サイトのスクリーンショットが必要な場合は、((ITakesScreenshot) driver).GetScreenshot();( doc ) を使用できます。

このサイトに画像が必要な場合は、onrendered機能に実装する必要があります。


更新 (25.10.2013)

を呼び出すことができますexecutorJS.ExecuteAsyncScript。JavaScript 関数呼び出しの最後のパラメーターは、webdriver によって注入されたコールバック関数になります。注入されたメソッドが呼び出された後、または scriptTimeout が実行された後、非同期メソッドが返されます。このため、タイムアウトをより高い値に設定することをお勧めします (アプリケーションが期待どおりに実行されていることを確認するためだけに、後で生産システムで使用される値を設定できます)。

    Driver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromSeconds(5));

    scriptJS += @"
        var webDriverCallback = arguments[arguments.length - 1];

        html2canvas(document.body, {
            onrendered: function(canvas) {
                var img = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');;
                webDriverCallback(img);
            }
        });";

    IJavaScriptExecutor executorJS = Driver as IJavaScriptExecutor;
    var obj = executorJS.ExecuteAsyncScript(scriptJS);

結果は、文字列として base64 でエンコードされた画像になります。

于 2013-09-26T09:49:02.880 に答える