2017-09-10 19 views
0

私はSeleniumを使って自動テストについて学びたいと思っています。私は一人で働いているので、ドキュメント、Google、そしてあなたたちだけがいます。Seleniumと同じスクリーンショットを撮った後、ハッシュファイルが異なる

VS-2105でSeleniumを使用して、自分のウェブサイトのスクリーンショットをイメージとしてファイル位置に保存し、その時点でデバッグを停止します。このファイルは「期待される」結果になります。

私はその行をコメントアウトし、スクリーンショットを撮って別の場所に保存し直して再度実行します。同じサイズのファイルでもハッシュ値が異なります。

私の目には同じです。

私のアプローチに何か問題はありますか?

これは私が私の 'マスター'

 _webDriver.Navigate().GoToUrl(url); 

     var accept = _webDriver.SwitchTo().Alert(); 
     accept.Accept(); 

     IWebElement menu = _webDriver.FindElement(By.Id("link")); 

     menu.Click(); 
     System.Threading.Thread.Sleep(500); 

     var screenshot = _webDriver.GetScreenshot(); 

     var fileName = "expandMenuInPlan.png"; 
     var origFile = _testImagesPersistentPath + fileName; 
     screenshot.SaveAsFile(origFile, OpenQA.Selenium.ScreenshotImageFormat.Png); 

を作成するために実行し、これは私が

 _webDriver.Navigate().GoToUrl(url); 

     var accept = _webDriver.SwitchTo().Alert(); 
     accept.Accept(); 

     IWebElement menu = _webDriver.FindElement(By.Id("link")); 

     menu.Click(); 
     System.Threading.Thread.Sleep(500); 

     var screenshot = _webDriver.GetScreenshot(); 

     var fileName = "expandMenuInPlan.png"; 
     var origFile = _testImagesPersistentPath + fileName; 
     //screenshot.SaveAsFile(origFile, OpenQA.Selenium.ScreenshotImageFormat.Png); COMMENTED OUT 

//The above is identical 

     var newFile = _testImagesTempForTestRunPath + fileName; 
     screenshot.SaveAsFile(newFile, OpenQA.Selenium.ScreenshotImageFormat.Png); 

     string hashOrig = GetBytes(origFile); 
     string hashNew = GetBytes(newFile); 

     if (hashOrig != hashNew) 
     { 
      SaveFailedImage(origFile, newFile, fileName); 
     } 

そしてGetBytesメソッド

private string GetBytes(string file) 
    { 
     using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) 
     { 
      var img = new Bitmap(file); 
      ImageConverter converter = new ImageConverter(); 
      var bytes = (byte[])converter.ConvertTo(img, typeof(byte[])); 
      return Convert.ToBase64String(sha1.ComputeHash(bytes)); 
     } 
    } 
を比較するために使用するコードですコードです

この方法でスクリーンショットを使用しているのは、信頼できないか、コードに問題がありますか?

+1

私は、スクリーンショットが他のすべてのピクセルに一致するとは考えていません。正確な一致が得られないため、画像の比較は分散のしきい値を使用して行われます。 – Crowcoder

答えて

0

画像ファイルをハッシュして比較することは決して適切な方法ではありません。 1ピクセルオフでもハッシュが変更されます。だから、脆性

あなたが使用することができますC#メソッドImageComparer.Compare Method (Image, Image, ColorDifference, Image)

https://msdn.microsoft.com/en-in/library/hh191601.aspx?f=255&MSPPError=-2147217396

あなたのテストを行うためにしたくない場合、または、あなたがスマートです画像を比較行うことができhttps://applitools.com/のような外部ツールを使用することができます本質的には

PS:私はapplitoolsと関連がなく、それは単なる一例であり、利用可能な他のサービスもあります。

+0

1つのピクセルが異なる2つの画像を比較すると、ハッシュしたかどうかに関わらず失敗します。では、なぜこのアプローチは違うのですか? – JeffC

+0

@ JeffC、3番目のパラメータは 'ColorDifference argbTolerance'なので、画像比較で許容差があります。 –

+0

私は知っていますが、そのパラメータや使用方法については何も言及していません。そして、何かが「決して」ないと言えば、正しいアプローチは決して良いアプローチではありません。 – JeffC

関連する問題