web-dev-qa-db-fra.com

Marionnettiste: Obtenir le code HTML interne

est-ce que quelqu'un sait comment obtenir le innerHTML ou le texte d'un élément? Ou même mieux; comment cliquer sur un élément avec un innerHTML spécifique. Voici comment cela fonctionnerait avec du javascript normal:

var found = false
$(selector).each(function() {
                if (found) return;
                else if ($(this).text().replace(/[^0-9]/g, '') === '5' {
                    $(this).trigger('click');
                    found = true
                }

Merci d'avance pour votre aide!

10
Noah

Voici comment je reçois innerHTML:

page.$eval(selector, (element) => {
  return element.innerHTML
})
14
Ryan

Cela devrait fonctionner avec le marionnettiste :)

const page = await browser.newPage();
const title = await page.evaluate(el => el.innerHTML, await page.$('h1'));
5
E. Fortes

En ce qui concerne cette partie de votre question ...

"Ou mieux encore, comment cliquer sur un élément avec un innerHTML spécifique."

Certains détails autour de innerHTML, de innerText et de textContent peuvent vous causer du chagrin. Ce que vous pouvez contourner en utilisant une requête XPath suffisamment lâche avec Puppeteer v1.1.1

Quelque chose comme ça:

const el = await page.$x('//*[text()[contains(., "search-text-here")]]');
await el[0].click({     
                button: 'left',
                clickCount: 1,
                delay: 50
            });

N'oubliez pas que vous obtiendrez un tableau de ElementHandles à partir de cette requête. Donc… l'élément que vous recherchez peut ne pas être à [0] si votre texte n'est pas unique. 

Les options passées à .click () ne sont pas nécessaires si tout ce dont vous avez besoin est un simple clic gauche.

3
rwinscot

Vous pouvez utiliser la fonction page.$$(selector) pour obtenir tous vos éléments cibles, puis utiliser page.evaluate() pour obtenir le contenu (innerHTML), puis appliquer vos critères. Cela devrait ressembler à quelque chose comme: 

const targetEls = await page.$$('yourFancySelector');
for(let target of targetEls){
  const iHtml = await page.evaluate(el => el.innerHTML, target); 
  if (iHtml.replace(/[^0-9]/g, '') === '5') {
    await target.click();
    break;
  }
}
3
Leon li

Vous pouvez simplement écrire comme ci-dessous. (pas besoin d'attendre la phrase dans la dernière partie) const center = await page.$eval('h2.font-34.uppercase > strong', e => e.innerHTML);

0
Naga

Je ne peux jamais obtenir le .innerHtml au travail fiable. Je fais toujours ce qui suit:

let els = page.$$('selector');
for (let el of els) {
  let content = await (await el.getProperty('textContent')).jsonValue();
}

Ensuite, vous avez votre texte dans la variable 'content'.

0
JMDE