puppeteer で Web ページを操作する
今回は、簡単な web ページを puppeteer で操作して見ます。
操作対象の html と php
次のような html と php を web サイトに準備します。
puppeteer_test.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name='robots' content='noindex,nofollow'> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes"> <title>puppeteer のテストページ</title> <style> body { background-color: #efefef; } </style> </head> <body> <h1>puppeteer の操作テスト</h1> <h2>フォーム操作のテスト</h2> 複数の submit ボタンが有った場合でもクリック操作を区別できます。 <form method="get" neme="add" action="test.php"> <input type="text" name="a" size="15" value="" placeholder="数字を入力" required> <input type="text" name="b" size="15" value="" placeholder="数字を入力" required> <button type="submit" name="action" value="add">足す</button> <button type="submit" name="action" value="sub">引く</button> </form> <h2>details タグのクリックテスト</h2> <details> <summary>クリックで詳細表示</summary> この文章が表示されれば、details タグがクリックされたことになります。 </details> </body> </html>
test.php
<?php $a = $_REQUEST['a']; $b = $_REQUEST['b']; if( $_REQUEST['action'] == "add" ) { $ans = $a + $b; $op = '+'; } else { $ans = $a - $b; $op = '-'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name='robots' content='noindex,nofollow'> <title>\u8a08\u7b97\u7d50\u679c</title> </head> <body> <?php echo $a . " " . $op . " " . $b; ?> は <?php echo $ans; ?> です。 </body> </html>
確認できるように、これらのファイルは、このサイトに 置きました。
puppeteer のコード
テスト用の html は、足し算と引き算をするフォームと、details タグを使った詳細表示があります。これを puppetter で操作したいと思います。以下のコードになります。
#!/usr/bin/node const puppeteer = require("puppeteer-core"); const URL = "https://sirius10.net/SampleCode/Puppeteer/puppeteer_test.html"; (async () => { console.log("*** Start ***"); console.log("Chromium 起動"); const browser = await puppeteer.launch({ headless: false, slowMo: 50, executablePath: "/usr/bin/chromium-browser" }); const page = await browser.newPage(); await page.setViewport({ width: 640, height: 400 }); console.log(URL + " へ移動"); await page.goto(URL); await page.screenshot({ path: "1,開いた直後の画面.png" }); // detail を開く await page.click('details'); await page.screenshot({ path: "2,detail タグを開く.png" }); // テキストボックスに入力 await page.type('input[name="a"]', '12'); await page.type('input[name="b"]', '13'); await page.screenshot({ path: "3,text ボックスに入力.png" }); // submit ボタンを押す await page.click('button[value="sub"]'); await page.screenshot({ path: "4,引き算の結果.png" }); console.log("Chromium 終了"); await browser.close(); console.log("*** End ***"); })();
コードの説明
まず、html を開きます。
await page.goto(URL);
の部分です。

次に details タグをクリックさせて詳細を表示します。puppeteer では次のコードの部分です。
await page.click('details');
この html の中に、details タグは一つしか無いので、タグ名だけ指定してクリックすることができます。

次にフォームのテキストボックスに数字を入力します。input 要素ですが、複数あるので、name 属性を使って区別します。次の部分です。
await page.type('input[name="a"]', '12');
await page.type('input[name="b"]', '13');

次にフォームのボタンをクリックするのですが、ボタンが2つあるので、区別する必要があります。html では次のようになっているので、value 属性で区別します。
<button type="submit" name="action" value="add">足す</button> <button type="submit" name="action" value="sub">引く</button>
puppeteer のコードでは次の部分です。引くのボタンをクリックします。
await page.click('button[value="sub"]');

id や class がなくても、他の属性を使って要素を特定できれば操作することができました。もっと複雑な場合の指定方法はまた別の記事にします。
ディスカッション
コメント一覧
まだ、コメントがありません