首页 > 解决方案 > 使用 Selenium 下载二进制文件的 JS 代码

问题描述

我有一个 Java 代码,它使用 JavaScript 和 Selenium 来下载二进制文件。它在一年前工作,但现在刚刚停止工作。

看起来我的代码中继的功能在浏览器更新后消失了。代码在 Chrome 上正常工作,但在 Firefox 上失败。

我不是 JavaScript 开发人员,所以很难理解所有这些变化都发生在导致我的代码失败的数据类型上。

我已经尝试使用 Bing/Google/Whatever 来寻找解决方案,但没有结果。

private byte[] retriveBinaryFileContent(WebDriver driver) throws IOException {
    String script = "var url = arguments[0];"
            + "var callback = arguments[arguments.length - 1];"
            + "var xhr = new XMLHttpRequest();"
            + "xhr.open('GET', url, true);"
            + "xhr.responseType = \"arraybuffer\";"
            + "xhr.onload = function() {"
            + "  var arrayBuffer = xhr.response;"
            + "  var byteArray = new Uint8Array(arrayBuffer);"
            + "  callback(byteArray);"
            + "};"
            + "xhr.send();";
    Object response = ((JavascriptExecutor) driver).executeAsyncScript(script, "https://preventioncdnndg.org/eco-quartier/wp-content/uploads/sites/3/2015/09/tree-300x278.jpg");

    List<Long> byteList = (ArrayList<Long>) response;
    byte[] bytes = new byte[byteList.size()];
    for (int i = 0; i < byteList.size(); i++) {
        bytes[i] = (byte) (long) byteList.get(i);
    }

    return bytes;
}

我得到的错误信息:

警告:请求的处理被异常中断。错误:通过 X 射线访问TypedArray数据很慢,并且为了鼓励高性能代码而被禁止。要跨源边界复制 TypedArrays,请考虑使用Components.utils.cloneInto()

问题显然出在 JS 代码中,而不是在 Java 代码中。

有人可以建议我如何解决这个问题吗?

标签: javascriptselenium

解决方案


推荐阅读