2016-08-11 4 views
2

Я использую Selenium WebDriver в C# и Я пытаюсь динамически создавать папку и сохранять скриншоты неудачных тестов. Здесь я запускаю группу тестовых примеров (Test Suite из 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).

Вещи, чтобы быть в курсе:

  1. разрешения на запись, где вы спасаете изображение
  2. Убедитесь, что путь является правильным - это бросить GDI+ исключение и вводит в заблуждение, проверить свой путь , попробуйте создать временный каталог вместо создания своего настраиваемого каталога изображений, чтобы выпустить его.
  3. Убедитесь, что высота изображения не больше, чем (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(); 
    } 

и использовать такие функции, как так:

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

Спасибо за ваши входы AntonB. Я рассмотрел ваши вопросы и попытался по-другому и получил решение. Я использовал [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() 
    { 

    } 
}