Працював з замовником, у якого працював проєкт в браузері. І працюючи в декілька потоків час від часу видавав помилки, що не загрузився елемент, форма не знайдена і подібні. Можна було звичайно сидіти і чакати, поки помилка зустрінеться в ProjectMaker, проте більш дієвим в таких випадках є збереження зображення інстанса браузера, у якому буде видно що саме в момент помилки побачив ZennoPoster.
Це саме завдання приблизно 4 роки назад я вже вирішував. В той час мені здавалось що краще використовувати саме блоки для формування логіки проєкта. Хоча зараз розумію, що потрібно було все таки замінювати більшість блоків на C# код – і велика кількість помилок в проєктах була б мені не відома. Ось відео з того часу, як тоді я робив скриншоти браузера в ZennoPoster:
Але час пройшов, і вирішуючи декілька разів це саме завдання, я все таки використовую C# код – в ньому простіше в одному місці підготувати необхідні значення і визвати інструкцію, яка збереже зображення вікна браузера. Нижче приклад коду:
string path = Path.Combine( project.Directory, "image.jpg"); int x0 = int.Parse("0"); // Ліва границя, можна відступити при необхідності int y0 = int.Parse("0"); // Верхня границя int x1 = project.Profile.AvailScreenWidth; // Ширина скриншота int y1 = project.Profile.AvailScreenHeight; // Висота скриншота string units = "pixel"; // percent string exif = string.Empty; ZennoPoster.ImageProcessingCropFromScreenshot(instance.Port, path, x0, y0, x1, y1, units, 95, exif);
В цьому фрагменті задається початкова координата верхнього лівого кута, ширина і висота зображення яке буде збережено.
Тобто, зберігається не тільки видима частина сторінки – зберігається сторінка по всій висоті.
Можливо, при необхідності задавати меншу ширину і висоту, можливо обирати собі конкретний фрагмент на сторінці, щоб зменшити розмір зображення.
Ця інструкція дає можливість також додавати інформацію exif, але я не користувався цією функцією, тому документацію вивчати не приходилось.
Якщо потрібно робити скриншоти браузера в ZennoPoster можна просто копіювати цей фрагмент коду і використовувати в своїх фрагментах.
Думаю потрібно ще обов’язково генерувати ім’я файла, якщо потрібно зберігати декілька зображень, тому що на даний час код зберігає зображення під одним іменем – одне зображення буде замінювати попереднє, при чому може бути проблема при використанні в декілька потоків (адже не може два потоки одночасно записати дані в одне зображення, хоча якщо така необхідність все таки є – то можна одягнути код в конструкцію lock, яка проводить синхронізацію потоків).