1

使用 selenium webdriver,我将测试html2canvas JS 脚本以直接在浏览器上拍摄网页或其部分的“屏幕截图”。我编写了这个 C# 代码来测试它,但 obj 始终为空。

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

有两种想法是错误的:

  1. return imgonrendered函数返回的值。这意味着html2canvas()call 不会像您在代码中所期望的那样返回图像。

  2. executorJS.ExecuteScript返回 IWebElement、Int64、布尔值、字符串、List<IWebElement|Int64|Boolean|String> 或 null。因此,您无法将此图像作为返回值,请参阅文档以获取更多详细信息。

如果您需要网站截图,您可以使用 use ((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 回答