Marionnettiste: Cliquez sur l'élément avec le texte
y a-t-il une méthode(pas trouvé dans L'API) ou une solution pour cliquer sur l'élément avec du texte?
Par exemple, j'ai le html:
<div class="elements">
<button>Button text</button>
<a href=#>Href text</a>
<div>Div text</div>
</div>
Et je veux cliquez sur l'élément dans lequel le texte est justifié(Cliquez sur le bouton à l'intérieur .des éléments), de la forme:
Page.click('Button text', '.elements')
Aucune solution?
5 réponses
const linkHandlers = await page.$x("//a[contains(text(), 'Some text')]");
if (linkHandlers.length > 0) {
await linkHandlers[0].click();
} else {
throw new Error("Link not found");
}
découvrez clickByText
dans ce gist pour un exemple complet. Il prend soin d'échapper aux citations, ce qui est un peu délicat avec les expressions XPath.
la solution est
(await page.$$eval(selector, a => a
.filter(a => a.textContent === 'target text')
))[0].click()
vous pouvez aussi utiliser page.evaluate()
cliquer sur des éléments obtenus à partir de document.querySelectorAll()
qui ont été filtrés par le texte contenu:
await page.evaluate( () =>
{
Array.from( document.querySelectorAll( '.elements button' ) ).filter( element => element.textContent === 'Button text' )[0].click();
});
Alternativement, vous pouvez utiliser page.evaluate()
pour cliquer un élément basé sur son contenu texte en utilisant document.evaluate()
et une expression XPath correspondante:
await page.evaluate( () =>
{
const xpath = '//*[@class="elements"]//button[contains(text(), "Button text")]';
const result = document.evaluate( xpath, document, null, XPathResult.ANY_TYPE, null );
result.iterateNext().click();
});
Voici ma solution:
let selector = 'a';
await page.$$eval(selector, anchors => {
anchors.map(anchor => {
if(anchor.textContent == 'target text') {
anchor.click();
return
}
})
});
la première chose et la manière facile serait d'ajouter un ID au bouton de sorte que vous êtes sûr que vous allez cliquer sur le bouton correct.
dans ce cas, j'utiliserai deux fonctions de marionnettiste et une condition:
let my_button = await page.$eval(".elements > button", btn => btn.textContent);
if(my_button == "Button text") {
await page.click(".elements > button");
}
il suffit de vérifier s'il n'y a pas plus de divs avec la même classe ".les éléments", dans ce cas, utilisez un autre et spécifiques sélecteur. Je suis sûr qu'il ya des solutions plus propres, mais aussi je suis nouveau en utilisant puppeteer.