web-dev-qa-db-ja.com

操り人形師:Ajaxリクエストを待って結果を処理する方法

だから私はウェブサイトを開き、すべてのリダイレクトが行われるのを待ってキャプチャ画像をキャプチャし、nodejsを介してユーザーに送信して入力されたキャプチャを受信します

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

    await page.goto('http://localhost/p1.php' );
    await page.waitForNavigation();

    const captcha_image = await page.$eval('#security', e => e.getAttribute('src'));

    io.emit('send_captcha_to_client' , {text : captcha_image });

    var captcha = await captchaPromise;

入力したcapthcaの値をフィールドに入力して、ログインボタンをクリックします

    await page.$eval('#W_CAPTCHA', (el , _captcha) => el.value = _captcha.W_CAPTCHA , captcha );

    await page.click('#login-btn');

ボタンをクリックすると、ajaxリクエストがサーバーに送信され、http://example.com/login.php ...そして、キャプチャが正しい場合、ダッシュボードにリダイレクトされますが、ajax呼び出しが戻る場合は{status:er}と言います

そこには <span id="alert"></span>ページに追加します.Errorクラスにそれとそこにエラーテキストを入れて...どのように私はajaxコールをインターセプトし、ログインが成功したかどうかを確認できますか?

ajax呼び出しの結果を確認するか、ドキュメントを待ってdiv.Errorしかし、どうすればそれらを行うことができるかわからない..ここに私の失敗した試みです!

await page.waitForNavigation();

page.waitForSelector('.Error');
const error  = await page.$eval('.Error', e => e.value );

console.log(error);

browser.close();
6
hretic

両方を同時に待機し、最初に発生したものを処理できます。

await Promise.race([
  page.waitForNavigation({ waitUntil: "networkidle0" }),
  page.waitForSelector(".Error")
]);

if (await page.$(".Error")) {
  // there was an error
} else {
  // the page changed
}
16
Aankhen