PHP 初心者が WordPress の プラグイン 作成 ! part23 ( ヘッドレスブラウザでココナラのログインに挑戦 その2)

この記事では PHP 初心者 が WordPress プラグイン を 作成 します。 part23 ではヘッドレスブラウザでココナラのログインに再度挑戦します。

前回はうまくできそうな感じだったのですが画面遷移部分でタイムアウトしてしまってエラーになりました。

PHP 初心者が WordPress の プラグイン 作成 ! part22 ( ヘッドレスブラウザでココナラのログインに挑戦 )

この問題はヘッドレスブラブラウザの操作がうまくいった時から起こっていた問題です。

ヘッドレスブラウザが画面遷移でタイムアウト

よくタイムアウトするのは以下のコードです。

$evaluation = $page->evaluate('document.querySelector("li.c-mainNavBeforeLogin_item-pc a:first-child").click()')->waitForPageReload();
$evaluation = $page->evaluate('document.querySelector("form#UserLoginForm button[type=\"submit\"]").click()')->waitForPageReload();

調査したところ、タイムアウトする時間を調整できるということがわかりました。
またもう一つの方法として例外をハンドリングするということ回避できるということです。

Chrome PHP 覚書 | FH_BLOG | フライング・ハイ・ワークス (flying-h.co.jp)

今回使用しているライブラリをのぞいてみることにしました。

/var/www/html/vendor/chrome-php/chrome/src/PageUtils/PageEvaluation.php

    /**
     * If the script requested a page reload this method will help to wait for the page to be fully reloaded
     */
    public function waitForPageReload($eventName = Page::LOAD, $timeout = 30000)
    {
        $this->page->waitForReload($eventName, $timeout, $this->pageLoaderId);
    }

デフォルトで第一引数は Page::LOAD, 第二引数は30,000となっています。
情報によると・・・

Page::DOM_CONTENT_LOADED:domが完全に読み込まれる
Page::LOAD:(デフォルト)ページとすべてのリソースが読み込まれる
Page::NETWORK_IDLE:ページが読み込まれ、少なくとも500ミリ秒間ネットワーク上の通信が発生していない

とのことです。ページとすべてのリソースは読み込まなくてもDOMだけでいいですよね。きっと😙

実装

ということで以下のように修正してみました。

DOMが完全に読み込まれるまで30秒待機します。

$evaluation = $page->evaluate('document.querySelector("li.c-mainNavBeforeLogin_item-pc a:first-child").click()')->waitForPageReload(Page::DOM_CONTENT_LOADED, 60000);
$evaluation = $page->evaluate('document.querySelector("form#UserLoginForm button[type=\"submit\"]").click()')->waitForPageReload(Page::DOM_CONTENT_LOADED, 60000);

確認

それでは早速確認してみましょう!

http://localhost:8099/index.php

ダメでした😑

Uncaught Error: Class "Page" not found in /var/www/html/index.php:37

Pageクラスなんて知らないよ!ということでしょうか。うーむ

それならばと以下を追加です。

use HeadlessChromium\Page;

使用宣言してみました。
これでどうでしょう。

Pageクラスの件はうまくいったようですがボタンクリック部分でやはりタイムアウトします。
もしかしてうまくボタンが押せていない?

Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (60sec) in /var/www/html/vendor/chrome-php/chrome/src/Utils.php:69
Stack trace:
#0 /var/www/html/vendor/chrome-php/chrome/src/Page.php(349): HeadlessChromium\Utils::tryWithTimeout(60000000, Object(Generator))
#1 /var/www/html/vendor/chrome-php/chrome/src/PageUtils/PageEvaluation.php(64): HeadlessChromium\Page->waitForReload('DOMContentLoade...', 60000, 'C6B2B1DCF425419...')
#2 /var/www/html/index.php(45): HeadlessChromium\PageUtils\PageEvaluation->waitForPageReload('DOMContentLoade...', 60000)
#3 {main}

まとめ

ヘッドレスブラウザでココナラのログインに挑戦しました。
またしても失敗!まだ何とも言えませんがおそらくクリックに失敗しているようです。
ただどうやって確認すればよいか😪

また次回がんばります。
今日はここまで!