c# - 外部异常 : A generic error occurred in GDI+

标签 c# selenium webpage-screenshot

我在 C# 中使用 Selenium WebDriver 并且 我正在尝试动态创建一个文件夹并将失败测试的屏幕截图保存到其中。 在这里,我正在运行一组测试用例(66 个测试用例的测试套件)。 运行测试套件后,我发现很少有 GDI+ 错误的失败测试,​​并且没有被捕获为屏幕截图。 但是当我单独运行它们时,大多数失败案例(GDI+ 错误)都通过了,只有少数异常(exception)。

下面是创建文件夹的代码:

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) 调用中,但我无法解决它。

最佳答案

我有理由相信(根据经验)您的问题是由于流在保存时被销毁(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");

关于c# - 外部异常 : A generic error occurred in GDI+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38903692/

相关文章:

c# - Xamarin - NavigationPage.TitleView 内的 StackLayout 不会使用所有空间吗?

javascript - JQuery "Boostrap Confirmation"插件在第二次单击时不显示

c# - Fluent NHibernate 自动映射错误

selenium - 在 Docker 容器中执行 Firefox 浏览器进行 Selenium 测试

python - Selenium:列表索引超出范围错误

python - 使用 Selenium : How to keep logged in after closing Driver in Python

html - 调整浏览器窗口大小时文本重叠导航栏

c# - Windows 应用程序出错

google-chrome-devtools - Chrome - 截屏热键

screenshot - Selenium 2 : Taking screenshots with selenium grid 2