ExternalException:GDI +中发生一般错误

时间:2016-08-11 18:27:52

标签: c# selenium webpage-screenshot

我在C#中使用Selenium WebDriver 我正在尝试动态创建一个文件夹并保存失败测试的屏幕截图。 在这里,我运行一组测试用例(66个测试用例的Test Suite)。 运行测试套件后,我发现很少有GDI +错误的测试失败,并没有被捕获为截图。 但是当我单独运行它们时,大多数失败的情况(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)来电,但我无法解决。

2 个答案:

答案 0 :(得分:0)

我有理由相信(根据经验)您的问题是由于流在保存时被销毁而导致的(using语句)。

需要注意的事项:

  1. 在保存图像的任何位置写入权限
  2. 确保路径正确 - 这会抛出GDI+异常并且非常误导,验证您的路径,尝试临时目录而不是创建自定义映像目录来统治此一出。
  3. 确保图像的高度不大于(65534px)

    1. 您可以通过查看尺寸来验证这一点:

          var bitmapTemp = new Bitmap(stream);
          Console.WriteLine(bitmapTemp.Height);
      
  4. 以下是一些仅在保存图像后销毁流的代码:

        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 :(得分:-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()
    {

    }
}
相关问题