c# - 截图后 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 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);
        }
    }
}

(这不是我使用的网站,因为它需要登录/密码身份验证,只是来自 Google 的一些图片较多的网站,内存消耗略低但仍然很大 — ≈300 MB)

最佳答案

TakeScreenshot 方法返回一个 Bitmap 对象。您提供的代码示例不会处理此对象,因此 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);
    }
}

关于c# - 截图后 PhantomJS 巨大的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32305815/

相关文章:

c# - 为什么我的 .NET Standard 2.0(多目标)项目对依赖程序集之一发出警告?

java - 除了 XPath 之外,在 selenium webdriver 中定位元素的最佳方法是什么?

python - 如何使用 Python 在 chrome 中将文件下载到所需位置?

java - 如何从java中的结果集中返回多行?

c# - 在 C# 中反序列化嵌套数组 JSON 返回空值

c# - 在当前调试器 session 下启动新进程

java - 页面工厂模式和下拉列表

java - 单击 Web 应用程序中的另一个元素后,输入的值被删除

c# - 是否存在 C# 预处理工具?

java - 使用 Selenium WebDriver 进行简单测试设置失败