はじめに
こんばんは。
今回は、Web+DB Press vol.118で紹介されていた PuPHPeteer を試してみました。
- 発売日: 2020/08/24
- メディア: Kindle版
本を見るまで、存在も知りませんでした。
本では、 E2Eテストを実行するところまで丁寧に説明されていますが、今回は PuPHPeteer を試すところまでやりました。
本題
環境構築
$ mkdir puphpeteer-example $ cd puphpeteer-example $ npm init $ npm install @nesk/puphpeteer $ composer init $ composer require nesk/puphpeteer
example1 (ページを開いてみる)
このブログを開いて、スクショを撮ってみます。
<?php require_once './vendor/autoload.php'; $puppeteer = new \Nesk\Puphpeteer\Puppeteer(); $browser = $puppeteer->launch(); $page = $browser->newPage(); $page->goto('https://kojirooooocks.hatenablog.com/'); $page->screenshot(['path' => 'example.png']); $browser->close();
出来ました!
example2 (検索フォームを実行してみる)
<?php require_once './vendor/autoload.php'; $puppeteer = new \Nesk\Puphpeteer\Puppeteer(); $browser = $puppeteer->launch(); $page = $browser->newPage(); $page->goto('https://kojirooooocks.hatenablog.com/'); $page->type('.search-module-input', 'laravel'); $page->click('.search-module-button'); $page->screenshot(['path' => 'example2.png']); $browser->close();
検索も問題なさそうです。
example3 (スクショのサイズ大きくする)
<?php require_once './vendor/autoload.php'; $puppeteer = new \Nesk\Puphpeteer\Puppeteer(); $browser = $puppeteer->launch(); $page = $browser->newPage(); $page->setViewport([ 'width' => 1080, 'height' => 1920 ]); $page->goto('https://kojirooooocks.hatenablog.com/'); $page->type('.search-module-input', 'laravel'); $page->click('.search-module-button'); $page->screenshot(['path' => 'example3.png']); $browser->close();
画像が大きくなりました。
example4 (指定要素の文字を取得)
<?php require_once './vendor/autoload.php'; $puppeteer = new \Nesk\Puphpeteer\Puppeteer(); $browser = $puppeteer->launch(); $page = $browser->newPage(); $page->goto('https://github.com/kojirock5260?tab=repositories'); $repositories = []; foreach ($page->querySelectorAll('.wb-break-all') as $element) { $repositories[] = trim($element->querySelectorEval('a', \Nesk\Rialto\Data\JsFunction::createWithParameters(['element'])->body('return element.innerHTML') )); } $browser->close(); var_dump($repositories);
$ php example4.php
/path/to/puphpeteer-example/example4.php:18:
array(24) {
[0] =>
string(19) "laravel-breadcrumbs"
[1] =>
string(16) "symfony5_example"
[2] =>
string(14) "paypay-example"
[3] =>
string(11) "tdd-example"
[4] =>
string(14) "nuxt_example01"
[5] =>
string(17) "slack-app-backlog"
[6] =>
string(28) "laravel-json-schema-validate"
[7] =>
string(23) "github_mention_to_slack"
[8] =>
string(4) "docs"
[9] =>
string(14) "type-converter"
[10] =>
string(21) "sample__object-mapper"
[11] =>
string(18) "object-type-parser"
[12] =>
string(24) "simple_line_flex_message"
[13] =>
string(4) "tbls"
[14] =>
string(14) "github_mention"
[15] =>
string(12) "cron-doc-gen"
[16] =>
string(28) "write-blog-every-week-remind"
[17] =>
string(27) "phpunit-snapshot-assertions"
[18] =>
string(13) "sample__react"
[19] =>
string(24) "sample__chatwork-webhook"
[20] =>
string(24) "sample__pillow-draw-text"
[21] =>
string(35) "sample__excel-tool-check-php-python"
[22] =>
string(31) "sample__google_cloud_vision_api"
[23] =>
string(17) "ansible-lamp-php7"
}
なんか無理矢理感、ありますが、なんとか出来ました...w
終わりに
本家の puppeteer はほんの少しだけ触ったことがありましたが、慣れ親しんでいる phpで書けるのはいいですね。
本では実際にphpunitを使ってE2Eテストをするところまで紹介されているので、興味ある方はぜひ!
別件で、ちょっとハマったのが、僕は ESET セキュリティソフトを入れているのですが、このファイヤーウォールが邪魔して、以下のエラーが発生していました。
PHP Fatal error: Uncaught Socket\Raw\Exception: Socket operation failed: Resource temporarily unavailable (SOCKET_EAGAIN) in /path/to/puphpeteer-example/vendor/clue/socket-raw/src/Exception.php:59 Stack trace: #0 /path/to/puphpeteer-example/vendor/clue/socket-raw/src/Exception.php(28): Socket\Raw\Exception::createFromCode() #1 /path/to/puphpeteer-example/vendor/clue/socket-raw/src/Socket.php(247): Socket\Raw\Exception::createFromSocketResource() #2 /path/to/puphpeteer-example/vendor/nesk/rialto/src/ProcessSupervisor.php(409): Socket\Raw\Socket->read() #3 /path/to/puphpeteer-example/vendor/nesk/rialto/src/ProcessSupervisor.php(382): Nesk\Rialto\ProcessSupervisor->readNextProcessValue() #4 /path/to/puphpeteer-example/vendor/nesk/rialto/src/ProcessSupervisor.php(167): Nesk\Rialto\ProcessSupervisor->executeInstruction() #5 [internal function]: Nesk\Rialto\ProcessSupervisor->__ in /path/to/puphpeteer-example/vendor/nesk/rialto/src/ProcessSupervisor.php on line 431 PHP Stack trace: PHP 1. {main}() /path/to/puphpeteer-example/example.php:0
同じくこのエラーが出ている場合は、セキュリティソフトの可能性があるので、見てもらえたらと思います!
現場からは以上です。