Решение
По умолчанию ответ на вопрос будет следующим: вы можете собрать все сворачиваемые элементы заголовка в массив с помощью простого page.$$
(псевдоним для document.querySelectorAll
в chrome api), затем elementHandle.click
на всех из них в for...of
l oop (array.map или forEach не подходят для выполнения asyn c кликов!) и, наконец, создать снимок экрана с опцией fullPage: true
.
Дополнительная информация об ошибке кукловода и обходном пути ⚠️
Во время тестирования я обнаружил ошибку кукловода / хрома на последнем этапе: fullPage: true
, поэтому требуется другой подход, чтобы сделать полный снимок экрана page.
Если [fullPage] имеет значение true, [он] делает снимок экрана с полной прокручиваемой страницей [...] [источник]
Полная высота прокручиваемой страницы определяется при навигации в кукловоде, а не во время создания снимка экрана, поэтому, если мы откроем больше свернутого содержимого после первого рендеринга: все, что появится ниже линии оригинала document.body.scrollHeight
, будет вырезано .
В качестве обходного пути мы можем пересчитать scrollHeight
(и scrollWidth
) после открытия всего содержимого. У меня возникла странная обрезка, если я не ждал 1-2 секунды после щелчков, поэтому я установил page.waitFor(1500)
перед пересчетом. Перед созданием снимка экрана на устройстве должно быть применено page.setViewport
(page.screenshot
не должно иметь дополнительных параметров, таких как fullPage
или clip
вместе с предыдущими настройками области просмотра!)
Пример
const puppeteer = require('puppeteer')
const iPhone = puppeteer.devices['iPhone 6']
async function fn() {
const browser = await puppeteer.launch({ headless: true })
const page = await browser.newPage()
await page.emulate(iPhone)
await page.goto('https://en.m.wikipedia.org/wiki/Story_of_the_Year')
await page.waitForSelector('.collapsible-heading')
// collect all collapsed headings to an array and click all of them
const headingHandles = await page.$$('.collapsible-heading')
for (const el of headingHandles) {
await el.click()
}
// let a bit time for scrollHeight to be finalized
await page.waitFor(1500)
// set viewPort to fullPage manually
const scrollHeight = await page.evaluate(() => document.body.scrollHeight)
const scrollWidth = await page.evaluate(() => document.body.scrollWidth)
await page.setViewport({ width: scrollWidth, height: scrollHeight })
await page.screenshot({ path: 'wiki.png' })
await browser.close()
}
fn()