Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExternalException:GDI+;_C#_Selenium_Webpage Screenshot - Fatal编程技术网

C# ExternalException:GDI+;

C# ExternalException:GDI+;,c#,selenium,webpage-screenshot,C#,Selenium,Webpage Screenshot,我在C#中使用Selenium WebDriver,并且 我正在尝试动态创建一个文件夹,并将失败测试的截图保存到其中。 这里我运行的是一组测试用例(66个测试用例的测试套件)。 在运行测试套件之后,我发现了一些带有GDI+错误的失败测试,并且没有截图。 但当我单独运行它们时,大多数失败案例(GDI+错误)都通过了,只有少数例外 以下是创建文件夹的代码: TestExecutionStartTime = DateTime.Now; baseDirectory = AppDomain.Current

我在C#中使用Selenium WebDriver,并且 我正在尝试动态创建一个文件夹,并将失败测试的截图保存到其中。 这里我运行的是一组测试用例(66个测试用例的测试套件)。 在运行测试套件之后,我发现了一些带有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(屏幕截图)
调用中,但我无法解决它。

我有理由相信(根据经验),您的问题是由于在保存流时销毁流(使用
语句)而产生的

注意事项:

  • 无论您在何处保存图像,都具有写入权限
  • 确保路径正确-这将引发一个
    GDI+
    异常,并且非常容易引起误解,请验证您的路径,尝试一个临时目录,而不是创建自定义映像目录,以排除此异常
  • 确保图像的高度不大于(65534px)

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

        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");
    

    谢谢你的意见。 我考虑了你的观点,尝试了不同的方法,并得到了解决方案。 我使用[SetUpFixture]、[OneTimeSetUp]和[OneTimeEartDown]只创建了一次文件夹,解决了这个问题。 代码如下:

    [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()
        {
    
        }
    }
    

    所以,当测试失败时,您只想捕获屏幕截图,并将它们放在以日期命名的子目录中?您使用的是哪个驱动程序?GDI错误可能是由驱动程序返回的空映像造成的。当异常发生时,您可以重试截图。