もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

PuPHPeteerを試した

はじめに

こんばんは。

今回は、Web+DB Press vol.118で紹介されていた PuPHPeteer を試してみました。

WEB+DB PRESS Vol.118

WEB+DB PRESS Vol.118

  • 発売日: 2020/08/24
  • メディア: Kindle

github.com

本を見るまで、存在も知りませんでした。

本では、 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();

gyazo.com

出来ました!

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();

gyazo.com

検索も問題なさそうです。

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();

gyazo.com

画像が大きくなりました。

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

同じくこのエラーが出ている場合は、セキュリティソフトの可能性があるので、見てもらえたらと思います!

現場からは以上です。