web-dev-qa-db-fra.com

marionnettiste: comment puis-je attendre la demande ajax et traiter le résultat

donc j'ouvre un site web, waith pour toutes les redirections à faire capturer l'image captcha et l'envoyer à nodejs à un utilisateur et recevoir le captcha tapé

    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;

après avoir reçu la valeur tapée de capthca, je l'ai mise dans le champ et cliquez sur le bouton de connexion

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

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

maintenant, après avoir cliqué sur le bouton, une requête ajax sera envoyée au serveur, disons http://example.com/login.php ... et si le captcha a raison, je serai redirigé vers mon tableau de bord mais si l'appel ajax revient, disons {status: er}

et voici <span id="alert"></span> dans la page, il ajoutera .Error classe à elle et y mettre le texte d'erreur ... comment puis-je intercepter l'appel ajax et vérifier si la connexion a réussi ou non?

je peux cehck le résultat de l'appel ajax ou attendre et vérifier le document pour div.Error mais je ne sais pas comment puis-je faire l'un d'eux .. voici ma tentative ratée!

await page.waitForNavigation();

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

console.log(error);

browser.close();
6
hretic

Vous pouvez attendre les deux simultanément et gérer ce qui se produit en premier:

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

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