C# ExternalException:GDI+;
我在C#中使用Selenium WebDriver,并且 我正在尝试动态创建一个文件夹,并将失败测试的截图保存到其中。 这里我运行的是一组测试用例(66个测试用例的测试套件)。 在运行测试套件之后,我发现了一些带有GDI+错误的失败测试,并且没有截图。 但当我单独运行它们时,大多数失败案例(GDI+错误)都通过了,只有少数例外 以下是创建文件夹的代码:C# ExternalException:GDI+;,c#,selenium,webpage-screenshot,C#,Selenium,Webpage Screenshot,我在C#中使用Selenium WebDriver,并且 我正在尝试动态创建一个文件夹,并将失败测试的截图保存到其中。 这里我运行的是一组测试用例(66个测试用例的测试套件)。 在运行测试套件之后,我发现了一些带有GDI+错误的失败测试,并且没有截图。 但当我单独运行它们时,大多数失败案例(GDI+错误)都通过了,只有少数例外 以下是创建文件夹的代码: TestExecutionStartTime = DateTime.Now; baseDirectory = AppDomain.Current
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错误可能是由驱动程序返回的空映像造成的。当异常发生时,您可以重试截图。