2017-07-04 3 views
1

javaのwebdriverに読み込まれたイメージのmd5を計算します。 webdriverはFirefoxです。交換しなければならないものを、このコードでjava webdriverに読み込まれたイメージのmd5を計算する

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 ***

+0

** image要素**のMD5をDOMにしますか?または、イメージファイルのMD5が必要ですか? – Buaban

+0

イメージファイルのMD5が必要です –

+0

ファイルをダウンロードするためにJavaを使用し、次にMD5のコンテンツをダウンロードする必要があると思います。 – Buaban

答えて

1

あなたはキャッシュからコンテンツを取得するためにforce-cachefetchを使用することができます。次に、応答からarrayBufferをダイジェストします。残念ながら、MD5は古すぎ、ブラウザはこれ以上サポートしていません。 Crypto hereについてさらに詳しくをご覧ください。 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); 
} 

下のスクリーンショットは、私のコードのSHA-256とオンラインツールのSHA-256の比較を示しています。 Results comparison

+0

ありがとうございます。私はファイルへの応答を保存し、正しいイメージを見ることができますか?どうやって? –

+0

@ user2581337 JavaScriptでMD5を計算する必要があると思います。 Javaの 'Object response'のデータは、解析とキャストのために間違っています。 – Buaban

+0

ありがとう。あなたはjavascriptのMD5のために私を助けることができますか? –

1
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); 
} 
+0

このメソッドは、www.blognone.comドメイン外のイメージURLを取得しません。どうすればいい? –

関連する問題