首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从blob URL扫描QR代码

无法从blob URL扫描QR代码
EN

Stack Overflow用户
提问于 2021-07-07 13:19:46
回答 1查看 302关注 0票数 0

在搜索Google等数小时之后,我无法想出如何在基于Java的Selenium测试中扫描QR代码的解决方案。我会列出我尝试过的事情和我所犯的错误。

  1. 使用ZXing库。这个库似乎根本不适用于blob。

私有字符串decodeQRCode(URL qrCodeImage)抛出IOException,NotFoundException { BufferedImage bufferedImage = ImageIO.read(qrCodeImage);LuminanceSource源=新BufferedImageLuminanceSource(bufferedImage);BinaryBitmap位图=新BinaryBitmap(new HybridBinarizer( source ));结果结果=新MultiFormatReader().decode(位图);返回result.getText();}MultiFormatReader

尝试此操作时出错:

代码语言:javascript
复制
unknown protocol: blob
java.net.MalformedURLException: unknown protocol: blob
        at java.net.URL.<init>(URL.java:617)
        at java.net.URL.<init>(URL.java:507)
        at java.net.URL.<init>(URL.java:456)

  1. 使用ZXing库,但使用Base64而不是URL。

私有字符串decodeQRCode(String qrCodeImage)抛出IOException,NotFoundException { byte[]解码=Base64.decdeBase 64(QrCodeImage);bufferedImage BufferedImage =ImageIO.read(新解码);LuminanceSource源=新BufferedImageLuminanceSource(bufferedImage);BinaryBitmap位图=新BinaryBitmap(new HybridBinarizer( source ));return =新MultiFormatReader()(位图);返回bufferedImage();}en20 20#

使用此方法时出错:

代码语言:javascript
复制
null
java.lang.NullPointerException
        at com.google.zxing.client.j2se.BufferedImageLuminanceSource.<init>(BufferedImageLuminanceSource.java:42)

  1. 尝试了上述两种方法,但这次从URL的开头删除了“blob:”,并且仍然得到了NullPointerException,如上面的情况。

  1. 还使用executeAsyncScript()函数尝试了Javascript注入。

私有字符串getBytesBase64FromBlobURI(字符串uri) { String script =“”+ "var uri =参数“;”+ "var回调= arguments1;“+ "var toBase64 =函数(缓冲区){for(var r,n=new Uint8Array(缓冲区)),t=n.length,a=new Uint8Array(4*Math.ceil(t/3)),i=new Uint8Array(64),o=0,Uint8Arrayc+=3,o+=4)r=nc<<16|nc+1<<8|nc+2,ao=ir>>18,ao+1=ir>>12&63,ao+2=ir>>6&63,ao+3=i63&r;return t%3===1?(r=nt-1,ao=ir>>2,ao+1=ir<<4&63,ao+2=61,ao+3=61):t%3===2&&(NT-2<8)+nt-1,ao=ir>>10,ao+1=ir>>4&63,ao+2=ir<<2&63,ao=ir>>10(‘ascii’)(A)};“+”xhr =新();“+”en21#= 'arraybuffer';“+ "xhr.onload =函数(){回调(toBase64(xhr.response)) };”+ "xhr.onerror =函数(){回调(xhr.status) };“+ "xhr.open('GET',‘’+ uri +‘’);”+“xhr.send();”JavascriptExecutor jsExecutor = (JavascriptExecutor)驱动程序;字符串结果=(jsExecutor.executeAsyncScript(脚本,uri)).toString();返回结果;}

这个方法没有任何错误,但是我得到的值是不正确的。

从移动设备扫描QR代码时的期望值:ecfe09ff-ca31-4e16-9550-82da38a45966

运行此代码后的值:iVBORw0KGgoAAAANSUhEUgAAAMgAAADIAQAAAACFI5MzAAABfElEQVR4Xu2XQWrDQAxFFbyYpY/gm9gXCziQi9U3mSPMchbG6v8aSOK0Xfa7BQsMkZ8Xn9GXNDH/Kez9xSNOchLG3yDZzDqvo10HX/yGrFcTPPdcp2JDHfu7+yYn1SK3OZNkGw8hzHEwBxJPzvTihxBnfdJHvw4ozdfKCQg92kpT44j27hWQFnEwTVbLhQTaoCgtvsIhaFb8UpNqyDEpOsfLqJScjKwPJoXFwAq3SoljRsKoGwVO/PXQJiNQZEMbEjwnm/hSShJkNZG+lO5Vm4hk99I5cnoUbm3faMlSroY+vcEhPSv11KYh3jbVBX2aljJzZohJTl7maBWvIfAxLWWkXuALYBuQrbsOFpFoUQ5KyML14QASZxL2RL9gYE1qEpFjPrA0L/NaRTihOl5gVpoDy5vfaAmee9iTdxdoe25NFQlF3Nu0yb5ySmJcndxevtvoQhL/JCyW93NWqYjzDhsXp1gbIVBLwqNp4xFNKNK7e3+ffB8nOQnjf5JPtWpjdkLLguMAAAAASUVORK5CYII=

请帮帮忙。我到处搜索,找不到一个读取QR代码的解决方案。任何帮助都将不胜感激。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-07-12 08:38:12

好的,如果图像src属性有blob url,我找到了一种扫描QR代码的方法。我贴出这个答案,是因为有人可能被困在我原来的位置上,并且抓伤了我的头。因此,解决方案是将我前面尝试过的两种方法结合起来。

首先,您需要获取URL并使用Javascript注入从您的URL中获取一个字节数组。

代码语言:javascript
复制
private String getBytesBase64FromBlobURI(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();";

    JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
    String result = (jsExecutor.executeAsyncScript(script, uri)).toString();
    return Base64.decodeBase64(result);
}

此函数将返回一个字节数组,您将需要使用ZXing库对其进行解码。

代码语言:javascript
复制
private String decodeQRCode(byte[] qrCodeImage) throws IOException, NotFoundException {
    Result result = null;
    BufferedImage bufferedImage;
    bufferedImage = ImageIO.read(new ByteArrayInputStream(qrCodeImage));        
        
    LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    result = new MultiFormatReader().decode(bitmap);
        
    return result.getText();
}

现在,这个函数将返回QR代码的实际值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68286840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档