Puppeteer のスニペット集
このページは、Puppeteer のスニペットをまとめる予定のページです。
目次
注意
- コードのライセンスは CC0 (クレジット表示不要、改変可、商用可) です。
- バージョン 1.17.0 時点のものです。将来のバージョンで仕様が変更されている場合は使用できない可能性があります。
スニペット
ブラウザを起動する
ブラウザを表示せずに起動する
const browser = await puppeteer.launch();
// or
const browser = await puppeteer.launch({
headless: true,
});
ブラウザを表示して起動する
const browser = await puppeteer.launch({
headless: false,
});
- 参考: puppeteer.launch
新規ページを開く
const page = await browser.newPage();
ページの幅と高さを決める
await page.setViewport({ width: 1440, height: 900 }); // ビューポート (ウィンドウサイズ)
// or
// ブラウザを起動する時点で指定しておく
const browser = await puppeteer.launch({
defaultViewport: {
width: 1440,
height: 900,
}
});
width
,height
に好きな値を指定します。- 参考: page.setViewport
HTTP リクエストヘッダを追加する
await page.setExtraHTTPHeaders({
'Accept-Language': 'ja'
});
ページを移動する
await page.goto('http://example.com/', { waitUntil: 'domcontentloaded' });
'http://example.com/'
の箇所に、移動したい URL を指定します。waitUntil
は下記のいずれかです。load
: ページ遷移後、ページの load イベントが発生する時まで待つdomcontentloaded
: ページ遷移後、ページの DOMContentLoaded イベントが発生する時まで待つnetworkidle0
: ページ遷移後、500ms の間ネットワーク接続数が 0 になる時まで待つnetworkidle2
: ページ遷移後、500ms の間ネットワーク接続数が 2 になる時まで待つ- 参考: page.goto
入力欄にテキストを入力する
await page.type('[name="username"]', 'taro');
[name="username"]
の箇所に入力したい入力欄を特定するための CSS セレクタ、taro
の箇所に入力したいテキストを指定します。- 参考: page.type
リンクやボタンをクリックする
await Promise.all([
page.waitForNavigation({ waitUntil: 'domcontentloaded' }), // クリック後ページ遷移後通信が完了するまで待つ
page.click('#link1'),
]);
#link1
の箇所にクリックしたいリンクやボタンを特定するための CSS セレクタを指定します。- 参考: page.click
スクリーンショットを撮影する
スクリーンショットを撮影する (通常)
await page.screenshot({ path: 'test.png' });
test.png
の箇所に保存先のファイル名 (ファイルパス) を指定します。- 参考: page.screenshot
スクリーンショットを撮影する (フルページ)
await page.screenshot({ path: 'test.png', fullPage: true });
スクリーンショットを撮影する (矩形)
await page.screenshot({ path: 'test.png', clip: { x: 10, y: 10, width: 400, height: 400 } });
clip
で座標を指定します。
スクリーンショットを撮影する (要素)
const el = await page.$('.some-class');
await el.screenshot({ path: 'test.png' });
PDF を保存する
await page.pdf({ path: 'test.pdf' });
test.pdf
の箇所に保存先のファイル名 (ファイルパス) を指定します。headless: true
で ブラウザを起動していた時はエラーになるようです。(UnhandledPromiseRejectionWarning: Error: Protocol error (Page.printToPDF): PrintToPDF is not implemented
)- 参考: page.pdf
ページの HTML を設定する
const html = `<!DOCTYPE html>
<html>
<head><title>test</title></head>
<body>
<h1>test</h1>
</body>
</html>`;
await page.setContent(html);
- 参考: page.setContent
ページの HTML を取得する
const html = await page.content();
- 参考: page.content
ページ内の画像の URL を取得する
const srcAll = await page.$$eval('img', list => list.map(el => el.src)); // URL の配列
$$eval(CSSセレクタ, 要素リストからデータを取得する関数)
のような形で特定の DOM Element をもとにテキスト (textContent
) や属性値 (getAttribute()
やプロパティ) を取得することができます。- 参考: page.$$eval
ページ内の画像等のリソースを保存する
// const fs = require('fs').promises;
page.on('response', async (response) => {
const url = new URL(response.url());
const filename = url.pathname.split('/').pop();
if (/\.(?:png|jpe?g|gif)$/.test(filename)) {
await fs.writeFile(filename, await response.buffer());
}
});
- 読み込んだ画像などは
response
イベントで検知できます。 - 参考: page.response
ブラウザを閉じる
await browser.close();