2016-08-11 11 views
2

C#でSelenium WebDriverを使用しています。 動的にフォルダーを作成し、失敗したテストのスクリーンショットを保存しようとしています。 ここでは、テストケースのグループ(66のテストケースのテストスイート)を実行しています。 テストスイートを実行した後、GDI +エラーでテストに失敗したことがほとんどなく、スクリーンショットとして取得されませんでした。 しかし、私がそれらを個別に実行すると、ほとんどの場合を除いて、失敗したケース(GDI +エラー)のほとんどが合格していました。ここでExternalException:GDI +で一般的なエラーが発生しました

は、フォルダを作成するためのコードです:ここで

TestExecutionStartTime = DateTime.Now; 
baseDirectory = AppDomain.CurrentDomain.BaseDirectory + @"\" + ConfigurationManager.AppSettings.GetValues("failedTests")[0]; 
Browser = ConfigurationManager.AppSettings["WebDriver"]; 

DirectoryInfo directory = new DirectoryInfo(baseDirectory); 
DirectoryInfo[] subdirs = directory.GetDirectories(); 

if (System.IO.Directory.GetDirectories(baseDirectory).Length == 0) 
    { 
     screenshotDirectory = baseDirectory + @"\" + (DateTime.Now.ToString("yyyy_MM_dd_hh_mm") + "_" + Browser); 
     Directory.CreateDirectory(screenshotDirectory); 
    } 

は、スクリーンショットを撮るためのコードです:

public void takeScreenshot(string filename) 
     { 
      string fname = filename + ".jpg"; 
      string screenshot = screenshotDirectory + @"\" + fname; 
      Screenshot ss = ((ITakesScreenshot)WebDriver).GetScreenshot(); 
      byte[] image = ss.AsByteArray; 
      using (MemoryStream ms = new MemoryStream(image)) 
      { 
       Image i = Image.FromStream(ms); 
       i.Save(screenshot); 
      } 

私はエラーがこのi.Save(screenshot)呼び出しであることを前提としていますが、私はしませんでしたそれを解決することができます。

+0

:ここ は、コードのですか? – AntonB

+0

あなたはどのドライバを使用していますか? GDIエラーはおそらくドライバによって返された空のイメージによるものです。例外が発生したときにスクリーンショットを撮るように再試行することができます。 –

答えて

0

私は、ストリームが保存されている間に破棄されたために問題が発生していると(経験から)理由があります(usingステートメント)。これはGDI+例外をスローし、非常に誤解を招く恐れがあり、あなたのパスを確認します - あなたは

  • は、パスが正しいことを確認した画像を保存しているところはどこでも

    1. 書き込み権限:

      物事はを意識するようにカスタムイメージディレクトリを作成せずに一時ディレクトリを試して、このディレクトリを管理してください。

    2. 画像の高さは、(65534px)より大きくなっていないことを確認し

      1. あなたはサイズを見て、これを確認することができます

        var bitmapTemp = new Bitmap(stream); 
            Console.WriteLine(bitmapTemp.Height); 
        

    をここにいくつかありますイメージが保存された後にのみストリームを破棄するコード:

    public static Screenshot GetScreenshot(ChromeDriver driver) 
        { 
         Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot(); 
         return ss; 
        } 
        public static void SaveScreenshot(byte[] byteArray, string location) 
        { 
         var stream = new MemoryStream(byteArray); 
         var img = Image.FromStream(stream); 
         img.Save(location); 
         stream.Dispose(); 
        } 
    

    そしてそうのような関数を使う:あなたの入力AntonBため

    var path = AppDomain.CurrentDomain.BaseDirectory; 
        var ss = GetScreenshot(driver); 
        SaveScreenshot(ss.AsByteArray, path + "imagename.jpg"); 
    
  • -1

    感謝を。 私はあなたの意見を考慮し、異なった方法で試して解決策を得ました。 私は[SetUpFixture]、[OneTimeSetUp]、[OneTimeTearDown]を使ってフォルダを一度しか作成せず、問題を解決しました。そうあなただけのテストが失敗したときのスクリーンショットをキャプチャし、日付と名付けられていますサブディレクトリにそれらを配置したい

    [SetUpFixture] 
    public class Config 
    { 
        public Config() 
        { 
    
        } 
        public string baseDirectory; 
        public static string screenshotDirectory; 
    
        [OneTimeSetUp] 
        public void SetUp() 
        { 
         Console.WriteLine("Creating a folder to capture failed scenarios"); 
         baseDirectory = AppDomain.CurrentDomain.BaseDirectory + @"\" + ConfigurationManager.AppSettings.GetValues("failedTests")[0]; 
         string Browser = ConfigurationManager.AppSettings["WebDriver"]; 
    
         screenshotDirectory = baseDirectory + @"\" + (DateTime.Now.ToString("yyyy_MM_dd_hh_mm") + "_" + Browser); 
         Directory.CreateDirectory(screenshotDirectory); 
        } 
        [OneTimeTearDown] 
        public void TearDown() 
        { 
    
        } 
    } 
    
    関連する問題