recherche

Maison  >  Questions et réponses  >  le corps du texte

Dans le navigateur Puppeteer, comportement de fermeture inattendu après avoir cliqué sur le bouton Cookie Accepter

<p>J'essaie d'utiliser node.js et puppeteer pour explorer un site Web pour obtenir des informations sur le football en temps réel, mais après console.log("trying to select team element"), mon navigateur se ferme immédiatement. </p> <pre class="brush:php;toolbar:false;">const marionnettiste = require("marionnettiste"); fonction asynchrone openPage() { const navigateur = wait puppeteer.launch( {headless: true} ); const page = attendre navigateur.newPage(); wait page.setViewport({ largeur : 1000, hauteur : 926 }); attendre page.goto("https://www.livescore.com/en/"); //Accepter les cookies bouton const = attendre page.waitForSelector('#onetrust-accept-btn-handler'); si (bouton) { attendre le bouton.click(); console.log("clic sur le bouton cookie"); } ; page de retour ; } fonction asynchrone scrapeData (page) { laissez contenu = []; // Récupère les éléments du concours let elements = attendre page.waitForSelector(".Ip") console.log("essayer de sélectionner un élément d'équipe") pour (soit i=0; i < elements.length; i++) { laissez homeTeamElement = attendre les éléments[i].$(".Ip") si (homeTeamElement) { const homeTeamText = wait homeTeamElement.evaluate(node ​​​​=> node.textContent); content.push(homeTeamText); } } ; renvoyer du contenu ; } ; (async () => { const page = attendre openPage(); const dataScraped = wait scrapeData(page); console.log(dataScraped) attendre page.browser().close(); })();</pre> <p>Toutes les idées sur les raisons pour lesquelles c'est le cas et toute autre critique de mon code sont les bienvenues ! </p>
P粉883278265P粉883278265475 Il y a quelques jours462

répondre à tous(1)je répondrai

  • P粉798010441

    P粉7980104412023-08-17 17:50:42

    await page.waitForSelector(".Ip")只返回一个元素,而不是一个数组,所以无法循环遍历。应该有一个清晰的错误消息来解释这个问题。相反,可以使用page.$$eval (ou si vous souhaitez essayer la dernière Locator API) pour extraire les données.

    const puppeteer = require("puppeteer"); // ^21.0.2
    
    const url = "";
    
    let browser;
    (async () => {
      browser = await puppeteer.launch();
      const [page] = await browser.pages();
      await page.setViewport({width: 1000, height: 926});
      await page.goto(url, {waitUntil: "domcontentloaded"});
    
      // not really necessary
      const button = await page.waitForSelector("#onetrust-accept-btn-handler");
      await button.click();
    
      await page.waitForSelector(".Ip");
      const content = await page.$$eval(".Ip", els =>
        els.map(e => {
          const text = id =>
            e.querySelector(`[id*=${id}]`).textContent.trim();
          return {
            time: text("status-or-time"),
            home: text("home-team-name"),
            away: text("away-team-name"),
            homeTeamScore: +text("home-team-score"),
            awaitTeamScore: +text("away-team-score"),
          };
        })
      );
      console.log(content);
    })()
      .catch(err => console.error(err))
      .finally(() => browser?.close());
    

    Remarque :

    • La désactivation de la bannière des cookies n'est pas nécessaire pour l'exploration, mais si vous l'utilisez, il n'est pas nécessaire de vérifier la valeur de retour de waitForSelector. Il est garanti qu'il s'agit de l'élément, sinon il lèvera une exception s'il n'est pas trouvé dans le délai spécifié.
    • await elements[i].$(".Ip")不会帮助你访问任何内容,因为在你已经持有的.Ip元素内部没有.Ip.
    • Évitez d'utiliser ElementHandles, ils sont lents, peu fiables et verbeux.

    répondre
    0
  • Annulerrépondre