puppeteerでユーザーによるクリックを待つ


ユーザーによるクリックなどのイベントををpuppeteerで待ちたい

闇が深い場面な気はしますがpuppeteerを使ってクリックや入力などのイベントを受け取りたいことがあったとします。

そんな時にイベントを検知するスクリプトに苦戦したので関数として書き残しておきます。Promiseに対してresolveするだけの関数を作りpage.exposeFunctionで関数を公開し、evaluateで公開した関数をaddEventListenerを使って登録します。
半自動でパスワードなどは入力させたい時なんかに使ってください。
引数のmyEventNameは複数回実行する時に被らなければ何でも構いません。

script.js
async function waitEvent(page,myEventName,eventType,elementId){
    return new Promise(async resolve=>{
        await page.exposeFunction(myEventName,()=>{resolve(myEventName);});
        await page.evaluate((elementId,eventType,myEventName)=>{
            document.getElementById(elementId).addEventListener(eventType,()=>{
                eval('window.'+myEventName+'();');
            });
        },elementId,eventType,myEventName);
    });
}

使い方

使用例です。
クリック以外のイベントにも使えます。
要素のイベントでは無い物が欲しければobserve等使えば行けるとは思います。

example.js
var result_input = await waitEvent(page,'myclickEvent','click','buttonId');

jQueryのval()などからの変更はプログラム側から意図的にイベントが発生させない限り反応できないらしい。