Je me demande s'il existe une manière similaire à celle de Selenium d'attendre que le texte apparaisse pour un élément particulier. J'ai essayé quelque chose comme ça, mais cela ne semble pas attendre:
await page.waitForSelector('.count', {visible: true});
Vous pouvez utiliser waitForFunction
. Voir https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagewaitforfunctionpagefunction-options-args
Y compris la solution de @ elena pour l'exhaustivité de la réponse:
await page.waitForFunction('document.querySelector(".count").innerText.length == 7');
Outre la méthode présentée dans la réponse de nilobarp, il existe deux autres façons de procéder:
Utilisation du pseudo-sélecteur :empty
il est possible de trouver des éléments qui ne contiennent ni nœuds enfants ni texte. En combinant cela avec le :not
sélecteur, nous pouvons utiliser page.waitForSelector
pour rechercher un sélecteur qui n'est pas vide:
await page.waitForSelector('.count:not(:empty)');
Si vous souhaitez non seulement vous assurer que l'élément n'est pas vide, mais également vérifier le texte qu'il contient, vous pouvez utiliser une expression XPath à l'aide de page.waitForX
:
await page.waitForXPath("//*[@class='count' and contains(., 'Expected text')]");
Cette ligne ne sera résolue qu'après la présence d'un élément sur la page ayant l'attribut class="count"
et contient le texte Expected text
.
Vous pouvez également simplement utiliser page.waitFor()
pour passer une fonction ou Sélecteur CSS à attendre.
Attendre la fonction
Si l'élément est un champ input
, nous pouvons vérifier que l'élément .count
Existe avant de vérifier qu'un value
est présent pour éviter les erreurs potentielles:
await page.waitFor(() => {
const count = document.querySelector('.count');
return count && count.value.length;
});
Si l'élément n'est pas un champ input
, nous pouvons vérifier que le .count
L'élément existe avant de vérifier que innerText
est présent pour éviter les erreurs potentielles:
await page.waitFor(() => {
const count = document.querySelector('.count');
return count && count.innerText.length;
});
Attendre le sélecteur CSS
Si l'élément est un champ input
qui contient un placeholder
, et que vous souhaitez vérifier si un value
existe actuellement, vous pouvez utiliser :not(:placeholder-shown)
:
await page.waitFor('.count:not(:placeholder-shown)');
Si l'élément est un champ input
qui ne contient pas placeholder
, et vous voulez vérifier si l'attribut value
contient une chaîne, vous pouvez utiliser :not([value=""])
:
await page.waitFor('.count:not([value=""])');
Si l'élément est pas un champ input
qui n'a pas de nœuds d'élément enfant, nous pouvons utiliser :not(:empty)
pour attendre que l'élément contienne du texte:
await page.waitFor('.count:not(:empty)');
Attendez XPath
Sinon, vous pouvez utiliser page.waitForXPath()
pour attendre une expression XPath pour localiser les éléments sur la page.
Les expressions XPath suivantes fonctionneront même s'il existe des classes supplémentaires présentes sur l'élément autres que count
. En d'autres termes, cela fonctionnera comme .count
, Plutôt que [class="count"]
.
Si l'élément est un champ input
, vous pouvez utiliser l'expression suivante pour attendre que l'attribut value
contienne une chaîne:
await page.waitForXPath('//*[contains(concat(" ", normalize-space(@class), " "), " test ") and string-length(@value) > 0]')
Si l'élément n'est pas un champ input
, vous pouvez utiliser l'expression suivante pour attendre l'élément pour contenir du texte:
await page.waitForXPath('//*[contains(concat(" ", normalize-space(@class), " "), " count ") and string-length(text()) > 0]');
La meilleure solution que vous pouvez faire en utilisant waitForFunction()
(évitez la fonction bizarre comme chaîne):
const selector = '.count';
await page.waitForFunction(
selector => document.querySelector(selector).value.length > 0,
{},
selector
);
Dépend du type de texte, remplacez value
par innerText
.
Vérifier API marionnettiste