web-dev-qa-db-ja.com

操り人形師の確認

私は操り人形師を学ぼうとしています。ページへのログインといくつかのナビゲーションのスクリプトを作成しました。次に、ボタンをクリックしてもらいます。ページにwindow.confirmが表示され、スクリプトでこれを受け入れて次のステップに進むようにしたいのですが、方法がわかりません。

誰かが私を正しい方向に向けることができますか?

4
Michael Bierman

確認時にダイアログボックスが表示されたら、ここで簡単なテストを実行しました。 Enterキーを押すだけで、ダイアログが閉じます。

操り人形師でできることは、まさにそれを行うことです。確認ボックスのある簡単なウェブページをノックアップしました。

例えば。

<div>Before confirm</div>
<script>
  window.confirm("confirm");
  document.write("<div>After Confirm</div>");
</script>

今、私たちの操り人形師のスクリプト。

await delay(1000);
await page.keyboard.press(String.fromCharCode(13));  
await page.screenshot({path: 'screenshot.png'});
await browser.close();

上記のスクリーンショットを実行すると、

Before confirm
After Confirm

確認ダイアログを押した場合に期待するとおり、.. ps。 delayは、待機するsetTimeoutに基づく単純なpromiseであるため、確認ダイアログが表示される可能性があります。

現在promisedelay機能がない場合は、こちらをご利用ください。

const delay = (ms) =>
  new Promise((resolve) => setTimeout(resolve, ms));

更新:残念ながら、ダイアログはキー押下に確実に応答しません。しかし、puppeterには、添付できるダイアログイベントがあります。

page.on("dialog", (dialog) => {
  console.log("dialog");
  dialog.accept();
});

却下して、送信されたメッセージなどを読むこともできます。詳細はこちら-> https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-dialog

6
Keith

ありがとう、キース!今ではチャームのように機能しています。興味のある方はこちらに投稿しました。

https://Gist.github.com/mbierman/5b3e671fa4e848eec899ff486d0cdc26

#!/usr/bin/env node

/**
 * @name Reboot Arris modem. 
 *
 * @desc Puppeteer script for rebooting an Arris modem. 
 * since the specific navigation for your modem will vary, this 
 * is more of an example and isn't guaranteed to work for your particular
 * modem. 
 * Many thanks to https://stackoverflow.com/users/6870228/keith for his help!
 *
 */

const puppeteer = require('puppeteer')
const screenshot = 'arris.png';

/* Enter your user name and password here between the 's */
const USER = '';
const PASS = '';

    const delay = (ms) =>
    new Promise((resolve) => setTimeout(resolve, ms));

(async () => {

    const browser = await puppeteer.launch({headless: true})
    const page = await browser.newPage()

        console.log("Login...");
    await page.goto('http://192.168.0.1/login.asp');
    await page.type('#id_username', USER, { delay: 10 });
    await page.type('input[type="password"]', PASS, { delay: 10 });
    await page.click('[value="Login"]');
        console.log("Going home...");
    await page.goto('http://192.168.0.1/home.asp');
    await page.click('#alertExitButton');
        console.log("Config...");
    await page.goto('http://192.168.0.1/RgConfiguration.asp');
    console.log('Submit request...');
    page.click('input[type="submit"]');
    console.log('Pause...');

    await page.on("dialog", (dialog) => {
    console.log("Dialog is up...");
        delay(1000);
    console.log("Accepted...");
    dialog.accept();
        delay(1000);
    });

        await delay(3000);
        console.log("Exiting.");
    browser.close();
    process.exit(1);
})()
2
Michael Bierman

確認プロンプトは、_window.confirm_にあるグローバル関数confirm(<string>)によってトリガーされます。この関数は、応答が返されるまでスクリプトの実行をフリーズし、それを呼び出し元に返します。ユーザーがプロンプトを受け入れると、戻り値はtrueになります。

Webページでカスタムブラウザセッションに取り組んでいるので、グローバルを好きなもので上書きできます。

したがって、確認ウィンドウの実行をトリガーするアクションを実行する前に

_await page.evaluate(`window.confirm = () => true`)
_

次に、ページコードがconfirm()を呼び出すと、プロンプトを表示せずにすぐにtrue応答を受け取ります。

1
fiatjaf