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.
5 Réponses :
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..>>
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.
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.
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.
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
Le code de l'OP montre qu'il veut exécuter du code en boucle. Cette approche ne permettra pas cela.
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.
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
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