java.net.URL 类由于未知协议抛出 MalformedException:blob

问题描述 投票:0回答:2

我正在自动化我的测试场景以验证 pdf 文档。单击文档链接(锚标记)后,该文档将在新的浏览器选项卡中打开。我想验证我正在使用 Apache PDFBox 的文档中的一些重要内容。但是,文档 URL 有一个前缀“blob”,因此 java.net.URL 类为未知协议抛出 MalformedException:blob。我应该如何在 java 中定义/添加该协议?

请让我知道如何摆脱这个错误,以便我可以成功地使用 PDFBox 来解析我的 pdf 文件。

Java 版本 - 1.8

这是pdf文档在浏览器中打开后的截图。

这是文档的 HTML 源代码。但是,由于它是 pdf 视图,因此无法执行任何操作,例如获取文本/windowTitle 等。

以下是示例代码片段 -

public void readPdfContents() throws IOException {

    String url = "blob:https://cpswebqa.testcbidata.com/f9ad63bc-700e-4f49-a4fb-807ad1a44b01";
    URL pdfUrl = new URL(url);
    InputStream ips = pdfUrl.openStream();
    BufferedInputStream bis = new BufferedInputStream(ips);
    PDFParser pdfParser = new PDFParser(bis);
    pdfParser.parse();
    String pdfData = new PDFTextStripper().getText(pdfParser.getPDDocument());

    System.out.println("PDF Data is - " + pdfData);

}

错误堆栈跟踪 -

Exception in thread "main" java.net.MalformedURLException: unknown protocol: blob
    at java.net.URL.<init>(URL.java:600)
    at java.net.URL.<init>(URL.java:490)
    at java.net.URL.<init>(URL.java:439)
    at com.cbsh.automation.file.testrunner.WEB.Sample.main(Sample.java:11)
java selenium url automation pdf-parsing
2个回答
1
投票

我遇到了同样的问题,并在此处找到了注入 Javascript 的解决方案:

如果 URL 以“blob:”开头,如何使用 Python 3/Selenium 下载图像?

我用 Java 写的,效果很好,这是代码:

 private String getBytesBase64FromBlobURI(ChromeDriver driver, String uri) {
    String script = " "
            + "var uri = arguments[0];"
            + "var callback = arguments[1];"
            + "var toBase64 = function(buffer){for(var r,n=new Uint8Array(buffer),t=n.length,a=new Uint8Array(4*Math.ceil(t/3)),i=new Uint8Array(64),o=0,c=0;64>c;++c)i[c]='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charCodeAt(c);for(c=0;t-t%3>c;c+=3,o+=4)r=n[c]<<16|n[c+1]<<8|n[c+2],a[o]=i[r>>18],a[o+1]=i[r>>12&63],a[o+2]=i[r>>6&63],a[o+3]=i[63&r];return t%3===1?(r=n[t-1],a[o]=i[r>>2],a[o+1]=i[r<<4&63],a[o+2]=61,a[o+3]=61):t%3===2&&(r=(n[t-2]<<8)+n[t-1],a[o]=i[r>>10],a[o+1]=i[r>>4&63],a[o+2]=i[r<<2&63],a[o+3]=61),new TextDecoder('ascii').decode(a)};"
            + "var xhr = new XMLHttpRequest();"
            + "xhr.responseType = 'arraybuffer';"
            + "xhr.onload = function(){ callback(toBase64(xhr.response)) };"
            + "xhr.onerror = function(){ callback(xhr.status) };"
            + "xhr.open('GET','"+ uri +"');"
            + "xhr.send();";
    String result = (String) driver.executeAsyncScript(script, uri);
    return result;
}

我希望它能帮助别人。

干杯!


0
投票

如果图片URL以“数据”开头,则表示图片数据嵌入在HTML页面本身,而不是存储在可以通过URL访问的远程服务器上。因此,您无法使用标准 HTTP 连接下载图像。所以,base64 机制帮助了我们。

图片来源网址:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAWAUNoinFRBWASIUA.......AAAAElFTkSuQmCC

要下载图片,可以使用以下代码:

// Get the image source data
String imageData = webElement.getAttribute("src");

// Extract the image data and file extension from the data URL
String[] parts = imageData.split(",");
String mimeType = parts[0].split(":")[1];
String base64Data = parts[1];
String fileExtension = "";

if (mimeType.equals("image/jpeg")) {
    fileExtension = ".jpg";
} else if (mimeType.equals("image/png")) {
    fileExtension = ".png";
} else if (mimeType.equals("image/gif")) {
    fileExtension = ".gif";
} else {
    // Unsupported image format
    throw new IOException("Unsupported image format");
}

// Set the output file path and stream. Here, we save the image file.
String outputPath = "C:/images/image" + fileExtension;
FileOutputStream outputStream = new FileOutputStream(outputPath);

// Close the output stream
outputStream.close();

此代码首先从“数据”URL 中提取图像数据并将其拆分为其 MIME 类型和 base64 编码的数据组件。然后,它根据 MIME 类型确定文件扩展名,并在对 base64 编码的图像数据进行解码后将图像保存到磁盘上的文件中。请注意,您需要处理解码和文件 I/O 过程中可能发生的任何异常。

要使用此代码,除了我在之前的回答中提到的那些之外,您还需要导入以下类:

import java.io.File;
import java.util.Base64;

java.util.Base64类用于解码base64编码的图像数据。 java.io.File 类用于表示磁盘上的输出文件。

© www.soinside.com 2019 - 2024. All rights reserved.