Javascript 计算java webdriver中加载的图像的md5

Javascript 计算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

我想用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: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);
}