Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# PhantomJS截图后巨大的内存消耗_C#_Selenium_Selenium Webdriver_Phantomjs - Fatal编程技术网

C# PhantomJS截图后巨大的内存消耗

C# PhantomJS截图后巨大的内存消耗,c#,selenium,selenium-webdriver,phantomjs,C#,Selenium,Selenium Webdriver,Phantomjs,我通过Selenium使用PhantomJS,在一个有很多图片的网站上遇到了一个问题 当我尝试截图时,PhantomJS进程内存消耗非常高,≈400-450 MB(≈屏幕截图前100 MB) 使用--load images=no更好,≈70-100 MB 有没有办法在不完全禁用图像的情况下解决此问题?也许可以只拍摄可视区域的屏幕截图而不是整页 与其他网络驱动程序(如Chrome)配合使用,效果良好 class Program { public static RemoteWebDriver

我通过Selenium使用PhantomJS,在一个有很多图片的网站上遇到了一个问题

当我尝试截图时,PhantomJS进程内存消耗非常高,≈400-450 MB(≈屏幕截图前100 MB)

使用
--load images=no
更好,≈70-100 MB

有没有办法在不完全禁用图像的情况下解决此问题?也许可以只拍摄可视区域的屏幕截图而不是整页

与其他网络驱动程序(如Chrome)配合使用,效果良好

class Program
{
    public static RemoteWebDriver CreatePhantomJsDriver()
    {
        var service = PhantomJSDriverService.CreateDefaultService();
        //service.AddArgument("--load-images=no");

        var options = new PhantomJSOptions();
        options.AddAdditionalCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36");

        return new PhantomJSDriver(service, options);
    }

    public static void SaveScreenshot(RemoteWebDriver driver)
    {
        try
        {
            driver.TakeScreenshot().SaveAsFile(DateTime.Now.Ticks + ".jpg", ImageFormat.Jpeg);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    static void Main(string[] args)
    {
        using (var driver  = CreatePhantomJsDriver())
        {
            driver.Manage().Window.Size = new Size(1600, 1200);

            driver.Url = "http://color-looks.ru/index";

            Thread.Sleep(5000);

            SaveScreenshot(driver);

            Thread.Sleep(5000);
        }
    }
}
(这不是我使用的网站,因为它需要登录/密码验证,只是一些来自谷歌的图片密集型网站,内存消耗稍微低一些,但仍然很大-≈300 MB)

试试这个:

Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
ss.SaveAsFile(DateTime.Now.Ticks + ".jpg", ImageFormat.Jpeg);

方法TakeScreenshot返回位图对象。您提供的代码示例没有处理这个对象,因此GDI对象在内存中挂起很长一段时间(可能是无限期的)

将代码更改为:

public static void SaveScreenshot(RemoteWebDriver driver)
{
    try
    {
        using(var screenshot = driver.TakeScreenshot())
        {
            screenshot.SaveAsFile(DateTime.Now.Ticks + ".jpg", ImageFormat.Jpeg);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

你可以设置,但我不知道它是否对你有用,也不知道你是否可以像设置用户代理字符串那样设置。你看到了吗?@Nathan,我不知道这对我有什么帮助。我不想在截图后立即关闭页面,当我关闭页面时(通过处理驱动程序对象),内存会被释放。如果我转到另一个页面/URL,它也会减少到正常值。我的问题是,当我在一个页面上截图时,内存消耗会大大增加,因此我不能同时使用多个(5-8)PhantomJS实例(我使用的机器上没有足够的内存)。@Alex1123我试图对代码进行一些修改,您提供的页面产生66mb的峰值,每次加载页面时都会有一点变化。正如Nathan所建议的,GC并没有收集所有内容,因此在
SaveScreenshot
之后立即强制收集它确实会将内存消耗降低到20mb左右,并且无论屏幕截图数量如何,它都会保持在那里。相比之下,Chrome选项卡使用230mb来呈现页面,因此我认为您在这里表现不错。顺便说一句,你说的“与其他网络驱动程序(如Chrome)一起工作很好”是什么意思?@Heki我认为Chrome网络驱动程序而不是PhantomJS的内存使用率不高。我有2个Chrome进程(主进程和选项卡进程),每个进程45-50MB。您确定它使用230 MB吗?您可能还需要确保在提取屏幕截图后关闭PhantomJS客户端。