8
votes

Testez le contenu chargé de manière dynamique avec le pilote Web Selenium

Je travaille sur un système qui a une frontend basée sur le Web que je teste avec sélénium. Sur une seule page, le contenu est chargé de manière dynamique lors du défilement (vous savez peut-être que de la liste d'amis de Facebook), car c'est l'une des conditions requises.

Faites défiler vers le bas avec Selenium WebDriver (J'utilise Chrome) ne doit pas être un problème via JavaScript . Mais il y a un problème avec le contenu ajouté de manière dynamique. Comment puis-je rendre le webDriver à trouver ces éléments?

J'ai essayé ce qui suit pour faire défiler jusqu'à ce que plus aucun contenu ne soit chargé: xxx

mais bien que la page Fait défiler la première fois et certains sont maintenant chargés correctement, ils ne seront pas trouvés par la fonction FindElements des pilotes (par).

a déjà fait face à ce problème ?? Je serais très heureux que quelqu'un puisse m'aider à jouer une solution pour cela!

Cordialement, Benjamin


1 commentaires

Je vais devoir faire défiler vers le bas afin de charger les éléments (via Ajax). Comme je l'ai dit, j'utilise ChromeRiver.


3 Réponses :


0
votes

Je pense que le problème attend que le contenu dynamique finisse le chargement. Essayez d'attendre 3 secondes juste avant la Findemplements? En C # le code serait thread.sleep (3000);


2 commentaires

bonne idée, essayé de l'avoir essayé ... Les Fondelements remettent toujours les éléments qui ont été chargés depuis le début sur


@Benjamin: Avez-vous essayé une fois plus longtemps comme 5 secondes? Pourriez-vous vérifier en séléniumide que le sélecteur CSS fonctionne lorsque l'élément est présent? Je ferais un test dans l'IDE, mais il est difficile de simuler le défilement - vous pouvez essayer KeyPress | xpath = / html / corps / | 34 (KeyCode 34 est un pagedown), puis WaitForElementpresent ...



4
votes

Je recommanderais d'utiliser WebDriverwait avec les ConditTons attendus.

//scroll down with Javascript first
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector")));
//interact with your element
element.click()


1 commentaires

+1. Pas une mauvaise approche, mais me semble mieux choisir de choisir couramment l'attente de cette affaire.



1
votes

Essayez d'utiliser Fluent Wait en particulier. La principale caractéristique est la suivante:

une implémentation de l'interface d'attente pouvant avoir son délai d'attente et son intervalle de vote configuré à la volée. Chaque instance flueures définit la durée maximale pour attendre une condition, ainsi que la fréquence avec laquelle vérifier la condition. En outre, l'utilisateur peut configurer l'attente pour ignorer des types d'exceptions spécifiques tout en attendant, telles que NosuchelementExceptions à la recherche d'un élément sur la page. Em> p> xxx pré>

la méthode Décrit renvoie votre élément Web que vous pouvez utiliser avec. Donc, l'approche est la suivante: 1) Vous devez trouver les sélecteurs d'éléments que vous attendez d'être rendus après le défilement par exemple. p> xxx pré>

2) faites défiler vers le bas avec JS 3) P>

WebElement neededElement  = fluentWait(cssSelector);
neededElement.click();
//neededElement.getText().trim();


5 commentaires

Je n'ai qu'une seule question - comment fonctionne-t-elle une nouvelle fonction en Java en considérant qu'il n'y a pas de modèles de fonctions? L'exemple ci-dessus est mentionné dans Selenium Javadocs également, mais Javac me donnera un symbole impossible de trouver un symbole: la fonction de classe - J'aimerais comprendre quelle partie j'ai manqué de saisir pour me permettre d'utiliser directement l'approche ci-dessus.


Pourriez-vous me clarifier un peu: que mentionnez-vous dire de la fonction de fonction en Java?


Je ne suis pas sûr de quoi vous voulez dire exactement dire «Modèle de fonction» mais nouvelle fonction () {crée une instance de classe anonyme transmise à Wait.untitil fonction est définie dans l'API Selnium. jusqu'à ce que (com.google.common.base.function IsTrue) applique à plusieurs reprises la valeur d'entrée de cette instance à la fonction donnée jusqu'à ce que l'une des tâches suivantes se produise: la fonction ne renvoie ni NULL ni faux, la fonction jette une injuste. Exception, le délai d'attente expire, le thread actuel est interrompu des problèmes de complie - il semble que vous n'ayez pas correctement configurant les paramètres IDE correctement (IMHO)


SELENIUM.GOOGLECODE. com / svn / coffre / docs / API / Java / org / openqa / ... Essayez de vous renseigner sur la nouvelle fonction définie dans l'API de selenium ici


Vous avez raison, j'ai été confondu avec deux trois concepts :) Merci pour la réponse du patient