我在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)
来电,但我无法解决。
答案 0 :(得分:0)
我有理由相信(根据经验)您的问题是由于流在保存时被销毁而导致的(using
语句)。
需要注意的事项:
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");
答案 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()
{
}
}