0
votes

Existe-t-il un moyen d'implémenter les attentes de sélénium dans une déclaration while?

J'écris un script qui est constamment en boucle et devra s'arrêter lorsqu'il détectera qu'il y a du texte dans un certain élément de la page. Je n'ai trouvé aucune aide dans la documentation sur le sélénium python à ce sujet, mais il doit y avoir un moyen. Au cas où vous ne comprenez toujours pas ce que je dois faire, voici un code:

While #element is not visible:
   #do stuff
#when element is visible break out of statement and do something else

EDIT: Je connais le texte exact et le xpath exact de l'élément que je recherche. Cependant, je cherche juste une réponse générale, donc je ne crains pas une réponse manquant de détails.


2 commentaires

Votre problème n'est pas tout à fait clair. Savez-vous quel élément exactement doit contenir du texte? Connaissez-vous le texte complet ou seulement partiel? Combien de temps faut-il pour attendre le texte requis? Ajoutez plus de détails à votre question


@JaSON ok je vais éditer


5 Réponses :


-2
votes

Essayez le code ci-dessous, cela vous aidera sûrement.

from selenium import webdriver

driver = webdriver.Chrome(executable_path=r'/path/chromedriver')
driver.get('https://example.com')
condition = driver.find_element_by_<METHOD>('<|Element|>')
while not condition:
     <<..yourWork..>>


1 commentaires

Ce code ne prend pas en compte ce que l'OP a demandé ... alors que l'élément n'est pas visible, faites des choses. Votre "condition" vérifie la valeur nulle, non visible.



-1
votes

Je suis en train de coder en C # pour Selenium et je ne l'ai jamais utilisé dans une boucle while, mais j'utilise l'attente implicite pour que mes tests attendent que l'élément que je recherche soit disponible. La fonction est assez facile à écrire mais je ne sais pas si cela fonctionnera pour vous.

_ = driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);

Fondamentalement, ce que cela fait, c'est que Selenium attend que l'élément soit disponible ou 30 secondes au total, puis il échoue au test si l'élément n'est pas disponible.


1 commentaires

Ce n'est pas ce que fait ce code. Votre code publié définit un délai d'expiration unique pour l'instance de pilote à 30 secondes. L'appeler encore et encore ne fait rien. Il n'attend pas vraiment quand vous l'appelez. Les attentes implicites sont également une mauvaise pratique selon les contributeurs de Selenium.



0
votes

Vous pouvez essayer la condition attendue text_to_be_present_in_element et implémenter ExplicitWait comme ci-dessous:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get(URL)

timeout = <SET MAXIMUM AMOUNT OF TIME IN SECONDS TO WAIT> 
your_text = '<REQUIRED TEXT>'

element = WebDriverWait(driver, timeout).until(EC.text_to_be_present_in_element((By.ID, "<ElementID>"), your_text))

Cela renverra l'élément dès que le texte requis est apparu


1 commentaires

Le code de l'OP montre qu'il veut exécuter du code en boucle. Cette approche ne permettra pas cela.



0
votes

Le code ci-dessous obtiendra l'élément souhaité puis bouclera jusqu'à ce qu'il soit affiché (visible). À la fin de la boucle, vous voudrez probablement récupérer l'élément (au cas où la page changerait) avant de vérifier s'il est affiché en haut de la boucle.

element = driver.find_element_by_XXX(locator)
while not element.is_displayed():
    #do stuff
    element = driver.find_element_by_XXX(locator)
#when element is visible break out of statement and do something else

J'ajouterais également que vous souhaitez probablement avoir une boucle d'échappement au cas où l'élément ne deviendrait jamais visible. Vous feriez cela en obtenant l'heure actuelle avant d'entrer dans la boucle, puis en vérifiant la condition while qui vérifie que cela ne fait pas plus de 30 secondes depuis l'heure de début. De cette façon, votre script ne reste pas coincé dans une boucle sans fin.


0 commentaires

0
votes

Pour continuer en boucle et s'arrêter lorsque Selenium détecte qu'il y a du texte dans un certain élément de la page, vous pouvez utiliser la stratégie de localisation suivante:

while True:
    try:
        WebDriverWait(driver, 5).until(EC.invisibility_of_element((By.XPATH, "element_xpath")))
        #do stuff
        continue
    except:
        break
#do something else


0 commentaires