GDI +中发生一般错误(截图SaveAsFile,ExternalException)

时间:2015-04-30 17:14:59

标签: c# file selenium path screenshot

您好我尝试查看可能有我答案的问题,但没有一个问题。

我正在进行网络自动化测试,并尝试截取发生错误的屏幕截图并将其保存到另一个文件夹中的文件中。

我的程序在搜索页面上的元素时有30秒的超时时间。如果30秒后没有找到任何元素,则需要SS,重新加载页面,然后再次尝试。

第一个截图工作正常。但是在第二次运行时,它试图将另一个屏幕截图保存到文件夹中,我得到了这个看似由一百种不同的东西引起的令人难以置信的模糊错误,所以我不太确定问题是什么。

这是我的代码:

public void takeScreenShot()
    {
        string ssPath = _persistencePath += "\\Errors";

        string currTime = DateTime.Now.ToString(@"MMM-ddd-d-HH.mm");

        Screenshot ss = ((ITakesScreenshot)_driver).GetScreenshot();

        try
        {
            ss.SaveAsFile(ssPath + "\\ERROR-" + currTime + ".png", System.Drawing.Imaging.ImageFormat.Png);
            ssCount = 0;
        }
        catch (System.Runtime.InteropServices.ExternalException)
        {
            ssCount++;

            //error occurs here
            ss.SaveAsFile(ssPath + "\\ERROR-" + currTime + "(" + ssCount + ")" + ".png", System.Drawing.Imaging.ImageFormat.Png);
        }

我最初认为问题是它试图保存同名文件,因为如果错误发生在同一分钟,那么文件名是相同的。这就是为什么我添加了catch块,试图在同一分钟内更改名称。但这并没有解决它。

我再一次尝试搜索,但找不到答案。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:7)

好吧,如果有人好奇我解决了它。结果我只是个白痴。

string ssPath = _persistencePath += "\\Errors";

此行在第二次运行时将另一个\ Errors附加到目标路径。从而使路径无效,因为\错误\错误不存在。

感谢所有评论/试图提供帮助的人!

答案 1 :(得分:1)

Screenshot类没有正确处理图像资源,因此它可能是Selenium框架中的一个错误。解决方法是自己动手:

public void takeScreenShot()
{
    string ssPath = System.IO.Path.Combine(_persistencePath, @"\Errors");

    string currTime = DateTime.Now.ToString(@"MMM-ddd-d-HH.mm");
    string fileName = System.IO.Path.Combine(ssPath, @"\ERROR-" + currTime + ".png");

    Screenshot ss = ((ITakesScreenshot)_driver).GetScreenshot();

    using (MemoryStream ms = new MemoryStream(ss.AsByteArray))
    using (Image screenShotImage = Image.FromStream(ms))
    {
        Bitmap cp = new Bitmap(screenShotImage);
        cp.Save(filename, ImageFormat.Png);
        cp.Dispose();
    }
}

不保证会解决这个问题,但至少可以合理保证资源得到妥善处理。

注意要求您在项目中引用System.Drawing.dll

修改已发布的其他解决方法。

答案 2 :(得分:0)

最后我做到了!

看看这个,只写完成的PATHNAME,

pathname+filename+extension: @"C:\folderWithPermission\test.bmp"

只是用文字许可来获取文件,就像o.0

这是方法

 public DriverExecutor CaptureScreen(string filename)
    {
        Screenshot shot = this.myRemoteWebDriver.GetScreenshot();
        MemoryStream ms;
        Image imgShot;
        Bitmap bitmap;
        try 
        {
            using (ms = new MemoryStream(shot.AsByteArray))
            using (imgShot = Image.FromStream(ms))
            using (bitmap = new Bitmap(imgShot))
            {
                bitmap.Save(filename, ImageFormat.Bmp);
            }
        }catch(Exception err){}
        return this;
    } 

注意:我正在假设remoteDriver正确实例并封装在一个自己的对象上,我希望这能帮助你们所有人^^

相关问题