Пример метода снятия скриншотов всей страницы в браузере с помощью ChromeDriver. Пример на языке C#, но то же самое можно написать на любом другом языке программирования. Full page screenshots.
Selenium WebDriver 2 умел снимать скриншоты всей страницы браузера. В третьей версии реализация драйверов переложена на производителей браузеров. На данный момент ChromeDriver, GeckoDriver и др. умеют снимать скриншоты только видимой части страницы.
Вот способ обойти это ограничение.
Для получения скриншота всей страницы нужно запускать Chrome в headless-режиме. Подробнее о headless.
В метод создания хромдрайвера я добавил необязательный параметр, позволяющий запустить Хром в headless-режиме.
private ChromeDriver GetChromeDriver(bool headless = false)
{
var chromeOptions = new ChromeOptions();
chromeOptions.AddUserProfilePreference("download.default_directory", Settings.DownloadsFolder);
chromeOptions.AddUserProfilePreference("safebrowsing.enabled", "false");
if (headless)
{
chromeOptions.AddArguments("headless", "disable-gpu", "--no-sandbox");
}
return new ChromeDriver(chromeOptions);
}
В метод выбора драйвера из настроек я добавил соответствующий вызов:
public IWebDriver GetDriver()
{
switch (Settings.DriverType)
{
case "Chrome":
return GetChromeDriver();
case "HeadlessChrome":
return GetChromeDriver(true);
// other drivers
}
}
Теперь о методе снятия скриншота. Обычно он выглядит примерно так:
public void SaveScreenshot(string path)
((ITakesScreenshot)Driver).GetScreenshot().SaveAsFile(path, ScreenshotImageFormat.Jpeg);
}
Перед запуском каждого автотеста в моём фреймворке вызывается "Driver.Manage().Window.Maximize();" для того, чтобы развернуть окно браузера на весь экран. Chrome в headless-режиме разворачивается до размера 800 на 600 пикселей. Зато его принудительно можно расширить на любой размер и всё это будет видимой областью браузера, которая попадёт на скриншот.
В метод снятия скриншота я добавил проверку на headless. Если браузер запущен в headless-режиме, то он сначала разворачивается на весь экран. После этого с помощью JavaScript я получаю размеры страницы внутри браузера и расширяю браузер до этого размера.
using System.Windows.Forms;
public void SaveScreenshot(string path)
{
if (Settings.DriverType.Contains("Headless"))
{
var screenWidth = Screen.PrimaryScreen.Bounds.Width;
var screenHeight = Screen.PrimaryScreen.Bounds.Height;
Driver.Manage().Window.Size = new Size(screenWidth, screenHeight);
var pageWidth = (int)(long)((IJavaScriptExecutor)Driver).ExecuteScript("return document.body.offsetWidth");
var pageHeight = (int)(long)((IJavaScriptExecutor)Driver).ExecuteScript("return document.body.parentNode.scrollHeight");
Driver.Manage().Window.Size = new Size(pageWidth, pageHeight);
}
((ITakesScreenshot)Driver).GetScreenshot().SaveAsFile(path, ScreenshotImageFormat.Jpeg);
}
Скриншот из обычного режима браузера: