Кукловод-это библиотека Node,предоставляющая высокоуровневый API для управления Chromium или Chrome по протоколу DevTools.
Кукловодный API является иерархическим и отражает структуру браузера.
ПРИМЕЧАНИЕ На следующей диаграмме выцветшие объекты в настоящее время не представлены в Puppeteer.
Puppeteer общается с браузером спомощью протокола DevTools .Browser Экземпляр браузера может владеть несколькими контекстами браузера.BrowserContext Экземпляр BrowserContext определяет сеанс просмотра и может владеть несколькими страницами.Frame имеет по крайней мере один контекст выполнения - контекст выполнения по умолчанию, в котором выполняется JavaScript фрейма. Фрейм может иметь дополнительные контексты выполнения, связанные срасширениями .Worker имеет единый контекст выполнения и облегчает взаимодействие сWebWorkers .(Источник схемы: ссылка )
В каждом выпуске начиная с версии 1.7.0 мы публикуем два пакета:
puppeteer - это продукт для автоматизации браузера. После установки он загружает версию Chromium, которую затем запускает с помощью puppeteer-core . Являясь продуктом для конечного пользователя, puppeteer поддерживает набор удобных переменных PUPPETEER_* env для настройки его поведения.
puppeteer-core - это библиотека, которая помогает управлять всем, что поддерживает протокол DevTools. puppeteer-core не загружает Chromium при установке. Будучи библиотекой, puppeteer-core полностью управляется своим программным интерфейсом и игнорирует все переменные PUPPETEER_* env.
Подводя итог, единственные различия между puppeteer-core puppeteer и кукловодом заключаются в следующем:
puppeteer-core не загружает Chromium автоматически при установке.puppeteer-core игнорирует все переменные PUPPETEER_* env.
В большинстве случаев вы будете в порядке с пакетом puppeteer .
Однако вы должны использовать puppeteer-core если:
puppeteer-core файлов с использованием puppeteer-core и написать собственный сценарий install.js , который загружает headless_shell вместо Chromium для экономии места на диске.puppeteer-core , и вы хотите отложить выполнение скрипта install.js до тех пор, пока не будет использован Chromium.
При использовании puppeteer-core не забудьте изменить строку include :
const puppeteer = require('puppeteer-core');
Затем вам нужно будет вызвать puppeteer.connect([options]) или puppeteer.launch([options]) с явной опцией executablePath .
Кукловод ищет определенные переменные среды, чтобы помочь в его работе. Если Puppeteer не находит их в среде на этапе установки, будет использоваться вариант этих переменных в нижнем регистре из конфигурации npm .
HTTP_PROXY , HTTPS_PROXY , NO_PROXY - определяет настройки прокси HTTP, которые используются для загрузки и запуска Chromium.PUPPETEER_SKIP_CHROMIUM_DOWNLOAD - не загружать Chromium в комплекте на этапе установки.PUPPETEER_DOWNLOAD_HOST - перезаписать префикс URL-адреса, который используется для загрузки Chromium. Примечание: это включает протокол и может даже включать префикс пути. По умолчанию https://storage.googleapis.com .PUPPETEER_DOWNLOAD_PATH - перезаписать путь к папке загрузок. По умолчанию <root>/.local-chromium , где <root> - корень пакета кукловода.PUPPETEER_CHROMIUM_REVISION - укажите определенную версию Chromium, которую вы хотите использовать в Puppeteer. См. Puppeteer.launch ([параметры]) о том, как определяется путь к исполняемому файлу. ВНИМАНИЕ : Puppeteer гарантированно работает только с поставляемым Chromium, используйте его на свой страх и риск.PUPPETEER_EXECUTABLE_PATH - укажите путь к исполняемому файлу, который будет использоваться в puppeteer.launch . См. Puppeteer.launch ([параметры]) о том, как определяется путь к исполняемому файлу. ВНИМАНИЕ : Puppeteer гарантированно работает только с поставляемым Chromium, используйте его на свой страх и риск.PUPPETEER_PRODUCT - укажите, какой браузер вы хотите использовать в Puppeteer. Должен быть chrome или firefox . Это также можно использовать во время установки для получения рекомендованного двоичного файла браузера. Программная установка product в puppeteer.launch ([options]) заменяет эту переменную среды. Товар выставлен в puppeteer.productПРИМЕЧАНИЕ. Переменные env PUPPETEER_ * не учитываются в пакетеpuppeteer-core.
Кукловод может быть использован для тестирования хромированных удлинителей.
ПРИМЕЧАНИЕ. Расширения в Chrome / Chromium в настоящее время работают только в режиме без головы.
Ниже приведен код для получения дескриптора фоновой страницы расширения, источник которого находится в ./my-extension :
const puppeteer = require('puppeteer'); (async () => { const pathToExtension = require('path').join(__dirname, 'my-extension'); const browser = await puppeteer.launch({ headless: false, args: [ `--disable-extensions-except=${pathToExtension}`, `--load-extension=${pathToExtension}` ] }); const targets = await browser.targets(); const backgroundPageTarget = targets.find(target => target.type() === 'background_page'); const backgroundPage = await backgroundPageTarget.page(); // Тестируем фоновую страницу так же, как и любую другую страницу. await browser.close(); })();
ПРИМЕЧАНИЕ. Пока невозможно протестировать всплывающие окна расширений или сценарии содержимого.
Модуль «Кукловод» предоставляет способ запуска экземпляра Chromium.Ниже приведен типичный пример использования кукловода для автоматизации:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.google.com'); // другие действия... await browser.close(); })();
Очищает все зарегистрированные обработчики.
options < Объект >browserURL <? строка > URL-адрес браузера, к которому нужно подключиться, в формате http://${host}:${port} . Используйте взаимозаменяемо с browserWSEndpoint , чтобы позволить Puppeteer получить его из конечной точки метаданных .ignoreHTTPSErrors < boolean > Следует ли игнорировать ошибки HTTPS во время навигации. По умолчанию - false .defaultViewport <? Объект > Устанавливает согласованное окно просмотра для каждой страницы. По умолчанию используется область просмотра 800×600. null отключает область просмотра по умолчанию.width < число > ширина страницы в пикселях.height < число > высота страницы в пикселях.deviceScaleFactor < число > Определяет масштабный коэффициент устройства (можно рассматривать как dpr). По умолчанию 1 .hasTouch < boolean > Указывает, поддерживает ли область просмотра события касания. По умолчанию falseisLandscape < boolean > Указывает, находится ли область просмотра в альбомном режиме. По умолчанию - false .slowMo < число > Замедляет операции Puppeteer на указанное количество миллисекунд. Полезно, чтобы вы могли видеть, что происходит.transport < ConnectionTransport > Experimental Укажите пользовательский объект транспорта, который будет использовать Puppeteer.Этот метод присоединяет Puppeteer к существующему экземпляру браузера.
options < Объект >host < string > Используемый хост загрузки. По умолчанию https://storage.googleapis.com . Если product является firefox , это по умолчанию https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla- central .path < строка > Путь к папке загрузок. По умолчанию <root>/.local-chromium , где <root> - корень пакета кукловода. Если product - firefox , по умолчанию используется <root>/.local-firefox .platform <«linux» | «mac» | «win32» | «win64»> строка для текущей платформы. Возможные значения: mac , win32 , win64 , linux . По умолчанию используется текущая платформа.product <«chrome» | «firefox»> строка для запуска продукта. Возможные значения: chrome , firefox . По умолчанию chrome .options < Object > Набор настраиваемых параметров для настройки в браузере. Могут иметь следующие поля:headless < boolean > Следует ли запускать браузер в автономном режиме . По умолчанию true , если опция devtools не true .devtools < boolean > Следует ли автоматически открывать панель DevTools для каждой вкладки. Если эта опция true , опция headless будет установлена false .Флаги по умолчанию,с которыми будет запущен Chromium.
Возвращает список устройств, которые будут использоваться с page.emulate(options) . Актуальный список устройств можно найти в src/common/DeviceDescriptors.ts .
const puppeteer = require('puppeteer'); const iPhone = puppeteer.devices['iPhone 6']; (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.emulate(iPhone); await page.goto('https://www.google.com'); // другие действия... await browser.close(); })();
Методы кукловода могут вызывать ошибки, если они не могут выполнить запрос. Например, page.waitForSelector (selector [, options]) может завершиться ошибкой, если селектор не соответствует ни одному узлу в течение заданного периода времени.
Для определенных типов ошибок Puppeteer использует определенные классы ошибок. Эти классы доступны через puppeteer.errors .
Пример обработки ошибки таймаута:
try { await page.waitForSelector('.foo'); } catch (e) { if (e instanceof puppeteer.errors.TimeoutError) { // Do something if this is a timeout. } }
ПРИМЕЧАНИЕ Старый способ (версии Puppeteer ⇐ v1.14.0) можно получить с помощьюrequire('puppeteer/Errors').
PUPPETEER_SKIP_DOWNLOAD .ПРИМЕЧАНИЕ. Наpuppeteer.executablePath()влияют переменныеPUPPETEER_EXECUTABLE_PATHиPUPPETEER_CHROMIUM_REVISION. См. Подробности в разделе « Переменные среды» .
options < Object > Набор настраиваемых параметров для настройки в браузере. Могут иметь следующие поля:product < string > Какой браузер запускать. На данный момент это либо chrome либо firefox . См. Также PUPPETEER_PRODUCT .ignoreHTTPSErrors < boolean > Следует ли игнорировать ошибки HTTPS во время навигации. По умолчанию - false .headless < boolean > Следует ли запускать браузер в автономном режиме . По умолчанию true , если опция devtools не true .executablePath < string > Путь к исполняемому файлу браузера, который нужно запустить вместо связанного Chromium. Если executablePath путь является относительным путем, он разрешается относительно текущего рабочего каталога . ВНИМАНИЕ : Puppeteer гарантированно работает только с поставляемым Chromium, используйте его на свой страх и риск.slowMo < число > Замедляет операции Puppeteer на указанное количество миллисекунд. Полезно, чтобы вы могли видеть, что происходит.defaultViewport <? Объект > Устанавливает согласованное окно просмотра для каждой страницы. По умолчанию используется область просмотра 800×600. null отключает область просмотра по умолчанию.width < число > ширина страницы в пикселях.height < число > высота страницы в пикселях.deviceScaleFactor < число > Определяет масштабный коэффициент устройства (можно рассматривать как dpr). По умолчанию 1 .hasTouch < boolean > Указывает, поддерживает ли область просмотра события касания. По умолчанию falseisLandscape < boolean > Указывает, находится ли область просмотра в альбомном режиме. По умолчанию - false .args < Array < string » Дополнительные аргументы для передачи экземпляру браузера. Список флагов Chromium можно найти здесь , а вот список флагов Firefox .ignoreDefaultArgs < логическое | Array < string » Если true , то не используйте puppeteer.defaultArgs() . Если дан массив, отфильтруйте заданные аргументы по умолчанию. Опасный вариант; используйте с осторожностью. По умолчанию - false .timeout < число > Максимальное время ожидания в миллисекундах запуска экземпляра браузера. По умолчанию 30000 (30 секунд). Передайте 0 , чтобы отключить тайм-аут.dumpio < boolean > Передавать ли браузерный процесс stdout и stderr по конвейеру в process.stdout и process.stderr . По умолчанию - false .devtools < boolean > Следует ли автоматически открывать панель DevTools для каждой вкладки. Если эта опция true , опция headless будет установлена false .extraPrefsFirefox < Object > Дополнительные настройки, которые можно передать Firefox (см. PUPPETEER_PRODUCT )
Вы можете использовать ignoreDefaultArgs , чтобы отфильтровать –mute-audio из аргументов по умолчанию:
const browser = await puppeteer.launch({ ignoreDefaultArgs: ['--mute-audio'] });
ПРИМЕЧАНИЕ Puppeteer также можно использовать для управления браузером Chrome, но лучше всего он работает с версией Chromium, с которой он связан. Нет никаких гарантий, что он будет работать с любой другой версией. С особой осторожностью используйте параметрexecutablePath. Если предпочтение отдается Google Chrome (а не Chromium), рекомендуется сборка Chrome Canary или Dev Channel . В приведенном выше puppeteer.launch ([options]) любое упоминание Chromium также относится к Chrome. См. Вthis articleописание различий между Chromium и Chrome.This articleописаны некоторые отличия для пользователей Linux.
* возвращает: < Object >
Возвращает список сетевых условий, которые будут использоваться с page.emulateNetworkConditions(networkConditions) . Актуальный список условий можно найти в src/common/NetworkConditions.ts .
const puppeteer = require('puppeteer'); const slow3G = puppeteer.networkConditions['Slow 3G']; (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.emulateNetworkConditions(slow3G); await page.goto('https://www.google.com'); // другие действия... await browser.close(); })();
«chrome» или «firefox» )
Продукт устанавливается переменной среды PUPPETEER_PRODUCT или параметром product в puppeteer.launch ([options]) и по умолчанию используется chrome . Поддержка Firefox является экспериментальной и требует установки Puppeteer через PUPPETEER_PRODUCT=firefox npm i puppeteer .
name < string > Имя, под которым будет зарегистрирован пользовательский обработчик запросов.
Регистрирует пользовательский обработчик запросов . После регистрации обработчик можно использовать везде, где ожидается селектор, добавив перед строкой выбора <name>/ . Имя может состоять только из строчных и прописных латинских букв.
Example:
puppeteer.registerCustomQueryHandler('getByClass', { queryOne: (element, selector) => { return element.querySelector(`.${selector}`); }, queryAll: (element, selector) => { return element.querySelectorAll(`.${selector}`); }, }); const aHandle = await page.$('getByClass/…');
name < string > Имя обработчика запроса, регистрацию которого нужно отменить.BrowserFetcher может загружать и управлять различными версиями Chromium и Firefox.
BrowserFetcher работает со строками ревизий, которые указывают точную версию Chromium, например, «533271» . Строки редакции можно получить на сайте omahaproxy.appspot.com .
В случае с Firefox BrowserFetcher загружает Firefox Nightly и работает с такими номерами версий, как «75» .
Пример использования BrowserFetcher для загрузки определенной версии Chromium и запуска Кукловода против нее:
const browserFetcher = puppeteer.createBrowserFetcher(); const revisionInfo = await browserFetcher.download('533271'); const browser = await puppeteer.launch({executablePath: revisionInfo.executablePath})
ПРИМЕЧАНИЕ BrowserFetcher не предназначен для одновременной работы с другими экземплярами BrowserFetcher, которые используют тот же каталог загрузок.
revision < строка > ревизия для проверки доступности.Метод инициирует запрос HEAD для проверки доступности ревизии.
revision < строка > версия для загрузки.downloadedBytes < число > сколько байтов было загруженоtotalBytes < число > насколько велика общая загрузка.revision < строка > ревизия, из которой была создана информацияfolderPath < string > путь к извлеченной папке ревизииexecutablePath < строка > путь к исполняемому файлу редакцииurl < string > URL, с которого можно скачать эту версиюlocal < boolean >, доступна ли ревизия локально на дискеМетод инициирует GET-запрос на загрузку ревизии с хоста.
revision < строка > версия, для которой нужно получить информацию.revision < строка > ревизия, из которой была создана информацияfolderPath < string > путь к извлеченной папке ревизииexecutablePath < строка > путь к исполняемому файлу редакцииurl < string > URL, с которого можно скачать эту версиюlocal < boolean >, доступна ли ревизия локально на дискеПРИМЕЧАНИЕ. Многие методы BrowserFetcher, такие какremoveиrevisionInfo, зависят от выбораproduct. См. Puppeteer.createBrowserFetcher ([параметры]) .
Браузер создается, когда Puppeteer подключается к экземпляру Chromium через puppeteer.launch или puppeteer.connect .
Пример использования браузера для создания страницы :
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await browser.close(); })();
Пример отключения от браузера и повторного подключения к нему :
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); // Сохраняем конечную точку, чтобы иметь возможность повторно подключиться к Chromium const browserWSEndpoint = browser.wsEndpoint(); // Отключить кукловода от Chromium browser.disconnect(); // Использование конечной точки для восстановления соединения const browser2 = await puppeteer.connect({browserWSEndpoint}); // Закрываем Chromium await browser2.close(); })();
Используется,когда кукловод отключается от экземпляра Chromium.Это может произойти из-за одного из следующих моментов:
browser.disconnect метод был названИспускается,когда урна мишени меняется.
ПРИМЕЧАНИЕ. Это включает целевые изменения в контексте браузера в режиме инкогнито.
Испускается при создании цели, например, когда новая страница открывается с помощью window.open или browser.newPage .
ПРИМЕЧАНИЕ. Это включает создание целевых объектов в контексте браузера в режиме инкогнито.
Используется,когда цель уничтожена,например,при закрытии страницы.
ПРИМЕЧАНИЕ. Сюда входят целевые разрушения в контексте браузера в режиме инкогнито.
Возвращает массив всех открытых контекстов браузера. Во вновь созданном браузере это вернет единственный экземпляр BrowserContext .
Закрывает Chromium и все его страницы (если таковые были открыты). Сам объект Browser считается удаленным и больше не может использоваться.
Создает новый контекст браузера инкогнито.Это не будет совместно использовать куки/кэш с другими контекстами браузера.
(async () => { const browser = await puppeteer.launch(); // Создаем новый контекст браузера в режиме инкогнито. const context = await browser.createIncognitoBrowserContext(); // Создаем новую страницу в безупречном контексте. const page = await context.newPage(); // Делаем что-нибудь await page.goto('https://example.com'); })();
Возвращает контекст браузера по умолчанию.Контекст браузера по умолчанию не может быть закрыт.
Отключает Puppeteer от браузера, но оставляет процесс Chromium запущенным. После вызова disconnect , то браузер объект считается настроенным и не может больше использоваться.
Указывает на то,что браузер подключен.
Обещание, которое преобразуется в новый объект Page . Страница создана в контексте браузера по умолчанию.
«background_page» , здесь не отображаются. Вы можете найти их с помощью target.page () .Массив всех страниц внутри Браузера.В случае нескольких контекстов браузера,метод вернет массив со всеми страницами во всех контекстах браузера.
null , если экземпляр браузера был создан с помощью метода puppeteer.connect .Цель,связанная с браузером.
Массив всех активных целей внутри Браузера.В случае нескольких контекстов браузера,метод вернет массив со всеми целями во всех контекстах браузера.
ПРИМЕЧАНИЕ Pages могут переопределить пользовательский агент браузера с помощью page.setUserAgent.
ПРИМЕЧАНИЕ формат browser.version () может измениться в будущих выпусках Chromium.
options < Объект >timeout < число > Максимальное время ожидания в миллисекундах. Передайте 0 , чтобы отключить тайм-аут. По умолчанию 30 секунд.При этом осуществляется поиск цели во всех контекстах браузера.
Пример поиска цели для страницы, открытой через window.open :
await page.evaluate(() => window.open('https://www.example.com/')); const newWindowTarget = await browser.waitForTarget(target => target.url() === 'https://www.example.com/');
Конечная точка веб-сокета браузера, которую можно использовать в качестве аргумента для puppeteer.connect . Формат: ''ws: //${host}:${port}/devtools/browser/<id>''
Вы можете найти webSocketDebuggerUrl по ''http://${host}:${port}/json/version'' . Узнайте больше о протоколе devtools и конечной точке браузера .
BrowserContexts позволяют управлять несколькими независимыми сеансами браузера. Когда браузер запущен, по умолчанию используется один BrowserContext. Метод browser.newPage() создает страницу в контексте браузера по умолчанию.
Если страница открывает другую страницу, например, с помощью вызова window.open , всплывающее окно будет принадлежать контексту браузера родительской страницы.
Puppeteer позволяет создавать контексты браузера «инкогнито» с помощью метода browser.createIncognitoBrowserContext() . Контексты браузера «инкогнито» не записывают данные просмотра на диск.
// Создаем новый контекст браузера в режиме инкогнито const context = await browser.createIncognitoBrowserContext(); // Создаем новую страницу внутри контекста. const page = await context.newPage(); // ... что-то делать со страницей ... await page.goto('https://example.com'); // Удаляем контекст, когда он больше не нужен. await context.close();
Исполняется,когда изменяется url цели внутри контекста браузера.
Излучается, когда в контексте браузера создается новая цель, например, когда новая страница открывается с помощью window.open или browserContext.newPage .
Используется,когда цель внутри контекста браузера уничтожена,например,при закрытии страницы.
Браузер,к которому принадлежит этот контекст браузера.
Очищает все переопределения разрешений для контекста браузера.
const context = browser.defaultBrowserContext(); context.overridePermissions('https://example.com', ['clipboard-read']); // делаем что-нибудь .. context.clearPermissionOverrides();
Закрывает контекст браузера.Все цели,принадлежащие контексту браузера,будут закрыты.
ПРИМЕЧАНИЕ: закрывать можно только контексты браузера в режиме инкогнито.
Возвращает,является ли BrowserContext инкогнито.Контекст браузера по умолчанию является единственным контекстом браузера,не использующим инкогнито.
ПРИМЕЧАНИЕ: контекст браузера по умолчанию не может быть закрыт.
origin < string > Источник, которому нужно предоставить разрешения, например, « https://example.com ».permissions < Array < string » Массив предоставляемых разрешений. Все разрешения, не перечисленные здесь, будут автоматически отклонены. Разрешения могут быть одним из следующих значений:'geolocation''midi''midi-sysex' (системно-эксклюзивные midi)'notifications''push''camera''microphone''background-sync''ambient-light-sensor''accelerometer''gyroscope''magnetometer''accessibility-events''clipboard-read''clipboard-write''payment-handler'const context = browser.defaultBrowserContext(); await context.overridePermissions('https://html5demos.com', ['geolocation']);
«background_page» , здесь не отображаются. Вы можете найти их с помощью target.page () .Массив всех страниц в контексте браузера.
options < Объект >timeout < число > Максимальное время ожидания в миллисекундах. Передайте 0 , чтобы отключить тайм-аут. По умолчанию 30 секунд.При этом выполняется поиск цели в данном конкретном контексте браузера.
Пример поиска цели для страницы, открытой через window.open :
await page.evaluate(() => window.open('https://www.example.com/')); const newWindowTarget = await browserContext.waitForTarget(target => target.url() === 'https://www.example.com/');
Страница предоставляет методы для взаимодействия с одной вкладкой или фоновой страницей расширения в Chromium. Один экземпляр браузера может иметь несколько экземпляров страницы .
В этом примере создается страница,осуществляется навигация по URL,а затем сохраняется снимок экрана:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await page.screenshot({path: 'screenshot.png'}); await browser.close(); })();
Класс Page генерирует различные события (описанные ниже), которые можно обрабатывать с помощью любого из методов EventEmitter , например on , once или off .
В этом примере регистрируется сообщение для события load одной страницы :
page.once('load', () => console.log('Page loaded!'));
Чтобы отказаться от подписки на события, используйте метод off :
function logRequest(interceptedRequest) { console.log('A request was made:', interceptedRequest.url()); } page.on('request', logRequest); // Немного позже... page.off('request', logRequest);
Используется,когда страница закрывается.
Генерируется, когда JavaScript на странице вызывает один из методов консольного API, например console.log или console.dir . Также выдается, если страница выдает ошибку или предупреждение.
Аргументы, переданные в console.log , появляются как аргументы в обработчике событий.
Пример обработки console события:
page.on('console', msg => { for (let i = 0; i < msg.args().length; ++i) console.log(`${i}: ${msg.args()[i]}`); }); page.evaluate(() => console.log('hello', 5, {foo: 'bar'}));
Выдается при появлении диалогового окна JavaScript, например alert , prompt , confirm или beforeunload . Кукольник может ответить на диалог с помощью Диалог «s принять или отклонить методы.
Генерируется при DOMContentLoaded события JavaScript DOMContentLoaded .
Отправляется при сбое страницы.
ПРИМЕЧАНИЕ. Событиеerrorимеет особое значение в Node, подробности см. В разделе « События ошибок» .
Испускается,когда рама прикреплена.
Используется,когда рамка отсоединена.
Используется,когда рамка перемещается к новому урлу.
Генерируется при отправке события load JavaScript .
Генерируется, когда код JavaScript вызывает console.timeStamp . Список показателей см. На page.metrics .
Выписывается,когда на странице происходит незамеченное исключение.
Отменяется,когда страница открывает новую вкладку или окно.
const [popup] = await Promise.all([ new Promise(resolve => page.once('popup', resolve)), page.click('a[target=_blank]'), ]);
const [popup] = await Promise.all([ new Promise(resolve => page.once('popup', resolve)), page.evaluate(() => window.open('https://example.com')), ]);
Выдается, когда страница выдает запрос. Объект HTTPRequest доступен только для чтения. Чтобы перехватить и page.setRequestInterception запросы, см. Page.setRequestInterception .
Используется,когда запрос не удается,например,по таймингу.
ПРИМЕЧАНИЕ. Ответы HTTP Error, такие как 404 или 503, по-прежнему являются успешными ответами с точки зрения HTTP, поэтому запрос завершится с событием'requestfinished'а не с'requestfailed'.
Выпущено при успешном завершении запроса.
Выдается при получении HTTPResponse .
Выдается при завершении работы выделенного WebWorker .
Метод запускает document.querySelector на странице. Если ни один элемент не соответствует селектору, возвращаемое значение принимает значение null .
Ярлык для page.mainFrame (). $ (Селектор) .
Метод запускает document.querySelectorAll на странице. Если ни один элемент не соответствует селектору, возвращаемое значение преобразуется в [] .
Ярлык для page.mainFrame (). $$ (селектор) .
pageFunction
Этот метод запускает Array.from(document.querySelectorAll(selector)) на странице и передает его в качестве первого аргумента pageFunction .
Если pageFunction возвращает обещание , то page.$$eval будет ждать разрешения обещания и вернет его значение.
Examples:
const divCount = await page.$$eval('div', divs => divs.length);
const options = await page.$$eval('div > span.options', options => options.map(option => option.textContent));
pageFunction
Этот метод запускает document.querySelector на странице и передает его в качестве первого аргумента pageFunction . Если нет selector соответствия элемента , метод выдает ошибку.
Если pageFunction возвращает Promise , то page.$eval будет ждать разрешения обещания и вернет его значение.
Examples:
const searchValue = await page.$eval('#search', el => el.value); const preloadHref = await page.$eval('link[rel=preload]', el => el.href); const html = await page.$eval('.main-container', e => e.outerHTML);
Ярлык для page.mainFrame (). $ Eval (selector, pageFunction) .
Метод оценивает выражение XPath относительно документа страницы как контекстного узла.Если таких элементов нет,метод преобразуется в пустой массив.
Ярлык для page.mainFrame (). $ X (выражение)
options < Объект >url < строка > URL-адрес добавляемого скрипта.path < string > Путь к файлу JavaScript, который будет вставлен во фрейм. Если path является относительным путем, он разрешается относительно текущего рабочего каталога .content < string > Необработанный контент JavaScript для вставки во фрейм.
Добавляет <script> на страницу с желаемым URL-адресом или содержимым.
Ярлык для page.mainFrame (). AddScriptTag (параметры) .
options < Объект >path < string > Путь к файлу CSS, который будет вставлен во фрейм. Если path является относительным путем, он разрешается относительно текущего рабочего каталога .content < string > Необработанное содержимое CSS для вставки во фрейм.
Добавляет <link rel=«stylesheet»> на страницу с желаемым URL-адресом или <style type=«text/css»> с содержимым.
Ярлык для page.mainFrame (). AddStyleTag (параметры) .
Предоставьте учетные данные для аутентификации HTTP .
Чтобы отключить аутентификацию, передайте null .
Привязка страницы к началу (активирует вкладку).
Получите в браузере,к которому принадлежит страница.
Получить контекст браузера,к которому принадлежит страница.
options < Объект >button <«left» | «right» | «middle»> По умолчанию left .selector соответствия элемента . Обещание будет отклонено, если нет selector соответствия элемента .
Этот метод выбирает элемент с помощью selector , при необходимости прокручивает его, а затем использует page.mouse для щелчка в центре элемента. Если нет selector соответствия элемента , метод выдает ошибку.
Имейте в виду, что если click() запускает событие навигации и есть отдельное page.waitForNavigation() которое должно быть разрешено, вы можете получить состояние гонки, которое приведет к неожиданным результатам. Правильный шаблон для щелчка и ожидания навигации следующий:
const [response] = await Promise.all([ page.waitForNavigation(waitOptions), page.click(selector, clickOptions), ]);
Ярлык для page.mainFrame (). Click (селектор [, параметры]) .
По умолчанию page.close() не запускается перед обработчиками выгрузки.
ПРИМЕЧАНИЕ, еслиrunBeforeUnloadпередается как true, может быть вызван диалог передbeforeunloadкоторый должен обрабатываться вручную через событие страницы 'dialog' .
…urls <… строка >name < строка >value < строка >domain < строка >path < строка >expires < number > Unix-время в секундах.size < число >httpOnly < логическое >secure < логическое >session < логическое >sameSite <«Строгий» | «Слабый» | «Расширенный» | «Нет»>Если URL-адреса не указаны,этот метод возвращает куки-файлы для URL текущей страницы.Если URL-адреса указаны,возвращаются только cookie-файлы для этих URL-адресов.
options < Объект >viewport < Объект >width < число > ширина страницы в пикселях.height < число > высота страницы в пикселях.deviceScaleFactor < число > Определяет масштабный коэффициент устройства (можно рассматривать как dpr). По умолчанию 1 .hasTouch < boolean > Указывает, поддерживает ли область просмотра события касания. По умолчанию falseisLandscape < boolean > Указывает, находится ли область просмотра в альбомном режиме. По умолчанию - false .userAgent < строка >Эмулирует заданные метрики устройства и пользовательский агент.Этот метод является ярлыком для вызова двух методов:
Чтобы облегчить эмуляцию, кукольник предоставляет список дескрипторов устройства, который можно получить с помощью puppeteer.devices .
page.emulate изменит размер страницы. Многие веб-сайты не ожидают, что телефоны изменят размер, поэтому вам следует выполнить эмуляцию перед переходом на страницу.
const puppeteer = require('puppeteer'); const iPhone = puppeteer.devices['iPhone 6']; (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.emulate(iPhone); await page.goto('https://www.google.com'); // другие действия... await browser.close(); })();
Список всех доступных устройств доступен в исходном коде: src / common / DeviceDescriptors.ts .
overrides <? Объект > Если не задано, отменяет эмуляцию.isUserActive < логическое > требуетсяisScreenUnlocked < логическое > требуетсяawait page.emulateMediaFeatures([{ name: 'prefers-color-scheme', value: 'dark' }]); await page.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches); // → true await page.evaluate(() => matchMedia('(prefers-color-scheme: light)').matches); // → false await page.emulateMediaFeatures([{ name: 'prefers-reduced-motion', value: 'reduce' }]); await page.evaluate(() => matchMedia('(prefers-reduced-motion: reduce)').matches); // → true await page.evaluate(() => matchMedia('(prefers-reduced-motion: no-preference)').matches); // → false await page.emulateMediaFeatures([ { name: 'prefers-color-scheme', value: 'dark' }, { name: 'prefers-reduced-motion', value: 'reduce' }, ]); await page.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches); // → true await page.evaluate(() => matchMedia('(prefers-color-scheme: light)').matches); // → false await page.evaluate(() => matchMedia('(prefers-reduced-motion: reduce)').matches); // → true await page.evaluate(() => matchMedia('(prefers-reduced-motion: no-preference)').matches); // → false await page.emulateMediaFeatures([ { name: 'color-gamut', value: 'p3' }, ]); await page.evaluate(() => matchMedia('(color-gamut: srgb)').matches); // → true await page.evaluate(() => matchMedia('(color-gamut: p3)').matches); // → true await page.evaluate(() => matchMedia('(color-gamut: rec2020)').matches); // → false
type <? строка > Изменяет медиа-тип CSS страницы. Единственные допустимые значения - 'screen' , 'print' и null . Передача null отключает эмуляцию мультимедиа CSS.await page.evaluate(() => matchMedia('screen').matches); // → true await page.evaluate(() => matchMedia('print').matches); // → false await page.emulateMediaType('print'); await page.evaluate(() => matchMedia('screen').matches); // → false await page.evaluate(() => matchMedia('print').matches); // → true await page.emulateMediaType(null); await page.evaluate(() => matchMedia('screen').matches); // → true await page.evaluate(() => matchMedia('print').matches); // → false
ПРИМЕЧАНИЕ. Это не влияет на WebSockets и WebRTC PeerConnections (см. Https://crbug.com/563644 ).
const puppeteer = require('puppeteer'); const slow3G = puppeteer.networkConditions['Slow 3G']; (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.emulateNetworkConditions(slow3G); await page.goto('https://www.google.com'); // другие действия... await browser.close(); })();
timezoneId <? строка > Изменяет часовой пояс страницы. Список поддерживаемых идентификаторов часовых metaZones.txt см. В файле metaZones.txt ICU . Передача null отключает эмуляцию часового пояса.type <? string > Имитирует данный недостаток зрения на странице. Поддерживаемые типы дефицита зрения: 'achromatopsia' , 'deuteranopia' , 'protanopia' , 'tritanopia' , 'blurredVision' и 'none' .const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://v8.dev/blog/10-years'); await page.emulateVisionDeficiency('achromatopsia'); await page.screenshot({ path: 'achromatopsia.png' }); await page.emulateVisionDeficiency('deuteranopia'); await page.screenshot({ path: 'deuteranopia.png' }); await page.emulateVisionDeficiency('blurredVision'); await page.screenshot({ path: 'blurred-vision.png' }); await browser.close(); })();
pageFunction
Если функция, переданная page.evaluate , возвращает обещание , то page.evaluate будет ждать разрешения обещания и вернет свое значение.
Если функция передается page.evaluate возвращает значение не Serializable значения, то page.evaluate ПОСТАНОВЛЯЕТ undefined . Протокол DevTools также поддерживает передачу некоторых дополнительных значений, не сериализуемых с помощью JSON : -0 , NaN , Infinity , -Infinity и литералы bigint.
Передача аргументов в pageFunction :
const result = await page.evaluate(x => { return Promise.resolve(8 * x); }, 7); console.log(result); // выводит "56"
Также вместо функции может быть передана строка:
console.log(await page.evaluate('1 + 2')); // выводит "3" const x = 10; console.log(await page.evaluate(`1 + ${x}`)); // выводит "11"
Экземпляры ElementHandle могут быть переданы в качестве аргументов page.evaluate :
const bodyHandle = await page.$('body'); const html = await page.evaluate(body => body.innerHTML, bodyHandle); await bodyHandle.dispose();
Ярлык для page.mainFrame (). Оценить (pageFunction, ... args) .
pageFunction в возвращаемое значение pageFunction как внутристраничный объект.
Единственная разница между page.evaluate и page.evaluateHandle заключается в том, что page.evaluateHandle возвращает объект на странице (JSHandle).
Если функция, переданная в page.evaluateHandle , возвращает Promise , то page.evaluateHandle будет ждать, пока обещание разрешится, и вернет свое значение.
Также вместо функции может быть передана строка:
const aHandle = await page.evaluateHandle('document'); // Дескриптор документа
Экземпляры JSHandle могут быть переданы в качестве аргументов page.evaluateHandle :
const aHandle = await page.evaluateHandle(() => document.body); const resultHandle = await page.evaluateHandle(body => body.innerHTML, aHandle); console.log(await resultHandle.jsonValue()); await resultHandle.dispose();
Эта функция по умолчанию возвращает JSHandle , однако, если ваша pageFunction возвращает HTML-элемент, вы получите ElementHandle :
const button = await page.evaluateHandle(() => document.querySelector('button')) // кнопка - это ElementHandle, поэтому вы можете вызывать такие методы, как click: await button.click();
Ярлык для page.mainFrame (). ExecuteContext (). AssessmentHandle (pageFunction, ... args) .
Добавляет функцию,которая будет вызвана в одном из следующих сценариев:
Функция вызывается после создания документа, но до запуска любого из его сценариев. Это полезно для внесения изменений в среду JavaScript, например, для Math.random .
Пример переопределения свойства navigator.languages перед загрузкой страницы:
// preload.js // перезаписываем свойство `languages` для использования специального получателя Object.defineProperty(navigator, "languages", { get: function() { return ["en-US", "en", "bn"]; } }); // В вашем скрипте кукловода предполагается, что файл preload.js находится в той же папке, что и наш скрипт const preloadFile = fs.readFileSync('./preload.js', 'utf8'); await page.evaluateOnNewDocument(preloadFile);
name < string > Имя функции в объекте окнаpuppeteerFunction < функция > Функция обратного вызова, которая будет вызываться в контексте Puppeteer.
Метод добавляет функцию с именем name в объект window страницы . При вызове функция выполняет puppeteerFunction в node.js и возвращает Promise, которое преобразуется в возвращаемое значение puppeteerFunction .
Если puppeteerFunction возвращает обещание , оно будет ожидаться.
ПРИМЕЧАНИЕ Функции, установленные черезpage.exposeFunction, остаются в силе при навигации.
Пример добавления функции md5 на страницу:
const puppeteer = require('puppeteer'); const crypto = require('crypto'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); page.on('console', msg => console.log(msg.text())); await page.exposeFunction('md5', text => crypto.createHash('md5').update(text).digest('hex') ); await page.evaluate(async () => { // используем window.md5 для вычисления хэшей const myString = 'PUPPETEER'; const myHash = await window.md5(myString); console.log(`md5 of ${myString} is ${myHash}`); }); await browser.close(); })();
Пример добавления на window.readfile функции window.readfile :
const puppeteer = require('puppeteer'); const fs = require('fs'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); page.on('console', msg => console.log(msg.text())); await page.exposeFunction('readfile', async filePath => { return new Promise((resolve, reject) => { fs.readFile(filePath, 'utf8', (err, text) => { if (err) reject(err); else resolve(text); }); }); }); await page.evaluate(async () => { // используем window.readfile для чтения содержимого файла const content = await window.readfile('/etc/hosts'); console.log(content); }); await browser.close(); })();
selector сопоставления элементов успешно сфокусирован. Обещание будет отклонено, если нет selector соответствия элементов .
Этот метод выбирает элемент с помощью selector и фокусирует его. Если нет selector соответствия элемента , метод выдает ошибку.
Ярлык для page.mainFrame (). Focus (селектор) .
options < Object > Параметры навигации, которые могут иметь следующие свойства:timeout < число > Максимальное время навигации в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Если считать, что навигация прошла успешно, по умолчанию используется load . Учитывая массив строк событий, навигация считается успешной после того, как все события были запущены. События могут быть:load - считайте, что навигация завершена, когда запускается событие load .domcontentloaded - считается, что навигация завершена, когда DOMContentLoaded событие DOMContentLoaded .networkidle0 - считать, что навигация завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что навигация завершена, если не более 2 сетевых подключений в течение не менее 500 мс.null .Перейдите на предыдущую страницу в истории.
options < Object > Параметры навигации, которые могут иметь следующие свойства:timeout < число > Максимальное время навигации в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Если считать, что навигация прошла успешно, по умолчанию используется load . Учитывая массив строк событий, навигация считается успешной после того, как все события были запущены. События могут быть:load - считайте, что навигация завершена, когда запускается событие load .domcontentloaded - считается, что навигация завершена, когда DOMContentLoaded событие DOMContentLoaded .networkidle0 - считать, что навигация завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что навигация завершена, если не более 2 сетевых подключений в течение не менее 500 мс.null .Перейдите на следующую страницу истории.
url < строка > URL для перехода на страницу. URL-адрес должен включать схему, например ''https://'' .options < Object > Параметры навигации, которые могут иметь следующие свойства:timeout < число > Максимальное время навигации в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Если считать, что навигация прошла успешно, по умолчанию используется load . Учитывая массив строк событий, навигация считается успешной после того, как все события были запущены. События могут быть:load - считайте, что навигация завершена, когда запускается событие load .domcontentloaded - считается, что навигация завершена, когда DOMContentLoaded событие DOMContentLoaded .networkidle0 - считать, что навигация завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что навигация завершена, если не более 2 сетевых подключений в течение не менее 500 мс.
page.goto выдаст ошибку, если:
timeout превышено во время навигации.
page.goto не выдаст ошибку, если удаленный сервер вернет любой допустимый код состояния HTTP, включая 404 «Не найдено» и 500 «Внутренняя ошибка сервера». Код состояния для таких ответов можно получить, вызвав response.status () .
ПРИМЕЧАНИЕpage.gotoлибо выдает ошибку, либо возвращает ответ основного ресурса. Единственными исключениями являются переход кabout:blankили переход к тому же URL-адресу с другим хешем, который завершится успешно и вернетnull.
ПРИМЕЧАНИЕ. Режим «Без заголовка» не поддерживает переход к документу PDF. См. Проблему с восходящим потоком .
Ярлык для page.mainFrame (). Goto (URL, параметры)
selector соответствия элемента успешно зависает. Обещание отклоняется, если нет selector соответствия элементов .
Этот метод выбирает элемент с помощью selector , при необходимости прокручивает его, а затем использует page.mouse для наведения курсора на центр элемента. Если нет selector соответствия элемента , метод выдает ошибку.
Ярлык для page.mainFrame (). Hover (селектор) .
Показывает,что страница закрыта.
Возвращает true , если на странице включен JavaScript, иначе false .
Страница гарантированно имеет основную рамку,которая сохраняется во время навигации.
Timestamp < number > Отметка времени, когда была взята выборка показателей.Documents < количество > Количество документов на странице.Frames < number > Количество кадров на странице.JSEventListeners < число > Количество событий на странице.Nodes < число > Число узлов DOM на странице.LayoutCount < число > Общее количество полных или частичных макетов страницы.RecalcStyleCount < число > Общее количество перерасчетов стилей страницы.LayoutDuration < число > Общая продолжительность всех макетов страницы.RecalcStyleDuration < число > Общая длительность всех пересчетов стилей страницы.ScriptDuration < число > Общая продолжительность выполнения JavaScript.TaskDuration < число > Суммарная продолжительность всех задач, выполняемых браузером.JSHeapUsedSize < number > Используемый размер кучи JavaScript.JSHeapTotalSize < число > Общий размер кучи JavaScript.ПРИМЕЧАНИЕ Все временные метки имеют монотонное время: монотонно увеличивающееся время в секундах с произвольной точки в прошлом.
options < Object > Объект параметров, который может иметь следующие свойства:path < string > Путь к файлу для сохранения PDF-файла. Если path является относительным путем, он разрешается относительно текущего рабочего каталога . Если путь не указан, PDF-файл не будет сохранен на диск.scale < число > Масштаб отрисовки веб-страницы. По умолчанию 1 . Значение шкалы должно быть от 0,1 до 2.headerTemplate < строка > HTML-шаблон для заголовка печати. Должна быть допустимая разметка HTML со следующими классами, используемыми для вставки в них значений печати:date печати датаtitle документаurl документаpageNumber номер текущей страницыtotalPages общее количество страниц в документеfooterTemplate < строка > HTML-шаблон для нижнего колонтитула печати. Следует использовать тот же формат, что и headerTemplate .pageRanges < string > Диапазон бумаги для печати, например, «1-5, 8, 11-13». По умолчанию используется пустая строка, что означает печать всех страниц.format < строка > Формат бумаги. Если установлено, имеет приоритет над параметрами width или height . По умолчанию «Письмо».margin < Object > Поля бумаги, по умолчанию нет.preferCSSPageSize < boolean > Присвойте любому размеру CSS @page , объявленному в приоритете страницы, над тем, что объявлено в параметрах width и height или format . По умолчанию установлено значение false , при котором содержимое масштабируется в соответствии с размером бумаги.ПРИМЕЧАНИЕ. В настоящее время создание PDF-файлов поддерживается только в Chrome Headless.
page.pdf() генерирует PDF-файл страницы с print носителем css. Чтобы создать PDF-файл с screen носителем, вызовите page.emulateMediaType ('screen') перед вызовом page.pdf() :
ПРИМЕЧАНИЕ По умолчаниюpage.pdf()создает PDF-файл с измененными цветами для печати. Используйте-webkit-print-color-adjustдля принудительной визуализации точных цветов.
// Generates a PDF with 'screen' media type. await page.emulateMediaType('screen'); await page.pdf({path: 'page.pdf'});
Параметры width , height и margin принимают значения, помеченные единицами измерения. Значения без меток обрабатываются как пиксели.
Несколько примеров:
page.pdf({width: 100}) - печатает с шириной 100 пикселей.page.pdf({width: '100px'}) - печатает с шириной 100 пикселейpage.pdf({width: '10cm'}) - печать шириной 10 сантиметров.Все возможные единицы:
px - пиксельin - дюймcm - сантиметрmm - миллиметр
В format опции:
Letter : 8,5 x 11 дюймовLegal : 8,5 x 14 дюймовTabloid : 11 дюймов x 17 дюймовLedger : 17in х 11inA0 : 33,1 x 46,8 дюймаA1 : 23,4 дюйма x 33,1 дюймаA2 : 16,54 x 23,4 дюймаA3 : 11,7 x 16,54 дюймаA4 : 8,27 x 11,7 дюймаA5 : 5,83 x 8,27 дюймаA6 : 4,13 дюйма x 5,83 дюймаПРИМЕЧАНИЕ.headerTemplateиfooterTemplateимеет следующие ограничения: Теги сценариев внутри шаблонов не оцениваются. Стили страниц не видны внутри шаблонов.
prototypeHandle < JSHandle > Дескриптор прототипа объекта.Метод итерирует кучу JavaScript и находит все объекты с данным прототипом.
// Создаем объект Map await page.evaluate(() => window.map = new Map()); // Получаем дескриптор прототипа объекта Map const mapPrototype = await page.evaluateHandle(() => Map.prototype); // Запрос всех экземпляров карты в массив const mapInstances = await page.queryObjects(mapPrototype); // Подсчитываем количество объектов карты в куче const count = await page.evaluate(maps => maps.length, mapInstances); await mapInstances.dispose(); await mapPrototype.dispose();
Ярлык для page.mainFrame (). ExecuteContext (). QueryObjects (prototypeHandle) .
options < Object > Параметры навигации, которые могут иметь следующие свойства:timeout < число > Максимальное время навигации в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Если считать, что навигация прошла успешно, по умолчанию используется load . Учитывая массив строк событий, навигация считается успешной после того, как все события были запущены. События могут быть:load - считайте, что навигация завершена, когда запускается событие load .domcontentloaded - считается, что навигация завершена, когда DOMContentLoaded событие DOMContentLoaded .networkidle0 - считать, что навигация завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что навигация завершена, если не более 2 сетевых подключений в течение не менее 500 мс.options < Object > Объект параметров, который может иметь следующие свойства:path < string > Путь к файлу для сохранения изображения. Тип скриншота определяется расширением файла. Если path является относительным путем, он разрешается относительно текущего рабочего каталога . Если путь не указан, изображение не будет сохранено на диск.fullPage < boolean > Если установлено значение true, делает снимок экрана с полной прокручиваемой страницей. По умолчанию - false .clip < Object > Объект, определяющий область обрезки страницы. Должны быть следующие поля:omitBackground < boolean > Скрывает белый фон по умолчанию и позволяет делать снимки экрана с прозрачностью. По умолчанию - false .ПРИМЕЧАНИЕ. Снимки экрана в OS X занимают не менее 1/6 секунды. См. Обсуждение на https://crbug.com/741689 .
…values <… строка > Значения параметров для выбора. Если <select> имеет атрибут multiple , учитываются все значения, в противном случае учитывается только первое.
Запускает событие change и input после выбора всех предоставленных параметров. Если нет selector соответствия элемента <select> , метод выдает ошибку.
page.select('select#colors', 'blue'); // одиночный выбор page.select('select#colors', 'red', 'green', 'blue'); // множественный выбор
Ярлык для page.mainFrame (). Select ()
Переключатели,минуя Контент-Политика Безопасности-Содержание страницы.
ПРИМЕЧАНИЕ. Обход CSP происходит в момент инициализации CSP, а не при оценке. Обычно это означает, чтоpage.setBypassCSPследует вызывать перед переходом в домен.
Переключает игнорирование кэша для каждого запроса в зависимости от включенного состояния.По умолчанию кэширование включено.
html < строка > HTML-разметка для назначения странице.options < Object > Параметры, которые могут иметь следующие свойства:timeout < число > Максимальное время в миллисекундах для загрузки ресурсов, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Когда считать, что установка разметки прошла успешно, по умолчанию используется load . Учитывая массив строк событий, настройка содержимого считается успешной после того, как все события были запущены. События могут быть:load - рассмотрите возможность завершения настройки содержимого при срабатывании события load .domcontentloaded - рассмотрите возможность завершения настройки содержимого при DOMContentLoaded события DOMContentLoaded .networkidle0 - считайте, что настройка содержимого завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что настройка содержимого завершена, если не более 2 сетевых подключений в течение не менее 500 мс.…cookies <… Объект >name < строка > обязательноvalue < строка > требуетсяurl < строка >domain < строка >path < строка >expires < number > Unix-время в секундах.httpOnly < логическое >secure < логическое >sameSite <«Строгий» | «Слабый»>await page.setCookie(cookieObject1, cookieObject2);
timeout < число > Максимальное время навигации в миллисекундахЭта настройка изменит максимальное время навигации по умолчанию для следующих методов и связанных с ними ярлыков:
ПРИМЕЧАНИЕpage.setDefaultNavigationTimeoutимеет приоритет надpage.setDefaultTimeout
timeout < число > Максимальное время в миллисекундахЭта настройка изменит максимальное время по умолчанию для следующих методов и связанных с ними ярлыков:
ПРИМЕЧАНИЕpage.setDefaultNavigationTimeoutимеет приоритет надpage.setDefaultTimeout
headers < Object > Объект, содержащий дополнительные заголовки HTTP, отправляемые с каждым запросом. Все значения заголовка должны быть строками.Дополнительные HTTP-заголовки будут отправляться с каждым запросом,который инициирует страница.
ПРИМЕЧАНИЕ page.setExtraHTTPHeaders не гарантирует порядок заголовков в исходящих запросах.
options <GeolocationOptions>Устанавливает геолокацию страницы.
await page.setGeolocation({latitude: 59.95, longitude: 30.31667});
ПРИМЕЧАНИЕ. Рассмотрите возможность использования browserContext.overridePermissions, чтобы предоставить странице разрешения на чтение ее геолокации.
ПРИМЕЧАНИЕ. Изменение этого значения не повлияет на уже запущенные сценарии. Он вступит в силу при следующей навигации .
Активация перехвата запросов включает методы request.abort , request.continue и request.respond . Это дает возможность изменять сетевые запросы, которые делает страница.
После включения перехвата запросов каждый запрос будет останавливаться, если он не будет продолжен, не получен или прерван. Пример наивного перехватчика запросов, который прерывает все запросы изображений:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setRequestInterception(true); page.on('request', interceptedRequest => { if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg')) interceptedRequest.abort(); else interceptedRequest.continue(); }); await page.goto('https://example.com'); await browser.close(); })();
ПРИМЕЧАНИЕ Включение перехвата запросов отключает кеширование страниц.
viewport < Объект >width < число > ширина страницы в пикселях. обязательныйheight < число > высота страницы в пикселях. обязательныйdeviceScaleFactor < число > Определяет масштабный коэффициент устройства (можно рассматривать как dpr). По умолчанию 1 .hasTouch < boolean > Указывает, поддерживает ли область просмотра события касания. По умолчанию falseisLandscape < boolean > Указывает, находится ли область просмотра в альбомном режиме. По умолчанию - false .ПРИМЕЧАНИЕ: в некоторых случаях при настройке области просмотра страница перезагружается для установки свойствisMobileилиhasTouch.
В случае наличия нескольких страниц в одном браузере,каждая страница может иметь свой собственный размер вью-порта.
page.setViewport изменит размер страницы. Многие веб-сайты не ожидают, что телефоны изменят размер, поэтому вам следует установить область просмотра перед переходом на страницу.
const page = await browser.newPage(); await page.setViewport({ width: 640, height: 480, deviceScaleFactor: 1, }); await page.goto('https://example.com');
Этот метод выбирает элемент с помощью selector , при необходимости прокручивает его, а затем использует page.touchscreen для нажатия в центре элемента. Если нет selector соответствия элемента , метод выдает ошибку.
Ярлык для page.mainFrame (). Tap (селектор) .
Ярлык для page.mainFrame (). Title () .
text < string > Текст для ввода в выбранный элемент.options < Объект >delay < число > Время ожидания между нажатиями клавиш в миллисекундах. По умолчанию 0.
Посылает keydown , keypress / input и keyup событие для каждого символа в тексте.
Чтобы нажать специальную клавишу, например Control или ArrowDown , используйте keyboard.press .
await page.type('#mytextarea', 'Hello'); // Мгновенно набирает await page.type('#mytextarea', 'World', {delay: 100}); // Набирает медленнее, как пользователь
Ярлык для page.mainFrame (). Type (селектор, текст [, параметры]) .
Это ярлык для page.mainFrame (). Url ()
width < число > ширина страницы в пикселях.height < число > высота страницы в пикселях.deviceScaleFactor < число > Укажите масштабный коэффициент устройства (может быть как dpr). По умолчанию 1 .hasTouch < boolean > Указывает, поддерживает ли область просмотра события касания. По умолчанию falseisLandscape < boolean > Указывает, находится ли область просмотра в альбомном режиме. По умолчанию - false .options < Object > Необязательные параметры ожиданияtimeout < число > максимальное время ожидания в миллисекундах. По умолчанию 30000 (30 секунд). Передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .hidden < boolean > ждать, пока элемент не будет найден в DOM или будет скрыт. По умолчанию - false .polling < строка | число > Интервал, с которым выполняется pageFunction , по умолчанию raf . Если polling является числом, то он рассматривается как интервал в миллисекундах, с которым функция будет выполняться. Если polling представляет собой строку, это может быть одно из следующих значений:raf - постоянно выполнять pageFunction в обратном вызове requestAnimationFrame . Это самый жесткий режим опроса, который подходит для наблюдения за изменениями стиля.mutation - для выполнения pageFunction при каждой мутации DOM.Этот метод устарел . Вам следует использовать более явные доступные методы API:
page.waitForSelectorpage.waitForXPathpage.waitForFunctionpage.waitForTimeoutЭтот метод ведет себя по-разному по отношению к типу первого параметра:
selectorOrFunctionOrTimeout является string , то первый аргумент обрабатывается как селектор или xpath , в зависимости от того, начинается ли он с '//', а метод является ярлыком для page.waitForSelector или page.waitForXPathselectorOrFunctionOrTimeout - function , то первый аргумент рассматривается как ожидаемый предикат, а метод - это ярлык для page.waitForFunction () .selectorOrFunctionOrTimeout - это number , то первый аргумент обрабатывается как тайм-аут в миллисекундах, и метод возвращает обещание, которое разрешается по истечении тайм-аута.// ждем селектора await page.waitFor('.foo'); // ждем 1 секунду await page.waitFor(1000); // ждем предиката await page.waitFor(() => !!document.querySelector('.foo'));
Чтобы передать аргументы из node.js в предикат функции page.waitFor :
const selector = '.foo'; await page.waitFor(selector => !!document.querySelector(selector), {}, selector);
Ярлык для page.mainFrame (). WaitFor (selectorOrFunctionOrTimeout [, options [, ... args)]] .
options < WaitTimeoutOptions > Необязательные параметры ожиданияПРИМЕЧАНИЕ. В Chromium без головы этот метод приводит к тому, что диалоговое окно выбора файлов не отображается для пользователя.
Этот метод обычно сочетается с действием, запускающим выбор файла. В следующем примере щелкается кнопка, которая /tmp/myfile.pdf средство выбора файла , а затем отвечает /tmp/myfile.pdf, как если бы пользователь выбрал этот файл.
const [fileChooser] = await Promise.all([ page.waitForFileChooser(), page.click('#upload-file-button'), // какая-то кнопка, запускающая выбор файла ]); await fileChooser.accept(['/tmp/myfile.pdf']);
Примечание Это должно быть названо , прежде чем файл Chooser запускается. Он не вернет активный в данный момент выбор файла.
options < Object > Необязательные параметры ожиданияpolling < строка | число > Интервал, с которым выполняется pageFunction , по умолчанию raf . Если polling является числом, то он рассматривается как интервал в миллисекундах, с которым функция будет выполняться. Если polling представляет собой строку, это может быть одно из следующих значений:raf - постоянно выполнять pageFunction в обратном вызове requestAnimationFrame . Это самый жесткий режим опроса, который подходит для наблюдения за изменениями стиля.mutation - для выполнения pageFunction при каждой мутации DOM.timeout < число > максимальное время ожидания в миллисекундах. По умолчанию 30000 (30 секунд). Передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .
Функция waitForFunction может использоваться для наблюдения за изменением размера области просмотра:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); const watchDog = page.waitForFunction('window.innerWidth < 100'); await page.setViewport({width: 50, height: 50}); await watchDog; await browser.close(); })();
Чтобы передать аргументы из node.js в предикат функции page.waitForFunction :
const selector = '.foo'; await page.waitForFunction(selector => !!document.querySelector(selector), {}, selector);
Предикат page.waitForFunction также может быть асинхронным:
const username = 'github-username'; await page.waitForFunction(async username => { const githubResponse = await fetch(`https://api.github.com/users/${username}`); const githubUser = await githubResponse.json(); // показать аватар const img = document.createElement('img'); img.src = githubUser.avatar_url; // ждем 3 секунды await new Promise((resolve, reject) => setTimeout(resolve, 3000)); img.remove(); }, {}, username);
Ярлык для page.mainFrame (). WaitForFunction (pageFunction [, options [, ... args)]] .
options < Object > Параметры навигации, которые могут иметь следующие свойства:timeout < число > Максимальное время навигации в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Если считать, что навигация прошла успешно, по умолчанию используется load . Учитывая массив строк событий, навигация считается успешной после того, как все события были запущены. События могут быть:load - считайте, что навигация завершена, когда запускается событие load .domcontentloaded - считается, что навигация завершена, когда DOMContentLoaded событие DOMContentLoaded .networkidle0 - считать, что навигация завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что навигация завершена, если не более 2 сетевых подключений в течение не менее 500 мс.null .Это разрешается,когда страница переходит на новый URL или перезагружается.Это полезно,когда вы запускаете код,который косвенно вызывает навигацию по странице.Рассмотрим этот пример:
const [response] = await Promise.all([ page.waitForNavigation(), // Обещание разрешается после завершения навигации page.click('a.my-link'), // Нажатие на ссылку косвенно вызовет навигацию ]);
ПРИМЕЧАНИЕ. Использование History API для изменения URL-адреса считается навигацией.
Ярлык для page.mainFrame (). WaitForNavigation (параметры) .
options < Object > Необязательные параметры ожиданияtimeout < число > Максимальное время ожидания в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .const firstRequest = await page.waitForRequest('http://example.com/resource'); const finalRequest = await page.waitForRequest(request => request.url() === 'http://example.com' && request.method() === 'GET'); return firstRequest.url();
options < Object > Необязательные параметры ожиданияtimeout < число > Максимальное время ожидания в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .const firstResponse = await page.waitForResponse('https://example.com/resource'); const finalResponse = await page.waitForResponse(response => response.url() === 'https://example.com' && response.status() === 200); const finalResponse = await page.waitForResponse(async response => { return (await response.text()).includes('<html>') }) return finalResponse.ok();
options < Object > Необязательные параметры ожиданияvisible < boolean > ожидает, пока элемент будет присутствовать в DOM и станет видимым, то есть не будет иметь свойств CSS display: none или visibility: hidden . По умолчанию - false .hidden < boolean > подождите, пока элемент не будет найден в DOM или будет скрыт, т.е. будет иметь свойства CSS display: none или visibility: hidden . По умолчанию - false .timeout < число > максимальное время ожидания в миллисекундах. По умолчанию 30000 (30 секунд). Передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .null , если ожидание hidden: true и селектор не найден в DOM.
Подождите, пока на странице появится selector . Если на момент вызова метода selector уже существует, метод немедленно вернется. Если селектор не появляется после истечения времени timeout миллисекундах, функция сгенерирует.
Этот метод работает во всех навигациях:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); let currentURL; page .waitForSelector('img') .then(() => console.log('First URL with image: ' + currentURL)); for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) { await page.goto(currentURL); } await browser.close(); })();
Ярлык для page.mainFrame (). WaitForSelector (селектор [, параметры]) .
milliseconds < число > Количество миллисекунд ожидания.Приостанавливает выполнение сценария на заданное количество миллисекунд перед продолжением:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); page.waitForTimeout(1000) .then(() => console.log('Waited a second!')); await browser.close(); })();
options < Object > Необязательные параметры ожиданияvisible < boolean > ожидает, пока элемент будет присутствовать в DOM и станет видимым, то есть не будет иметь свойств CSS display: none или visibility: hidden . По умолчанию - false .hidden < boolean > подождите, пока элемент не будет найден в DOM или будет скрыт, т.е. будет иметь свойства CSS display: none или visibility: hidden . По умолчанию - false .timeout < число > максимальное время ожидания в миллисекундах. По умолчанию 30000 (30 секунд). Передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .null , если ожидает hidden: true и xpath не найден в DOM.
Подождите, пока xpath не появится на странице. Если на момент вызова метода xpath уже существует, метод немедленно вернется. Если xpath не появляется после истечения времени timeout миллисекундах, функция сгенерирует.
Этот метод работает во всех навигациях:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); let currentURL; page .waitForXPath('//img') .then(() => console.log('First URL with image: ' + currentURL)); for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) { await page.goto(currentURL); } await browser.close(); })();
Ярлык для page.mainFrame (). WaitForXPath (xpath [, параметры]) .
ПРИМЕЧАНИЕ. Не содержит ServiceWorkers.
timeout < число > Максимальное время ожидания в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .
Класс WebWorker представляет WebWorker . События workercreated и workerdestroyed генерируются на объекте страницы, чтобы сигнализировать о жизненном цикле worker.
page.on('workercreated', worker => console.log('Worker created: ' + worker.url())); page.on('workerdestroyed', worker => console.log('Worker destroyed: ' + worker.url())); console.log('Current workers:'); for (const worker of page.workers()) console.log(' ' + worker.url());
pageFunction
Если функция, переданная в worker.evaluate , возвращает Promise , то worker.evaluate будет ждать, пока обещание разрешится, и вернет свое значение.
Если функция передается worker.evaluate возвращает значение не Serializable значения, то worker.evaluate ПОСТАНОВЛЯЕТ undefined . Протокол DevTools также поддерживает передачу некоторых дополнительных значений, не сериализуемых с помощью JSON : -0 , NaN , Infinity , -Infinity и литералы bigint.
Ярлык для (await worker.executionContext ()). Assessment (pageFunction, ... args) .
pageFunction в возвращаемое значение pageFunction как внутристраничный объект.
Единственная разница между worker.evaluate и worker.evaluateHandle заключается в том, что worker.evaluateHandle возвращает объект на странице (JSHandle).
Если функция, переданная в worker.evaluateHandle , возвращает обещание , то worker.evaluateHandle будет ждать разрешения обещания и вернет его значение.
Если функция возвращает элемент, возвращаемый дескриптор - ElementHandle .
Ярлык для (await worker.executionContext ()). AssessmentHandle (pageFunction, ... args) .
Класс доступности предоставляет методы для проверки дерева доступности Chromium. Дерево специальных возможностей используется вспомогательными технологиями, такими как программы чтения с экрана или переключатели .
Доступность-это очень специфическая для платформы вещь.На разных платформах есть разные скринридеры,которые могут иметь дико разный вывод.
Blink-движок рендеринга Chrome-имеет концепцию «дерева доступности»,которая затем преобразуется в различные API,специфичные для конкретной платформы.Пространство имен Accessibility предоставляет пользователям доступ к дереву доступности Blink.
Большая часть дерева доступности отфильтровывается при преобразовании из Blink AX Tree в AX-Tree для конкретной платформы или с помощью вспомогательных технологий.По умолчанию кукловод пытается аппроксимировать эту фильтрацию,выставляя только «интересные» узлы дерева.
options < Объект >root < ElementHandle > Корневой элемент DOM для моментального снимка. По умолчанию для всей страницы.name < строка > Имя узла, читаемое человеком.description < строка > Дополнительное удобочитаемое описание узла.keyshortcuts < string > Сочетания клавиш, связанные с этим узлом.roledescription < строка > Удобочитаемая альтернатива роли.valuetext < строка > Описание текущего значения.disabled < boolean > Отключен ли узел.expanded < логический > Развернут или свернут узел.focused < boolean > Указывает, находится ли узел в фокусе.multiline < boolean > Поддерживает ли ввод текста узла многострочность.multiselectable < boolean > Можно ли выбрать более одного дочернего элемента .readonly < boolean > Доступен ли узел только для чтения.required < boolean > Требуется ли узел.selected < boolean > Выбран ли узел в его родительском узле.checked < boolean | «смешанный»> Независимо от того, установлен ли флажок, или «смешанный».pressed < логическое | «смешанное»> Независимо от того, отмечен ли переключатель, или «смешанный».level < число > Уровень заголовка.valuemin < число > Минимальное значение в узле.valuemax < число > Максимальное значение в узле.autocomplete < string > Какой вид автозаполнения поддерживает элемент управления.haspopup < string > Какого рода всплывающее окно отображается в данный момент для узла.invalid < string > Является ли значение этого узла недопустимым и каким образом.orientation < строка > Ориентирован ли узел горизонтально или вертикально.Запечатлевает текущее состояние дерева доступности.Возвращаемый объект представляет собой корневой доступный узел страницы.
ПРИМЕЧАНИЕ . Дерево доступности Chromium содержит узлы, которые не используются на большинстве платформ и большинством программ чтения с экрана. Кукловод также отбрасывает их, чтобы упростить обработку дерева, если для параметраinterestingOnlyустановлено значениеfalse.
Пример сброса всего дерева доступности:
const snapshot = await page.accessibility.snapshot(); console.log(snapshot);
Пример регистрации имени сфокусированного узла:
const snapshot = await page.accessibility.snapshot(); const node = findFocusedNode(snapshot); console.log(node && node.name); function findFocusedNode(node) { if (node.focused) return node; for (const child of node.children || []) { const foundNode = findFocusedNode(child); return foundNode; } return null; }
Клавиатура предоставляет API для управления виртуальной клавиатурой. API высокого уровня - это keyboard.type , который принимает необработанные символы и генерирует правильные события нажатия клавиш, нажатия / ввода и нажатия клавиш на вашей странице.
Для более точного управления вы можете использовать keyboard.down , keyboard.up и keyboard.sendCharacter , чтобы вручную запускать события, как если бы они были сгенерированы с реальной клавиатуры.
Пример удерживания Shift для выделения и удаления текста:
await page.keyboard.type('Hello World!'); await page.keyboard.press('ArrowLeft'); await page.keyboard.down('Shift'); for (let i = 0; i < ' World'.length; i++) await page.keyboard.press('ArrowLeft'); await page.keyboard.up('Shift'); await page.keyboard.press('Backspace'); // В результате в тексте результата будет написано «Привет!»
Пример нажатия A
await page.keyboard.down('Shift'); await page.keyboard.press('KeyA'); await page.keyboard.up('Shift');
ПРИМЕЧАНИЕ В MacOS такие сочетания клавиш, как⌘ A→ Выбрать все, не работают. См. № 1313
key < строка > Имя клавиши, которую нужно нажать, например ArrowLeft . См. Список всех имен клавиш в USKeyboardLayout .options < Объект >text < string > Если указано, генерирует событие ввода с этим текстом.
Отправляет событие keydown .
Если key представляет собой одиночный символ и никакие клавиши-модификаторы, кроме Shift , не удерживаются, также будет сгенерировано событие keypress / input . text опция может быть указана , чтобы заставить событие ввода , который будет создан.
Если key является клавишей- модификатором, Shift , Meta , Control или Alt , последующие нажатия клавиш будут отправляться с активным модификатором. Чтобы отпустить клавишу-модификатор, используйте keyboard.up .
После однократного нажатия клавиши при последующих вызовах keyboard.down для параметра repeat будет установлено значение true. Чтобы отпустить клавишу, используйте keyboard.up .
ПРИМЕЧАНИЕ Клавиши-модификаторы ДЕЙСТВИТЕЛЬНО влияют на раскручиваниеkeyboard.down. Удерживая нажатойShiftвы набираете текст в верхнем регистре.
key < строка > Имя клавиши, которую нужно нажать, например ArrowLeft . См. Список всех имен клавиш в USKeyboardLayout .options < Объект >text < string > Если указано, генерирует событие ввода с этим текстом.
Если key представляет собой одиночный символ и никакие клавиши-модификаторы, кроме Shift , не удерживаются, также будет сгенерировано событие keypress / input . text опция может быть указана , чтобы заставить событие ввода , который будет создан.
ПРИМЕЧАНИЕ Клавиши-модификаторы ДЕЙСТВИТЕЛЬНО влияют наkeyboard.press. Удерживая нажатойShiftвы набираете текст в верхнем регистре.
Сочетание клавиш для keyboard.down и keyboard.up .
Отправляет событие keypress и input . Это не отправляет событие keydown или keyup .
page.keyboard.sendCharacter('嗨');
ПРИМЕЧАНИЕ Клавиши-модификаторы НЕ влияют наkeyboard.sendCharacter. УдерживаниеShiftне приведет к вводу текста в верхнем регистре.
text < string > Текст для ввода в выбранный элемент.options < Объект >delay < число > Время ожидания между нажатиями клавиш в миллисекундах. По умолчанию 0.
Посылает keydown , keypress / input и keyup событие для каждого символа в тексте.
Чтобы нажать специальную клавишу, например Control или ArrowDown , используйте keyboard.press .
await page.keyboard.type('Hello'); // Мгновенно набирает await page.keyboard.type('World', {delay: 100}); // Набирает медленнее, как пользователь
ПРИМЕЧАНИЕ Клавиши-модификаторы НЕ влияют наkeyboard.type. УдерживаниеShiftне приведет к вводу текста в верхнем регистре.
key < строка > Имя клавиши, которую нужно освободить, например ArrowLeft . См. Список всех имен клавиш в USKeyboardLayout .
Отправляет событие keyup .
Класс Мышь работает в пикселях CSS основного кадра относительно левого верхнего угла вью-порта.
Каждый объект page имеет свою собственную мышь, доступную с помощью page.mouse .
// Использование page.mouse для обведения квадрата 100x100. await page.mouse.move(0, 0); await page.mouse.down(); await page.mouse.move(0, 100); await page.mouse.move(100, 100); await page.mouse.move(100, 0); await page.mouse.move(0, 0); await page.mouse.up();
Обратите внимание, что события мыши запускают синтетические MouseEvent s. Это означает, что он не полностью воспроизводит функциональность того, что обычный пользователь мог бы делать с помощью своей мыши.
Например, перетаскивание и выделение текста невозможно с помощью page.mouse . Вместо этого вы можете использовать функциональность DocumentOrShadowRoot.getSelection() реализованную на платформе.
Например,если вы хотите выбрать все содержимое между узлами:
await page.evaluate((from, to) => { const selection = from.getRootNode().getSelection(); const range = document.createRange(); range.setStartBefore(from); range.setEndAfter(to); selection.removeAllRanges(); selection.addRange(range); }, fromJSHandle, toJSHandle);
Если вы хотите скопировать-вставить выделение,вы можете использовать апи буфера обмена:
// API буфера обмена не позволяет вам копировать, если вкладка не сфокусирована. await page.bringToFront(); await page.evaluate(() => { // Копируем выделенный контент в буфер обмена document.execCommand('copy'); // Получаем содержимое буфера обмена в виде строки return navigator.clipboard.readText(); });
Обратите внимание,что если вы хотите получить доступ к API буфера обмена,вы должны дать ему соответствующее разрешение:
await browser.defaultBrowserContext().overridePermissions('<your origin>', ['clipboard-read', 'clipboard-write']);
x < число >y < число >options < Объект >button <«left» | «right» | «middle»> По умолчанию left .
Ярлыки для mouse.move , mouse.down и mouse.up .
options < Объект >button <«left» | «right» | «middle»> По умолчанию left .
Отправляет событие mousedown .
Отправляет событие mousemove .
options < Объект >button <«left» | «right» | «middle»> По умолчанию left .
Отправляет событие mouseup .
options < Объект >deltaX X дельта в пикселях CSS для события колеса мыши (по умолчанию: 0). Положительные значения имитируют прокрутку вправо, а отрицательные значения - событие прокрутки влево.deltaY Y дельта в пикселях CSS для события колеса мыши (по умолчанию: 0). Положительные значения имитируют прокрутку вниз, а отрицательные значения - событие прокрутки вверх.
Отправляет событие mousewheel .
Examples:
await page.goto('https://mdn.mozillademos.org/en-US/docs/Web/API/Element/wheel_event$samples/Scaling_an_element_via_the_wheel?revision=1587366'); const elem = await page.$('div'); const boundingBox = await elem.boundingBox(); await page.mouse.move( boundingBox.x + boundingBox.width / 2, boundingBox.y + boundingBox.height / 2 ); await page.mouse.wheel({ deltaY: -100 })
Вы можете использовать tracing.start и tracing.stop для создания файла трассировки, который можно открыть в Chrome DevTools или программе просмотра временной шкалы .
await page.tracing.start({path: 'trace.json'}); await page.goto('https://www.google.com'); await page.tracing.stop();
Одновременно может быть активна только одна трасса на один браузер.
Объекты FileChooser возвращаются с помощью метода page.waitForFileChooser .
Выбор файлов позволяет реагировать на запрос страницы файла.
Пример использования FileChooser :
const [fileChooser] = await Promise.all([ page.waitForFileChooser(), page.click('#upload-file-button'), // какая-то кнопка, запускающая выбор файла ]); await fileChooser.accept(['/tmp/myfile.pdf']);
ПРИМЕЧАНИЕ. В браузерах одновременно может быть открыт только один селектор файлов. Все средства выбора файлов должны быть приняты или отменены. Если этого не сделать, то последующие средства выбора файлов не появятся.
filePaths < Array < string » Принять запрос средства выбора файла с заданными путями. Если некоторые из filePaths путей являются относительными путями, они разрешаются относительно текущего рабочего каталога .Закрывает выбор файла без выбора файлов.
Объекты диалогов отправляются по страницам с помощью события 'dialog' .
Пример использования класса Dialog :
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); page.on('dialog', async dialog => { console.log(dialog.message()); await dialog.dismiss(); await browser.close(); }); page.evaluate(() => alert('1')); })();
Объекты ConsoleMessage отправляются постранично через событие console .
Одно из следующих значений: 'log' , 'debug' , 'info' , 'error' , 'warning' , 'dir' , 'dirxml' , 'table' , 'trace' , 'clear' , 'startGroup' , 'startGroupCollapsed' , 'endGroup' , 'assert' , 'profile' , 'profileEnd' , 'count' , 'timeEnd' .
В каждый момент времени страница предоставляет свое текущее дерево фреймов с помощью методов page.mainFrame () и frame.childFrames () .
Жизненный цикл объекта кадра контролируется тремя событиями, отправляемыми объекту страницы:
Пример сбрасывания каркасного дерева:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.google.com/chrome/browser/canary.html'); dumpFrameTree(page.mainFrame(), ''); await browser.close(); function dumpFrameTree(frame, indent) { console.log(indent + frame.url()); for (const child of frame.childFrames()) { dumpFrameTree(child, indent + ' '); } } })();
Пример получения текста из элемента iframe:
const frame = page.frames().find(frame => frame.name() === 'myframe'); const text = await frame.$eval('.selector', element => element.textContent); console.log(text);
Метод запрашивает кадр для селектора. Если в кадре такого элемента нет, метод принимает значение null .
Метод запускает document.querySelectorAll внутри фрейма. Если ни один элемент не соответствует селектору, возвращаемое значение преобразуется в [] .
pageFunction
Этот метод запускает Array.from(document.querySelectorAll(selector)) внутри кадра и передает его в качестве первого аргумента функции pageFunction .
Если pageFunction возвращает Promise , то frame.$$eval будет ждать разрешения обещания и вернет его значение.
Examples:
const divsCounts = await frame.$$eval('div', divs => divs.length);
pageFunction
Этот метод запускает document.querySelector во фрейме и передает его в качестве первого аргумента pageFunction . Если нет selector соответствия элемента , метод выдает ошибку.
Если pageFunction возвращает обещание , то frame.$eval будет ждать разрешения обещания и вернет его значение.
Examples:
const searchValue = await frame.$eval('#search', el => el.value); const preloadHref = await frame.$eval('link[rel=preload]', el => el.href); const html = await frame.$eval('.main-container', e => e.outerHTML);
Метод оценивает выражение XPath относительно документа фрейма как контекстного узла.Если таких элементов нет,метод преобразуется в пустой массив.
options < Объект >url < строка > URL-адрес добавляемого скрипта.path < string > Путь к файлу JavaScript, который будет вставлен во фрейм. Если path является относительным путем, он разрешается относительно текущего рабочего каталога .content < string > Необработанный контент JavaScript для вставки во фрейм.
Добавляет <script> на страницу с желаемым URL-адресом или содержимым.
options < Объект >path < string > Путь к файлу CSS, который будет вставлен во фрейм. Если path является относительным путем, он разрешается относительно текущего рабочего каталога .content < string > Необработанное содержимое CSS для вставки во фрейм.
Добавляет <link rel=«stylesheet»> на страницу с желаемым URL-адресом или <style type=«text/css»> с содержимым.
options < Объект >button <«left» | «right» | «middle»> По умолчанию left .selector соответствия элемента . Обещание будет отклонено, если нет selector соответствия элемента .
Этот метод выбирает элемент с помощью selector , при необходимости прокручивает его, а затем использует page.mouse для щелчка в центре элемента. Если нет selector соответствия элемента , метод выдает ошибку.
Имейте в виду, что если click() запускает событие навигации и есть отдельное page.waitForNavigation() которое должно быть разрешено, вы можете получить состояние гонки, которое приведет к неожиданным результатам. Правильный шаблон для щелчка и ожидания навигации следующий:
const [response] = await Promise.all([ page.waitForNavigation(waitOptions), frame.click(selector, clickOptions), ]);
pageFunction
Если функция, переданная в frame.evaluate , возвращает Promise , то frame.evaluate будет ждать разрешения обещания и вернет свое значение.
Если функция перешла к frame.evaluate возвращает значение не Serializable значения, то frame.evaluate ПОСТАНОВЛЯЕТ undefined . Протокол DevTools также поддерживает передачу некоторых дополнительных значений, не сериализуемых с помощью JSON : -0 , NaN , Infinity , -Infinity и литералы bigint.
const result = await frame.evaluate(() => { return Promise.resolve(8 * 7); }); console.log(result); // prints "56"
Также вместо функции может быть передана строка.
console.log(await frame.evaluate('1 + 2')); // prints "3"
Экземпляры ElementHandle могут быть переданы в качестве аргументов в frame.evaluate :
const bodyHandle = await frame.$('body'); const html = await frame.evaluate(body => body.innerHTML, bodyHandle); await bodyHandle.dispose();
pageFunction в возвращаемое значение pageFunction как внутристраничный объект.
Единственная разница между frame.evaluate и frame.evaluateHandle состоит в том, что frame.evaluateHandle возвращает объект на странице (JSHandle).
Если функция, переданная в frame.evaluateHandle , возвращает Promise , то frame.evaluateHandle будет ждать разрешения обещания и вернет его значение.
Если функция возвращает элемент, возвращаемый дескриптор - ElementHandle .
const aWindowHandle = await frame.evaluateHandle(() => Promise.resolve(window)); aWindowHandle; // Handle for the window object.
Также вместо функции может быть передана строка.
const aHandle = await frame.evaluateHandle('document'); // Дескриптор документа.
Экземпляры JSHandle можно передать в качестве аргументов в frame.evaluateHandle :
const aHandle = await frame.evaluateHandle(() => document.body); const resultHandle = await frame.evaluateHandle(body => body.innerHTML, aHandle); console.log(await resultHandle.jsonValue()); await resultHandle.dispose();
Возвращает обещание,которое разрешает контекст выполнения фрейма по умолчанию.
selector сопоставления элементов успешно сфокусирован. Обещание будет отклонено, если нет selector соответствия элементов .
Этот метод выбирает элемент с помощью selector и фокусирует его. Если нет selector соответствия элемента , метод выдает ошибку.
url < строка > URL для перехода к фрейму. URL-адрес должен включать схему, например ''https://'' .options < Object > Параметры навигации, которые могут иметь следующие свойства:timeout < число > Максимальное время навигации в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Если считать, что навигация прошла успешно, по умолчанию используется load . Учитывая массив строк событий, навигация считается успешной после того, как все события были запущены. События могут быть:load - считайте, что навигация завершена, когда запускается событие load .domcontentloaded - считается, что навигация завершена, когда DOMContentLoaded событие DOMContentLoaded .networkidle0 - считать, что навигация завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что навигация завершена, если не более 2 сетевых подключений в течение не менее 500 мс.
frame.goto выдаст ошибку, если:
timeout превышено во время навигации.
frame.goto не выдаст ошибку, если удаленный сервер вернет любой допустимый код состояния HTTP, включая 404 «Не найдено» и 500 «Внутренняя ошибка сервера». Код состояния для таких ответов можно получить, вызвав response.status () .
ПРИМЕЧАНИЕframe.gotoлибо выдает ошибку, либо возвращает ответ основного ресурса. Единственными исключениями являются переход кabout:blankили переход к тому же URL-адресу с другим хешем, который завершится успешно и вернетnull.
ПРИМЕЧАНИЕ. Режим «Без заголовка» не поддерживает переход к документу PDF. См. Проблему с восходящим потоком .
selector соответствия элемента успешно зависает. Обещание отклоняется, если нет selector соответствия элементов .
Этот метод выбирает элемент с помощью selector , при необходимости прокручивает его, а затем использует page.mouse для наведения курсора на центр элемента. Если нет selector соответствия элемента , метод выдает ошибку.
Возвращает true , если фрейм был отсоединен, или false в противном случае.
Возвращает атрибут имени фрейма,как указано в теге.
Если имя пустое,возвращает атрибут id.
ПРИМЕЧАНИЕ. Это значение рассчитывается один раз при создании кадра и не обновляется, если атрибут будет изменен позже.
null .…values <… строка > Значения параметров для выбора. Если <select> имеет атрибут multiple , учитываются все значения, в противном случае учитывается только первое.
Запускает событие change и input после выбора всех предоставленных параметров. Если нет selector соответствия элемента <select> , метод выдает ошибку.
frame.select('select#colors', 'blue'); // одиночный выбор frame.select('select#colors', 'red', 'green', 'blue'); // множественный выбор
html < строка > HTML-разметка для назначения странице.options < Object > Параметры, которые могут иметь следующие свойства:timeout < число > Максимальное время в миллисекундах для загрузки ресурсов, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Когда считать, что установка разметки прошла успешно, по умолчанию используется load . Учитывая массив строк событий, настройка содержимого считается успешной после того, как все события были запущены. События могут быть:load - рассмотрите возможность завершения настройки содержимого при срабатывании события load .domcontentloaded - рассмотрите возможность завершения настройки содержимого при DOMContentLoaded события DOMContentLoaded .networkidle0 - считайте, что настройка содержимого завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что настройка содержимого завершена, если не более 2 сетевых подключений в течение не менее 500 мс.
Этот метод выбирает элемент с помощью selector , при необходимости прокручивает его, а затем использует page.touchscreen для нажатия в центре элемента. Если нет selector соответствия элемента , метод выдает ошибку.
text < string > Текст для ввода в выбранный элемент.options < Объект >delay < число > Время ожидания между нажатиями клавиш в миллисекундах. По умолчанию 0.
Посылает keydown , keypress / input и keyup событие для каждого символа в тексте.
Чтобы нажать специальную клавишу, например Control или ArrowDown , используйте keyboard.press .
await frame.type('#mytextarea', 'Hello'); // Мгновенно набирает await frame.type('#mytextarea', 'World', {delay: 100}); // Набирает медленнее, как пользователь
Возвращает урну рамы.
options < Object > Необязательные параметры ожиданияЭтот метод устарел . Вам следует использовать более явные доступные методы API:
frame.waitForSelectorframe.waitForXPathframe.waitForFunctionframe.waitForTimeoutЭтот метод ведет себя по-разному по отношению к типу первого параметра:
selectorOrFunctionOrTimeout является string , то первый аргумент обрабатывается как селектор или xpath , в зависимости от того, начинается он с '//' или нет, а метод является ярлыком для frame.waitForSelector или frame.waitForXPathselectorOrFunctionOrTimeout - это function , то первый аргумент рассматривается как ожидаемый предикат, а метод является ярлыком для frame.waitForFunction () .selectorOrFunctionOrTimeout - это number , то первый аргумент обрабатывается как тайм-аут в миллисекундах, и метод возвращает обещание, которое разрешается по истечении тайм-аута.// ждем селектора await page.waitFor('.foo'); // ждем 1 секунду await page.waitFor(1000); // ждем предиката await page.waitFor(() => !!document.querySelector('.foo'));
Чтобы передать аргументы из node.js в предикат функции page.waitFor :
const selector = '.foo'; await page.waitFor(selector => !!document.querySelector(selector), {}, selector);
options < Object > Необязательные параметры ожиданияpolling < строка | число > Интервал, с которым выполняется pageFunction , по умолчанию raf . Если polling является числом, то он рассматривается как интервал в миллисекундах, с которым функция будет выполняться. Если polling представляет собой строку, это может быть одно из следующих значений:raf - постоянно выполнять pageFunction в обратном вызове requestAnimationFrame . Это самый жесткий режим опроса, который подходит для наблюдения за изменениями стиля.mutation - для выполнения pageFunction при каждой мутации DOM.timeout < число > максимальное время ожидания в миллисекундах. По умолчанию 30000 (30 секунд). Передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .
Функция waitForFunction может использоваться для наблюдения за изменением размера области просмотра:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); const watchDog = page.mainFrame().waitForFunction('window.innerWidth < 100'); page.setViewport({width: 50, height: 50}); await watchDog; await browser.close(); })();
Чтобы передать аргументы из node.js в предикат функции page.waitForFunction :
const selector = '.foo'; await page.waitForFunction(selector => !!document.querySelector(selector), {}, selector);
options < Object > Параметры навигации, которые могут иметь следующие свойства:timeout < число > Максимальное время навигации в миллисекундах, по умолчанию 30 секунд, передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью методов page.setDefaultNavigationTimeout (тайм-аут) или page.setDefaultTimeout (тайм-аут) .waitUntil <«load» | «domcontentloaded» | «networkidle0» | «networkidle2» | Array> Если считать, что навигация прошла успешно, по умолчанию используется load . Учитывая массив строк событий, навигация считается успешной после того, как все события были запущены. События могут быть:load - считайте, что навигация завершена, когда запускается событие load .domcontentloaded - считается, что навигация завершена, когда DOMContentLoaded событие DOMContentLoaded .networkidle0 - считать, что навигация завершена, если не более 0 сетевых подключений в течение не менее 500 мс.networkidle2 - считайте, что навигация завершена, если не более 2 сетевых подключений в течение не менее 500 мс.null .Это разрешается,когда кадр переходит на новый URL.Это полезно,когда вы запускаете код,который косвенно вызывает навигацию фрейма.Рассмотрим этот пример:
const [response] = await Promise.all([ frame.waitForNavigation(), // Обещание навигации разрешается после завершения навигации frame.click('a.my-link'), // Нажатие на ссылку косвенно вызовет навигацию ]);
ПРИМЕЧАНИЕ. Использование History API для изменения URL-адреса считается навигацией.
options < Object > Необязательные параметры ожиданияvisible < boolean > ожидает, пока элемент будет присутствовать в DOM и станет видимым, то есть не будет иметь свойств CSS display: none или visibility: hidden . По умолчанию - false .hidden < boolean > подождите, пока элемент не будет найден в DOM или будет скрыт, т.е. будет иметь свойства CSS display: none или visibility: hidden . По умолчанию - false .timeout < число > максимальное время ожидания в миллисекундах. По умолчанию 30000 (30 секунд). Передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .null , если ожидание hidden: true и селектор не найден в DOM.
Подождите, пока на странице появится selector . Если на момент вызова метода selector уже существует, метод немедленно вернется. Если селектор не появляется после истечения времени timeout миллисекундах, функция сгенерирует.
Этот метод работает во всех навигациях:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); let currentURL; page.mainFrame() .waitForSelector('img') .then(() => console.log('First URL with image: ' + currentURL)); for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) { await page.goto(currentURL); } await browser.close(); })();
milliseconds < число > Количество миллисекунд ожидания.Приостанавливает выполнение сценария на заданное количество секунд перед продолжением:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); page.mainFrame() .waitForTimeout(1000) .then(() => console.log('Waited a second!')); await browser.close(); })();
options < Object > Необязательные параметры ожиданияvisible < boolean > ожидает, пока элемент будет присутствовать в DOM и станет видимым, то есть не будет иметь свойств CSS display: none или visibility: hidden . По умолчанию - false .hidden < boolean > подождите, пока элемент не будет найден в DOM или будет скрыт, т.е. будет иметь свойства CSS display: none или visibility: hidden . По умолчанию - false .timeout < число > максимальное время ожидания в миллисекундах. По умолчанию 30000 (30 секунд). Передайте 0 , чтобы отключить тайм-аут. Значение по умолчанию можно изменить с помощью метода page.setDefaultTimeout (timeout) .null , если ожидает hidden: true и xpath не найден в DOM.
Подождите, пока xpath не появится на странице. Если на момент вызова метода xpath уже существует, метод немедленно вернется. Если xpath не появляется после истечения времени timeout миллисекундах, функция сгенерирует.
Этот метод работает во всех навигациях:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); let currentURL; page.mainFrame() .waitForXPath('//img') .then(() => console.log('First URL with image: ' + currentURL)); for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) { await page.goto(currentURL); } await browser.close(); })();
Класс представляет собой контекст для выполнения JavaScript. Страница может иметь много контекстов исполнения:
frame.executionContext() .Помимо страниц, контексты выполнения можно найти в worker-ах .
pageFunction
Если функция, переданная в executionContext.evaluate возвращает Promise , то executionContext.evaluate будет ждать разрешения обещания и вернуть свое значение.
Если функция, переданная в executionContext.evaluate , возвращает несериализуемое значение, то executionContext.evaluate принимает значение undefined . Протокол DevTools также поддерживает передачу некоторых дополнительных значений, не сериализуемых с помощью JSON : -0 , NaN , Infinity , -Infinity и литералы bigint.
const executionContext = await page.mainFrame().executionContext(); const result = await executionContext.evaluate(() => Promise.resolve(8 * 7)); console.log(result); // prints "56"
Также вместо функции может быть передана строка.
console.log(await executionContext.evaluate('1 + 2')); // prints "3"
JSHandle экземпляры могут быть переданы в качестве аргументов executionContext.evaluate :
const oneHandle = await executionContext.evaluateHandle(() => 1); const twoHandle = await executionContext.evaluateHandle(() => 2); const result = await executionContext.evaluate((a, b) => a + b, oneHandle, twoHandle); await oneHandle.dispose(); await twoHandle.dispose(); console.log(result); // prints '3'.
pageFunction в возвращаемое значение pageFunction как внутристраничный объект.
Единственное различие между executionContext.evaluate и executionContext.evaluateHandle является то , что executionContext.evaluateHandle возвращается в-странице объекта (JSHandle).
Если функция возвращает элемент, возвращаемый дескриптор - ElementHandle .
Если функция, переданная в executionContext.evaluateHandle возвращает Promise , то executionContext.evaluateHandle будет ждать разрешения обещания и вернет свое значение.
const context = await page.mainFrame().executionContext(); const aHandle = await context.evaluateHandle(() => Promise.resolve(self)); aHandle; // Дескриптор глобального объекта.
Также вместо функции может быть передана строка.
const aHandle = await context.evaluateHandle('1 + 2'); // Дескриптор объекта "3".
JSHandle экземпляры могут быть переданы в качестве аргументов executionContext.evaluateHandle :
const aHandle = await context.evaluateHandle(() => document.body); const resultHandle = await context.evaluateHandle(body => body.innerHTML, aHandle); console.log(await resultHandle.jsonValue()); // выводит внутренний HTML-код тела await aHandle.dispose(); await resultHandle.dispose();
ПРИМЕЧАНИЕ. Не каждый контекст выполнения связан с фреймом. Например, рабочие процессы и расширения имеют контексты выполнения, не связанные с фреймами.
prototypeHandle < JSHandle > Дескриптор прототипа объекта.Метод итерирует кучу JavaScript и находит все объекты с данным прототипом.
// Создаем объект Map await page.evaluate(() => window.map = new Map()); // Получаем дескриптор прототипа объекта Map const mapPrototype = await page.evaluateHandle(() => Map.prototype); // Запрос всех экземпляров карты в массив const mapInstances = await page.queryObjects(mapPrototype); // Подсчитываем количество объектов карты в куче const count = await page.evaluate(maps => maps.length, mapInstances); await mapInstances.dispose(); await mapPrototype.dispose();
JSHandle представляет собой объект JavaScript на странице. JSHandles можно создать с помощью метода page.evaluateHandle .
const windowHandle = await page.evaluateHandle(() => window); // ...
JSHandle предотвращает сборку мусора для указанного объекта JavaScript, если дескриптор не удален . JSHandles автоматически удаляются при переходе по их исходному фрейму или при уничтожении родительского контекста.
Экземпляры JSHandle могут использоваться в качестве аргументов в методах page.$eval() , page.evaluate() и page.evaluateHandle .
Возвращает либо null , либо сам дескриптор объекта, если дескриптор объекта является экземпляром ElementHandle .
Метод jsHandle.dispose перестает ссылаться на дескриптор элемента.
pageFunction
Этот метод передает этот дескриптор в качестве первого аргумента функции pageFunction .
Если pageFunction возвращает обещание , то handle.evaluate будет ждать разрешения обещания и вернет его значение.
Examples:
const tweetHandle = await page.$('.tweet .retweets'); expect(await tweetHandle.evaluate(node => node.innerText)).toBe('10');
pageFunction в возвращаемое значение pageFunction как внутристраничный объект.
Этот метод передает этот дескриптор в качестве первого аргумента функции pageFunction .
Единственное различие между jsHandle.evaluate и jsHandle.evaluateHandle является то , что executionContext.evaluateHandle возвращается в-странице объекта (JSHandle).
Если функция возвращает элемент, возвращаемый дескриптор - ElementHandle .
Если функция, переданная в jsHandle.evaluateHandle , возвращает Promise , тогда jsHandle.evaluateHandle будет ждать разрешения обещания и вернет свое значение.
См. Page.evaluateHandle для более подробной информации.
Возвращает контекст выполнения,к которому принадлежит дескриптор.
Метод возвращает карту с именами свойств в качестве ключей и экземплярами JSHandle для значений свойств.
const handle = await page.evaluateHandle(() => ({window, document})); const properties = await handle.getProperties(); const windowHandle = properties.get('window'); const documentHandle = properties.get('document'); await handle.dispose();
propertyName < string > свойство для полученияПолучает единственное свойство от объекта,на который делается ссылка.
Возвращает JSON-представление объекта. Если у объекта есть функция toJSON , он не будет вызываться .
ПРИМЕЧАНИЕ . Метод вернет пустой объект JSON, если объект, на который указывает ссылка, не является строковым. Это вызовет ошибку, если объект имеет циклические ссылки.
ElementHandle представляет собой элемент DOM на странице. ElementHandles можно создать с помощью метода page. $ .
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); const hrefElement = await page.$('a'); await hrefElement.click(); // ... })();
ElementHandle предотвращает сборку мусора для элемента DOM, если дескриптор не удален . ElementHandles автоматически удаляются при переходе по их исходному фрейму.
Экземпляры ElementHandle могут использоваться в качестве аргументов в методах page.$eval() и page.evaluate() .
Метод запускает element.querySelector на странице. Если ни один элемент не соответствует селектору, возвращаемое значение принимает значение null .
Метод запускает element.querySelectorAll на странице. Если ни один элемент не соответствует селектору, возвращаемое значение преобразуется в [] .
pageFunction
Этот метод запускает document.querySelectorAll внутри элемента и передает его в качестве первого аргумента в pageFunction . Если нет selector соответствия элемента , метод выдает ошибку.
Если pageFunction возвращает Promise , то frame.$$eval будет ждать разрешения обещания и вернет его значение.
Examples:
<div class="feed"> <div class="tweet">Hello!</div> <div class="tweet">Hi!</div> </div>
const feedHandle = await page.$('.feed'); expect(await feedHandle.$$eval('.tweet', nodes => nodes.map(n => n.innerText))).toEqual(['Hello!', 'Hi!']);
pageFunction
Этот метод запускает document.querySelector внутри элемента и передает его в качестве первого аргумента pageFunction . Если нет selector соответствия элемента , метод выдает ошибку.
Если pageFunction возвращает обещание , то frame.$eval будет ждать разрешения обещания и вернет его значение.
Examples:
const tweetHandle = await page.$('.tweet'); expect(await tweetHandle.$eval('.like', node => node.innerText)).toBe('100'); expect(await tweetHandle.$eval('.retweets', node => node.innerText)).toBe('10');
Метод оценивает выражение XPath относительно elementHandle как его контекстного узла. Если таких элементов нет, метод преобразуется в пустой массив.
expression должно иметь узел контекста , чтобы оценить должным образом:
const [childHandle] = await parentHandle.$x('./div');
Этот метод возвращает ограничивающую рамку элемента (относительно основного фрейма) или значение null , если элемент не отображается.
Этот метод возвращает поля элемента или null , если элемент не отображается. Ящики представлены в виде массива точек; каждая точка - это объект {x, y} . Пункты бокса отсортированы по часовой стрелке.
options < Объект >button <«left» | «right» | «middle»> По умолчанию left .Этот метод при необходимости прокручивает элемент в поле зрения, а затем с помощью page.mouse щелкает в центре элемента. Если элемент отсоединен от DOM, метод выдает ошибку.
Метод elementHandle.dispose перестает ссылаться на дескриптор элемента.
pageFunction
Этот метод передает этот дескриптор в качестве первого аргумента функции pageFunction .
Если pageFunction возвращает обещание , то handle.evaluate будет ждать разрешения обещания и вернет его значение.
Examples:
const tweetHandle = await page.$('.tweet .retweets'); expect(await tweetHandle.evaluate(node => node.innerText)).toBe('10');
pageFunction в возвращаемое значение pageFunction как внутристраничный объект.
Этот метод передает этот дескриптор в качестве первого аргумента функции pageFunction .
Единственное различие между elementHandle.evaluate и elementHandle.evaluateHandle является то , что executionContext.evaluateHandle возвращается в-странице объекта (JSHandle).
Если функция возвращает элемент, возвращаемый дескриптор - ElementHandle .
Если функция, переданная в elementHandle.evaluateHandle , возвращает Promise , тогда elementHandle.evaluateHandle будет ждать разрешения обещания и вернет его значение.
См. Page.evaluateHandle для более подробной информации.
Метод возвращает карту с именами свойств в качестве ключей и экземплярами JSHandle для значений свойств.
const listHandle = await page.evaluateHandle(() => document.body.children); const properties = await listHandle.getProperties(); const children = []; for (const property of properties.values()) { const element = property.asElement(); if (element) children.push(element); } children; // содержит elementHandles для всех дочерних элементов document.body
propertyName < string > свойство для полученияПолучает единственное свойство от objectHandle.
Этот метод при необходимости прокручивает элемент в поле зрения, а затем использует page.mouse для наведения курсора на центр элемента. Если элемент отсоединен от DOM, метод выдает ошибку.
Возвращает JSON-представление объекта. JSON создается путем запуска JSON.stringify для объекта на странице и последующего JSON.parse в puppeteer.
ПРИМЕЧАНИЕ . Метод будет выдан, если объект, на который указывает ссылка, не является строковым.
key < строка > Имя клавиши, которую нужно нажать, например ArrowLeft . См. Список всех имен клавиш в USKeyboardLayout .options < Объект >text < string > Если указано, генерирует событие ввода с этим текстом.
Фокусирует элемент, а затем использует keyboard.down и keyboard.up .
Если key состоит из одного символа и не удерживаются никакие клавиши-модификаторы, кроме Shift , также будет сгенерировано событие keypress / input . text опция может быть указана , чтобы заставить событие ввода , который будет создан.
ПРИМЕЧАНИЕ. Клавиши-модификаторыelementHandle.pressвлияют на elementHandle.press . Удерживая нажатойShiftвы набираете текст в верхнем регистре.
Этот метод прокручивает элемент в поле зрения, если необходимо, а затем использует page.screenshot для создания снимка экрана элемента. Если элемент отсоединен от DOM, метод выдает ошибку.
…values <… строка > Значения параметров для выбора. Если <select> имеет атрибут multiple , учитываются все значения, в противном случае учитывается только первое.
Запускает событие change и input после выбора всех предоставленных параметров. Если нет selector соответствия элемента <select> , метод выдает ошибку.
handle.select('blue'); // одиночный выбор handle.select('red', 'green', 'blue'); // множественный выбор
Этот метод при необходимости прокручивает элемент в поле зрения, а затем использует touchscreen.tap для нажатия в центре элемента. Если элемент отсоединен от DOM, метод выдает ошибку.
text < string > Текст для ввода в выбранный элемент.options < Объект >delay < число > Время ожидания между нажатиями клавиш в миллисекундах. По умолчанию 0.
Фокусирует элемент, а затем отправляет события keydown , keypress / input и keyup для каждого символа в тексте.
Чтобы нажать специальную клавишу, например Control или ArrowDown , используйте elementHandle.press .
await elementHandle.type('Hello'); // Мгновенно набирает await elementHandle.type('World', {delay: 100}); // Набирает медленнее, как пользователь
Пример ввода в текстовое поле и последующей отправки формы:
const elementHandle = await page.$('input'); await elementHandle.type('some text'); await elementHandle.press('Enter');
…filePaths <… string > Устанавливает значение входного файла для этих путей. Если некоторые из filePaths путей являются относительными путями, они разрешаются относительно текущего рабочего каталога .
Этот метод ожидает, что elementHandle укажет на элемент ввода .
Всякий раз,когда страница посылает запрос,например,на сетевой ресурс,страничка кукловода испускает следующие события:
'request' генерируется, когда запрос выдается страницей.'response' генерируется, когда / если на запрос получен ответ.'requestfinished' когда тело ответа загружено и запрос завершен.
Если в какой-то момент запрос не выполняется, то вместо события 'requestfinished' (и, возможно, вместо события response) 'requestfailed' событие requestfailed .
ПРИМЕЧАНИЕ. Ответы HTTP Error, такие как 404 или 503, по-прежнему являются успешными ответами с точки зрения HTTP, поэтому запрос завершится с событием'requestfinished' .
Если на запрос получен ответ 'redirect',то запрос успешно завершается событием 'requestfinished',и новый запрос выдается на перенаправленный url.
aborted - операция была прервана (из-за действия пользователя)accessdenied - В разрешении на доступ к ресурсу, кроме сети, было отказаноaddressunreachable - IP-адрес недоступен. Обычно это означает, что нет маршрута к указанному хосту или сети.blockedbyclient - клиент решил заблокировать запрос.blockedbyresponse - запрос завершился неудачно, поскольку ответ был доставлен вместе с невыполненными требованиями (например, проверки предков «X-Frame-Options» и «Content-Security-Policy»).connectionaborted - время ожидания соединения истекло из-за неполучения ACK для отправленных данных.connectionclosed - соединение было закрыто (соответствует TCP FIN).connectionfailed - попытка подключения не удалась.connectionrefused - попытка подключения отклонена.connectionreset - соединение было сброшено (соответствует TCP RST).internetdisconnected - Интернет-соединение потеряно.namenotresolved - имя хоста не может быть разрешено.timedout - время ожидания операции истекло.failed - произошел общий сбой.
Отменяет запрос. Чтобы использовать это, перехват запроса должен быть включен с помощью page.setRequestInterception . Если перехват запроса не включен, немедленно генерируется исключение.
overrides < Object > Необязательные перезаписи запроса, которые могут быть одним из следующих:url < строка > Если установлено, URL запроса будет изменен. Это не перенаправление. Запрос будет автоматически перенаправлен на новый URL. Например, в адресной строке будет отображаться исходный URL-адрес.postData < строка > Если установлено, изменяет данные сообщения запросаheaders < Object > Если установлено, изменяет заголовки HTTP запроса. Значения заголовка будут преобразованы в строку.
Продолжает запрос с необязательными переопределениями запроса. Чтобы использовать это, перехват запроса должен быть включен с помощью page.setRequestInterception . Если перехват запроса не включен, немедленно генерируется исключение.
await page.setRequestInterception(true); page.on('request', request => { // Переопределить заголовки const headers = Object.assign({}, request.headers(), { foo: 'bar', // устанавливаем заголовок "foo" origin: undefined, // удаляем заголовок "origin" }); request.continue({headers}); });
errorText < строка > Сообщение об ошибке, 'net::ERR_FAILED' человеку, например , net :: ERR_FAILED .
Метод возвращает значение null , если этот запрос не был неудачным, о чем сообщает событие requestfailed .
Пример протоколирования всех неудачных запросов:
page.on('requestfailed', request => { console.log(request.url() + ' ' + request.failure().errorText); });
Является ли этот запрос навигацией водительской рамы.
redirectChain представляет собой цепочку запросов , инициированных извлечь ресурс.
redirectChain используется всеми запросами одной цепочки.
Например, если на сайте http://example.com есть один редирект на https://example.com , то цепочка будет содержать один запрос:
const response = await page.goto('http://example.com'); const chain = response.request().redirectChain(); console.log(chain.length); // 1 console.log(chain[0].url()); // 'http://example.com'
Если на сайте https://google.com нет редиректов, то цепочка будет пустой:
const response = await page.goto('https://google.com'); const chain = response.request().redirectChain(); console.log(chain.length); // 0
Содержит тип ресурса запроса, как он был воспринят механизмом визуализации. ResourceType будет одним из следующих: document , stylesheet , image , media , font , script , texttrack , xhr , fetch , источник eventsource , websocket , manifest , other .
response < Object > Ответ, который выполнит этот запросheaders < Object > Необязательные заголовки ответа. Значения заголовка будут преобразованы в строку.
Выполняет запрос с заданным ответом. Чтобы использовать это, перехват запроса должен быть включен с помощью page.setRequestInterception . Исключение генерируется, если перехват запроса не включен.
Пример выполнения всех запросов с 404 ответами:
await page.setRequestInterception(true); page.on('request', request => { request.respond({ status: 404, contentType: 'text/plain', body: 'Not Found!' }); });
ПРИМЕЧАНИЕ. Мокирующие ответы на запросы dataURL не поддерживаются. Вызовrequest.respondдля запроса dataURL - это пусто.
null , если ответ еще не получен.Класс HTTPResponse представляет ответы, полученные страницей.
Правда,если ответ был подан либо из кэша диска браузера,либо из кэша памяти.
Верно,если ответ был получен от работника сервисной службы.
Этот метод будет сгенерирован, если тело ответа не может быть JSON.parse через JSON.parse .
Содержит логическое указание на то,была ли реакция успешной (состояние в диапазоне 200-299)или нет.
null в противном случае.Содержит код статуса ответа (например,200 для успеха).
Содержит текст статуса ответа (например,обычно «ОК» для успеха).
Содержит URL ответа.
Класс SecurityDetails представляет сведения о безопасности при получении ответа по защищенному соединению.
Получите браузер,к которому принадлежит цель.
Контекст браузера,к которому принадлежит цель.
Создает сеанс протокола Chrome Devtools,прикрепленный к цели.
Получите цель, открывшую эту цель. Целевые объекты верхнего уровня возвращают значение null .
Если цель не относится к типу «page» или «background_page» , возвращается значение null .
Определяет, что это за цель. Может быть «page» , "background_page" , «service_worker» , «shared_worker» , «browser» или «other» .
Если цель не относится к типу «service_worker» или «shared_worker» , возвращается значение null .
В CDPSession экземпляры привыкли говорить сырец Chrome DevTools протокол:
session.send .session.on .Полезные ссылки:
const client = await page.target().createCDPSession(); await client.send('Animation.enable'); client.on('Animation.animationCreated', () => console.log('Animation created!')); const response = await client.send('Animation.getPlaybackRate'); console.log('playback rate is ' + response.playbackRate); await client.send('Animation.setPlaybackRate', { playbackRate: response.playbackRate / 2 });
Отсоединяет cdpSession от цели.После отсоединения объект cdpSession не будет испускать никаких событий и не может использоваться для отправки сообщений.
Coverage собирает информацию о тех частях JavaScript и CSS,которые использовались на странице.
Пример использования JavaScript и CSS-покрытия для получения процента первоначально выполненного кода:
// Включение покрытия как JavaScript, так и CSS await Promise.all([ page.coverage.startJSCoverage(), page.coverage.startCSSCoverage() ]); // Переходим на страницу await page.goto('https://example.com'); // Отключить покрытие JavaScript и CSS const [jsCoverage, cssCoverage] = await Promise.all([ page.coverage.stopJSCoverage(), page.coverage.stopCSSCoverage(), ]); let totalBytes = 0; let usedBytes = 0; const coverage = [...jsCoverage, ...cssCoverage]; for (const entry of coverage) { totalBytes += entry.text.length; for (const range of entry.ranges) usedBytes += range.end - range.start - 1; } console.log(`Bytes used: ${usedBytes / totalBytes * 100}%`);
Чтобы вывести покрытие в форме, доступной для Стамбула , см. Puppeteer-to-istanbul .
options < Object > Набор настраиваемых параметров покрытияreportAnonymousScripts < boolean > Следует ли сообщать анонимные сценарии, созданные страницей. По умолчанию - false .ПРИМЕЧАНИЕ. Анонимные сценарии - это сценарии, не связанные с URL-адресом. Это скрипты, которые динамически создаются на странице с помощьюevalилиnew Function. Если для параметраreportAnonymousScriptsустановлено значениеtrue, анонимные скрипты будут иметь__puppeteer_evaluation_script__в качестве URL-адреса.
ПРИМЕЧАНИЕ. CSS Coverage не включает динамически вводимые теги стиля без sourceURL.
ПРИМЕЧАНИЕ. Покрытие JavaScript по умолчанию не включает анонимные сценарии. Однако сообщается о скриптах с исходными URL.
TimeoutError генерируется всякий раз, когда определенные операции завершаются из-за тайм-аута, например page.waitForSelector (selector [, options]) или puppeteer.launch ([options]) .
Небольшой класс EventEmitter, поддерживаемый Mitt .
handler < Function > прослушиватель событий, который будет добавлен.this так, чтобы вы могли связать вызовы методов
Этот метод идентичен on и поддерживается для совместимости с EventEmitter узла. Мы рекомендуем использовать on умолчанию.
eventData < Object > дополнительные данные для отправки с событием.boolean ; true если для события есть слушатели, и значение false , если их нет.handler < Function > прослушиватель событий, который будет удален.this так, чтобы вы могли связать вызовы методовhandler < Function > прослушиватель событий, который будет добавлен.this так, чтобы вы могли связать вызовы методовhandler < Function > прослушиватель событий, который будет добавлен.this так, чтобы вы могли связать вызовы методовthis так, чтобы вы могли связать вызовы методовhandler < Function > прослушиватель событий, который будет удален.this так, чтобы вы могли связать вызовы методов
Этот метод идентичен off и поддерживается для совместимости с EventEmitter узла. Мы рекомендуем по умолчанию off .
Содержит две функции queryOne и queryAll , которые можно зарегистрировать как альтернативные стратегии запросов. Функции queryOne и queryAll выполняются в контексте страницы. queryOne должен принимать в качестве аргумента Element и строку селектора и возвращать один Element или значение null , если элемент не найден. queryAll принимает те же аргументы, но вместо этого должен возвращать NodeList<Element> или Array<Element> со всеми элементами, соответствующими заданному селектору запроса.