2017-06-30 51 views
6

Chrome stany dokumentacja:Jak zrzucić więcej niż <body> na bezgłowy chrom/chrom?

W --dump-DOM flag document.body.innerHTML drukuje na stdout:

Zgodnie z tytułem, w jaki sposób można bardziej obiektu DOM (najlepiej wszystkie) być porzucone z Chromium bez głowy? Mogę ręcznie zapisać cały DOM za pomocą narzędzi programistycznych, ale chcę mieć rozwiązanie programowe.

Odpowiedz

3

Aktualizacja 2017-10-29 Chrome ma już flagę --dump-html, która zwraca pełny kod HTML, a nie tylko treść.

v62 ma to, jest już na stabilnym kanale.

kwestia, która stała w tym: https://bugs.chromium.org/p/chromium/issues/detail?id=752747

Aktualny stan chrom (wersja na kanał) https://www.chromestatus.com/features/schedule

Pozostawienie starego odpowiedź dla spuścizny

można zrobić z Google Chrome zdalnego interfejsu. Próbowałem go i zmarnowałem kilka godzin próbując uruchomić chrome i uzyskać pełny html, w tym tytuł i to jeszcze nie jest gotowe, powiedziałbym.

To działa czasami, ale próbowałem uruchomić go w środowisku produkcyjnym i otrzymałem błędy od czasu do czasu. Wszystkie rodzaje losowych błędów, takich jak i no chrome found to kill. Te błędy wzrosły czasem o i ciężko jest debugować.

Osobiście używam --dump-dom, aby uzyskać html, gdy potrzebuję ciała, a kiedy potrzebuję tytułu, używam na razie tylko curl. Oczywiście, chrom może dać ci tytuł z aplikacji SPA, którego nie można zrobić z zawijaniem tylko, jeśli ustawiono tytuł z JS na . Przełączę na google chrome po stabilnym rozwiązaniu .

Chciałbym mieć flagę --dump-html na chrome i po prostu uzyskać wszystkie html. Jeśli inżynier Google czyta to, dodaj taką flagę do chrome.

Utworzyłem problem Chrome emisyjnej tracker, kliknij ulubiony „gwiazda”, aby uzyskać zauważony przez programistów Google:

https://bugs.chromium.org/p/chromium/issues/detail?id=752747

Oto długa lista wszelkiego rodzaju flagi dla Chrome , nie jestem pewien, czy jest to pełna i wszystkie flagi: https://peter.sh/experiments/chromium-command-line-switches/ nic nie znaczy , aby zrzucić tag tytułu.

Kod ten jest z blogu Google, można spróbować szczęścia z tym:

const CDP = require('chrome-remote-interface'); 

... 

(async function() { 

const chrome = await launchChrome(); 
const protocol = await CDP({port: chrome.port}); 

// Extract the DevTools protocol domains we need and enable them. 
// See API docs: https://chromedevtools.github.io/devtools-protocol/ 
const {Page, Runtime} = protocol; 
await Promise.all([Page.enable(), Runtime.enable()]); 

Page.navigate({url: 'https://www.chromestatus.com/'}); 

// Wait for window.onload before doing stuff. 
Page.loadEventFired(async() => { 
    const js = "document.querySelector('title').textContent"; 
    // Evaluate the JS expression in the page. 
    const result = await Runtime.evaluate({expression: js}); 

    console.log('Title of page: ' + result.result.value); 

    protocol.close(); 
    chrome.kill(); // Kill Chrome. 
}); 

})(); 

Źródło: https://developers.google.com/web/updates/2017/04/headless-chrome