Подтвердить что ты не робот

Огромное потребление памяти PhantomJS после снятия снимков экрана

Я использую PhantomJS через Selenium и столкнулся с проблемой на одном веб-сайте с большим количеством изображений.

Когда я пытаюсь сделать снимок экрана, процессорная память PhantomJS становится очень высокой, ≈4-44 МБ (≈100 МБ перед снимком экрана)

С --load-images=no лучше, ≈70-100 МБ.

Есть ли способ решить эту проблему без полного отключения изображений? Может быть, можно сделать снимок экрана только видимой области, а не полной страницы?

В других WebDrivers (таких как 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);
        }
    }
}

(это не тот веб-сайт, который я использовал, потому что он требует авторизации/пароля auth, просто изображение с тяжелым сайтом от Google, потребление памяти немного ниже, но все еще огромно - ≈300 МБ)

4b9b3361

Ответ 1

Метод 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);
    }
}

Ответ 2

попробуйте следующее:

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