Javascript 计算java webdriver中加载的图像的md5
我想用java计算webdriver中加载的图像的md5。 webdriver是FirefoxJavascript 计算java webdriver中加载的图像的md5,javascript,java,selenium,webdriver,Javascript,Java,Selenium,Webdriver,我想用java计算webdriver中加载的图像的md5。 webdriver是Firefox import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.JavascriptExecutor; String script = "var imgElement = document.querySelector('div.mtl
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.JavascriptExecutor;
String script = "var imgElement = document.querySelector('div.mtl:nth-child(2) > div:nth-child(1) > img:nth-child(1))'; *** return md5 of image *** ";
String url = "http://www.facebook.com";
WebDriver webDriver = new FirefoxDriver();
driver.get(url);
JavascriptExecutor js = (JavascriptExecutor) driver;
Stgin md5 = (String) js.executeScript(script);
在此代码中,必须用以下内容替换:
***返回图像的md5***
您可以使用
fetch
和force cache
从缓存中获取内容。然后从响应中消化arrayBuffer。不幸的是,MD5太旧了,浏览器不再支持它。请参阅有关加密的更多详细信息。您可以选择SHA-1、SHA-256、SHA-384和SHA-512。请参见下面的SHA-256摘要示例
public void getImageSHA256(){
driver.get("https://www.blognone.com/");
WebElement img = driver.findElement(By.cssSelector("img"));
String imgUrl = img.getAttribute("src").trim();
String script = "function hex(buffer) { var hexCodes = []; var view = new DataView(buffer); for (var i = 0; i < view.byteLength; i += 4) { var value = view.getUint32(i); var stringValue = value.toString(16); var padding = '00000000'; var paddedValue = (padding + stringValue).slice(-padding.length); hexCodes.push(paddedValue); } return hexCodes.join(\"\");}" +
"var callback = arguments[arguments.length - 1];" +
"fetch(arguments[0],{cache:'force-cache'}).then((response)=> {" +
"return response.arrayBuffer(); }).then((buffer)=>{" +
" return crypto.subtle.digest('SHA-256', buffer); }).then((hashArray)=>{" +
" callback(hex(hashArray));"+
"});";
driver.manage().timeouts().setScriptTimeout(15, TimeUnit.SECONDS);
Object response = ((JavascriptExecutor) driver).executeAsyncScript(script, imgUrl);
System.out.println(response);
}
public void getImageSHA256(){
驱动程序。获取(“https://www.blognone.com/");
WebElement img=driver.findElement(By.cssSelector(“img”);
字符串imgUrl=img.getAttribute(“src”).trim();
String script=“function hex(buffer){var hexcode=[];var view=新数据视图(缓冲区);对于(var i=0;i{+
“返回响应。arrayBuffer();})。然后((缓冲区)=>{”+
“返回crypto.division.digest('SHA-256',buffer);})。然后((hashArray)=>{”+
“回调(十六进制(哈希数组));”+
"});";
driver.manage().timeouts().setScriptTimeout(15,TimeUnit.SECONDS);
对象响应=((JavascriptExecutor)驱动程序);
System.out.println(响应);
}
下面的屏幕截图显示了我的代码中的SHA-256与在线工具中的SHA-256之间的比较。
public void getImageMD5(){
驱动程序。获取(“https://www.blognone.com/");
WebElement img=driver.findElement(By.cssSelector(“img”);
字符串imgUrl=img.getAttribute(“src”).trim();
String script=“var callback=arguments[arguments.length-1];”
+“函数U arrayBufferToBase64(缓冲区){”
+“var binary=”
+“var bytes=新的Uint8Array(缓冲区);”
+“var len=字节。字节长度;”
+“对于(var i=0;i{return response.arrayBuffer()})。”
+“然后((响应)=>{return}
+“然后((响应)=>{callback(响应)});”;
driver.manage().timeouts().setScriptTimeout(15,TimeUnit.SECONDS);
对象响应=((JavascriptExecutor)驱动程序);
字节[]数据=Base64.getDecoder().decode((字符串)响应);
MessageDigest md=MessageDigest.getInstance(“MD5”);
字节[]散列=md.digest(数据);
StringBuilder sb=新的StringBuilder(2*散列长度);
for(字节b:哈希){
sb.append(字符串格式(“%02x”,b&0xff));
}
字符串摘要=sb.toString();
System.out.println(“图像的MD5:+摘要”);
}
是否希望在DOM中使用图像元素的MD5?或者您想要映像文件的MD5?我想要映像文件的MD5我想您需要使用Java下载文件,然后使用MD5下载内容。我想要从驱动程序缓存使用。它是在我调用get方法时下载的。我不想再下载图片了。谢谢。我可以将响应保存到文件中并看到正确的图像吗?怎么做?@user2581337我想你必须在JavaScript中计算MD5。Java中对象响应
中的数据将不正确,原因是解析和强制转换。Ok。谢谢你能帮我查一下javascript中的MD5吗?@user2581337我已经更新了我的答案,用SHA-256算法在javascript中消化图像。不幸的是,MD5太旧了,web浏览器不再支持ti。我可以用java检索它的字节数组吗?此方法不会从www.blognone.com域中获取图像url。我怎么做?
public void getImageMD5(){
driver.get("https://www.blognone.com/");
WebElement img = driver.findElement(By.cssSelector("img"));
String imgUrl = img.getAttribute("src").trim();
String script = "var callback = arguments[arguments.length - 1];"
+ "function _arrayBufferToBase64( buffer ) {"
+ " var binary = '';"
+ " var bytes = new Uint8Array( buffer );"
+ " var len = bytes.byteLength;"
+ " for (var i = 0; i < len; i++) {"
+ " binary += String.fromCharCode( bytes[ i ] );"
+ " }"
+ " return window.btoa( binary );"
+ "}"
+ " fetch(' " + imgUrl + " ',{cache:'force-cache'})."
+ "then((response)=>{return response.arrayBuffer()})."
+ "then((response)=>{return _arrayBufferToBase64(response)})."
+ "then((response)=>{callback(response)});";
driver.manage().timeouts().setScriptTimeout(15, TimeUnit.SECONDS);
Object response = ((JavascriptExecutor) driver).executeAsyncScript(script, imgUrl);
byte[] data = Base64.getDecoder().decode((String) response);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(data);
StringBuilder sb = new StringBuilder(2 * hash.length);
for (byte b : hash) {
sb.append(String.format("%02x", b & 0xff));
}
String digest = sb.toString();
System.out.println("MD5 of Image : " + digest);
}