在搜索Google等数小时之后,我无法想出如何在基于Java的Selenium测试中扫描QR代码的解决方案。我会列出我尝试过的事情和我所犯的错误。
私有字符串decodeQRCode(URL qrCodeImage)抛出IOException,NotFoundException { BufferedImage bufferedImage = ImageIO.read(qrCodeImage);LuminanceSource源=新BufferedImageLuminanceSource(bufferedImage);BinaryBitmap位图=新BinaryBitmap(new HybridBinarizer( source ));结果结果=新MultiFormatReader().decode(位图);返回result.getText();}MultiFormatReader
尝试此操作时出错:
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)私有字符串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#
使用此方法时出错:
null
java.lang.NullPointerException
at com.google.zxing.client.j2se.BufferedImageLuminanceSource.<init>(BufferedImageLuminanceSource.java:42)私有字符串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代码的解决方案。任何帮助都将不胜感激。谢谢!
发布于 2021-07-12 08:38:12
好的,如果图像src属性有blob url,我找到了一种扫描QR代码的方法。我贴出这个答案,是因为有人可能被困在我原来的位置上,并且抓伤了我的头。因此,解决方案是将我前面尝试过的两种方法结合起来。
首先,您需要获取URL并使用Javascript注入从您的URL中获取一个字节数组。
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库对其进行解码。
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代码的实际值。
https://stackoverflow.com/questions/68286840
复制相似问题