Chcę zrobić zrzut ekranu strony z Chrome Headless i widzieliśmy zarówno przełączniki, jak --screenshot
i --virtual-time-budget
przełączniki do robienia zrzutów ekranu i ograniczania oczekiwania przeglądarki na czas ładowania.
Mam jednak na stronie elementy, które czekają na renderowanie DOMContentLoaded, i my też chcemy je przechwycić.
Szukam sposobu na zrobienie zrzutu ekranu, powiedzmy, 5 sekund po załadowaniu strony, zamiast dokładnie wtedy, gdy zostanie uznana za załadowaną.
Nazywamy Chrome Headless z naszej aplikacji NodeJS w następujący sposób:
cp.spawnSync("google-chrome-beta", ["--headless", "--disable-gpu", "--screenshot", "--profile-directory=Default", "--window-size=1920,6200", "--virtual-time-budget=25000", url]);
Wiemy, że są możliwe biblioteki npm, które mogą to osiągnąć za pomocą interfejsu API z węzła zamiast przełączników wiersza poleceń, ale martwimy się o stabilność (zespół Chrome lubi regularnie łamać wszystkie wewnętrzne interfejsy API).
TL; DR
Czy mimo wszystko Chrome bezgłowy musi zaczekać kilka sekund po załadowaniu strony przed zrobieniem zrzutu ekranu?
źródło
nodejs index.js --url="http://www.eff.org" --delay=5000
przez 5 sekund.Odpowiedzi:
Szukałem tego samego. Znalazłem lalkarza Google. https://github.com/GoogleChrome/puppeteer
Istnieje wiele przykładów, ale w zasadzie możesz zrobić to, co zrobiłem.
źródło
UnhandledPromiseRejectionWarning: Error: ERROR: "networkidle" option is no longer supported. Use "networkidle2" instead
Jak stwierdza Vlastimil Ovčáčík , David Schnurr napisał i udostępnił skrypt nodeJS w tym celu na Medium .
Skrypt powinien być plug and play, pomijając niektóre zależności.
Konfiguracja jest taka:
git clone https://github.com/schnerd/chrome-headless-screenshots.git
npm install chrome-remote-interface minimist
node index.js --url="/superuser/1209741/how-to-take-a-screenshot-of-a-page-n-seconds-after-page-is-loaded-with-chrome-he" --delay=4000
źródło