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?

22
demandé sur Aleksandr Golubovskij 2017-11-21 10:46:23

5 réponses

page.$x (expression):

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.

31
répondu tokland 2018-09-13 07:39:42

la solution est

(await page.$$eval(selector, a => a
            .filter(a => a.textContent === 'target text')
))[0].click()
4
répondu Alex A 2018-03-26 11:21:04

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();
});
3
répondu Grant Miller 2018-07-29 03:41:46

Voici ma solution:

let selector = 'a';
    await page.$$eval(selector, anchors => {
        anchors.map(anchor => {
            if(anchor.textContent == 'target text') {
                anchor.click();
                return
            }
        })
    });
1
répondu Kamen 2018-03-16 14:20:46

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.

-3
répondu Raul Rueda 2017-11-21 22:03:41