3
votes

Marionnettiste: recherche de texte intérieur insensible à la casse

J'essaie de rechercher le texte intérieur insensible à la casse à l'aide de puppeteer.

J'ai lu ceci: xpath insensible à la casse contient () possible?

Par exemple, j'ai ces éléments:

const element = await page.$x("//span//text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]");

J'ai essayé cela sans succès :

<div>
 <span>Test One</span>
 <span>Test Two</span>
 <span>Test Three</span>
</div>


0 commentaires

3 Réponses :


2
votes

Pas aussi joli, mais vous pouvez utiliser page.evaluateHandle avec une expression régulière pour trouver l'élément:

const element = await page.evaluateHandle(() =>
    Array.from(document.querySelectorAll("div > span")).find(a => /test two/i.test(a.innerText))
);


0 commentaires

4
votes

Votre expression XPath est valide, mais vous renvoyez text () au lieu du nœud lui-même. page. $ x s'attend à ce que XPath renvoie un élément, donc votre code ne fonctionne pas. Pour renvoyer le nœud, vous devez rechercher l'élément span.

//span//text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]
//span[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')
//span[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]

Veuillez noter que text () ne fonctionne que pour les nœuds de texte uniquement. Si vous avez un contenu mixte (contenant des éléments et du texte), vous devez utiliser la valeur de chaîne (. au lieu de text()):

const element = await page.$x("//span[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'two')]");


2 commentaires

Notez que chaque fois que vous avez un contenu mixte (texte et balisage), il est préférable de ne pas utiliser de nœuds de texte mais une valeur de chaîne: cette expression //span[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ',' abcdefghijklmnopqrstuvwxyz '),' deux ')] sélectionnera ce ce EST deux.


@Alejandro Merci pour le commentaire. J'ai ajouté l'expression à la réponse.



0
votes

Semblable à spb, je ferais:

const element = await page.evaluateHandle(() =>
 [...document.querySelectorAll('span')].find(s => s.innerText.toLowerCase().match('two'))
)


0 commentaires