Добрый день, коллеги.
Вдохновлённый когда-то ашотом от Яндекса я решил сделать нечто подобное для C#.
Для меня это жизненно необходимо - делать скриншот всей страницы, а не только видимой области.
В общем, пришло время это доработать и сделать как отдельный проект и предоставить сообществу для пользования.
Nuget пакет: NuGet Gallery | Noksa.WebDriver.ScreenshotsExtensions 0.1.5.4
GitHub: GitHub - Noksa/WebDriver.Screenshots.Extensions: C# WebDriver screenshots extensions, like a screenshot entire page
Для использования достаточно вызвать новую перегрузку метода расширения:
driver.TakeScreenshot(IScreenshotStrategy strategy)
Данный метод возвращает byte[]
.
В качестве аргумента вы можете передать декорированный объект, в зависимости от того, как вы хотите обработать скриншот.
Ключевое здесь - последним должен всегда идти new ScreenshotMaker()
- т.к. именно данный класс непосредственно создает скриншот.
Либо же вы всегда можете сделать свою реализацию, если есть необходимость.
Версия 0.0.2:
Сейчас доступны следующие декораторы:
-
new CutterDecorator(ISceenshotStrategy strategy)
Данный декоратор имеет обязательный настроечный метод:
SetCuttingStrategy(ICuttingStrategy strategy)
.
Данным методом вы можете указать что и как следует вырезать на скриншоте.
По умолчанию есть одна реализованная стратегияnew CutElementHeightOnEntireWidthThenCombine(IWebElement element)
- используется для удаления шапок/футеров, как статичных, так и тех, что не исчезают при скроллинге страницы.
Данная стратегия находит элемент, вырезает его по высоте по всей ширине скриншота, только при условии, что он находится во viewport.
Если этот элемент был не на самом верху или не в самом низу, то склеивает изображения, удаляя образовавшуюся пустоту. -
new VerticalCombineDecorator(IScreenshotStrategy strategy)
Данный декоратор будет создавать скриншот всей страницы, а не только видимой области.
Имеет настроечный методSetWaitAfterScrolling(TimeSpan timeSpan)
, который отвечает за ожидание после скроллинга страницы перед снятием скриншота. По умолчанию 50 мс. -
new OnlyElementDecorator(IScreenshotStrategy strategy)
Делает скриншот только указанного элемента.
Элемент нужно указать путём вызова методаSetElement(IWebElement element)
.
Вы можете комбинировать их так, как вам требуется. Т.е. например делать скриншот всей страницы, срезая футер или шапку, или и футер и шапку.
Но не стоит комбинировать вертикальное объединение и скриншот элемента, из этого не получится ничего хорошего
При использовании VerticalCombineDecorator
он должен стоять первым
Примеры:
var ele = _driver.FindElement(By.XPath("//*[@id=\"hrId\""));
var arr = _driver.TakeScreenshot(new CutterDecorator(new ScreenshotMaker()).SetCuttingStrategy(new CutElementHeightOnEntireWidthThenCombine(ele)));
var vcs = new VerticalCombineDecorator(new ScreenshotMaker());
var screen = _driver.TakeScreenshot(vcs);
Скриншот конкретного элемента:
_driver.Navigate().GoToUrl("http://yandex.ru");
var ele = _driver.FindElement(By.Id("text"));
var vcs = new OnlyElementDecorator(new ScreenshotMaker()).SetElement(ele);
var screen = _driver.TakeScreenshot(vcs);
Так же есть классическая возможность сравнить два изображения, метод с перегрузками:
var diffImage = WdseImageComparer.CompareAndGetImage("C:\\diff1.png", "C:\\diff1.png");
Либо булево
var boolRes = WdseImageComparer.Compare("C:\\diff1.png", "C:\\diff1.png");
Первое изображение
Второе изображение
Изображение с отличием первого от второго
Соответственно если отличий не будет, то красного не будет
Небольшой пример. Скриншот всей страницы:
Надеюсь кому-то это окажется полезным.
Более подробная информация Home · Noksa/WebDriver.Screenshots.Extensions Wiki · GitHub