Potrzębuję wystawić endpoint pod który strzelam, robi screenshot strony, zwraca go w postacie byte[]. Główny nacisk na szybkosć. Testuje selenium chromedriver w trybie headless ale średnio schodzi mi 2-3s na adres. Znacie może jakieś szybsze sposoby ? #csharp #programowanie #dotnet #dotnetcore
@WielkiElektronig: a możesz rozwinać ? mam odpalony chromedriver jako serwis i bezpośrednio do niego uderzam ale czasy to nie powalają. Pamiętam, że kiedyś używałem wbudowanej kontrolki Winforms.WebBrowser i tam to zapierdzielało aż miło
@WielkiElektronig: Jeszcze rozwinę. Debuguje to teraz na "oko" i widzę, że niektóre strony zapierzają a na niektórych mam taką zwiechę (mimo, ze cała strona jest jakby już załadowana tylko coś dociąga w tle). Myślę, że to jakieś ustawienie samego sterownika, tylko nie mam pomysłu co :D
@Crisu: a co jak będzie duży ruch? Nie lepiej zapukać na endpoint i wysłać zadanie do rabbitmq i zwrócić id kolejki i potem na 2 endpoincie sprawdzać czy zadanie(screenshot) się wykonało czy nie? Pamiętaj że czasem jakaś strona może się sama z siebie np 30 sec ładować i automatycznie masz już wtedy problem z tineout
@Crisu: po HTTP nigdy nie będzie szybko. Z drugiej strony, dlaczego musi być od razu? Skoro screeny przeglądasz na stronie to te kilka sekund robi Ci różnicę? Cieżko coś doradzić, jeśli nie znam pełnego zapotrzebowania biznesowego :)
@WielkiElektronig: Przypadek biznesowy jest taki, że mam aplikację z listą produktów do każdego dołączony jest url (na stronie może być wyświetlone od 1-200 produktów). User ma przycisk generuj podgląd i w tym momencie w tle odpada mu się generowanie miniatur stron które później wyświetlane są na stronie obok produktu. Także przy 100 elementach jest już zasadnicza różnica czy to leci 2 czy 3s. Słabo z cache'owaniem bo praktycznie url się nie
@Crisu: no to nie jest to taka standardowa, codzienna sprawa. A kto robi te zrzuty ekranów? Masz jakis serwis, który potem te miniaturki przesyła do klienta do webowej apki? Ile trwa samo wygenerowanie rzutów bez przesyłania?
@WielkiElektronig: teraz kod odpowiedzialny za generowanie jest w końcówce klienta (desktopowa apka) Używam właśnie WebBrowsera z Winforms i działa to mega szybko ale też stosunkowo dużo nie potrafi pobrać (leci timeout gdzie selenium bez problemu ogarnia) Z tego co czytam to Webbrowser jest juz po prostu stary i nie wspiera nowych standardów a kazdy link jest inny praktycznie, wiec ciężko wyłapać o co może chodzić.
Czyli u klienta to jest winformsowa aplikacja, w której chcesz robić jak najwięcej miniaturek stron? Czy testujesz w desktopie, żeby móc poźniej przesyłać gdzie indziej?
HttpWebRequest request = HttpWebRequest.Create("https://[url]") as HttpWebRequest; Bitmap bitmap; using (Stream stream = request.GetResponse().GetResponseStream()) { bitmap = new Bitmap(stream); } widzę, że tak można zrobić screen ze strony, ciekawe
@WielkiElektronig: tak xD ale #!$%@? nie wiem chyba cały IE siedzi w pamięci bo #!$%@? bardzo. To jest aplikacja WPF gdzie właśnie się ten moduł psuje, bo coraz więcej miniatur nie mogą wygenerować. Mógłbym zrobić oczywiście, że jeśli WebBrowser nie ogarnie to atakuj z Selenium ale szukam standardowego rozwiazania :D
@Crisu: dużo URL'i, wiele zależy od serwerów, połączeń. Dużo nie zyskasz. Może jakieś buforowanie? Tzn. serwis webowy, który najczęściej odwiedzane/sprawdzane URL'e będzie trzymał skeszowane?
Główny nacisk na szybkosć. Testuje selenium chromedriver w trybie headless ale średnio schodzi mi 2-3s na adres.
Znacie może jakieś szybsze sposoby ?
#csharp #programowanie #dotnet #dotnetcore
Jeden serwis może trzymać otwarte połączenie i tylko wysyłać pliki na rządanie od razu.
Używam właśnie WebBrowsera z Winforms i działa to mega szybko ale też stosunkowo dużo nie potrafi pobrać (leci timeout gdzie selenium bez problemu ogarnia) Z tego co czytam to Webbrowser jest juz po prostu stary i nie wspiera nowych standardów a kazdy link jest inny praktycznie, wiec ciężko wyłapać o co może chodzić.
@Crisu: zawsze był #!$%@?.
Czyli u klienta to jest winformsowa aplikacja, w której chcesz robić jak najwięcej miniaturek stron? Czy testujesz w desktopie, żeby móc poźniej przesyłać gdzie indziej?
HttpWebRequest request = HttpWebRequest.Create("https://[url]") as HttpWebRequest;
Bitmap bitmap;
using (Stream stream = request.GetResponse().GetResponseStream())
{
bitmap = new Bitmap(stream);
}
widzę, że tak można zrobić screen ze strony, ciekawe
https://stackoverflow.com/questions/1981670/programmatically-get-a-screenshot-of-a-page
@WielkiElektronig: tak xD ale #!$%@? nie wiem chyba cały IE siedzi w pamięci bo #!$%@? bardzo.
To jest aplikacja WPF gdzie właśnie się ten moduł psuje, bo coraz więcej miniatur nie mogą wygenerować.
Mógłbym zrobić oczywiście, że jeśli WebBrowser nie ogarnie to atakuj z Selenium ale szukam standardowego rozwiazania :D
@Crisu: dużo URL'i, wiele zależy od serwerów, połączeń. Dużo nie zyskasz. Może jakieś buforowanie? Tzn. serwis webowy, który najczęściej odwiedzane/sprawdzane URL'e będzie trzymał skeszowane?