はじめに
こんばんは。
今回は、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
同じくこのエラーが出ている場合は、セキュリティソフトの可能性があるので、見てもらえたらと思います!
現場からは以上です。