2
votes

Impossible de faire attendre mon script sous condition

J'ai essayé d'écrire un script en python en combinaison avec du sélénium pour attendre qu'un certain élément soit disponible. Le contenu que je souhaite que mon script attende est protégé par captcha. Je ne veux pas fixer une heure fixe. Donc, j'en ai besoin pour attendre que je puisse me résoudre.

J'ai essayé comme:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:

Mais, le script renvoie une erreur:

import time
from selenium import webdriver

URL = "https://www.someurl.com/"

driver = webdriver.Chrome()
driver.get(URL)
while not driver.find_element_by_css_selector(".listing-content"):
    time.sleep(1)

print(driver.current_url)
driver.quit()

Comment puis-je faire attendre mon script jusqu'à ce que l'élément soit disponible, peu importe le temps que cela prend?


7 commentaires

Avez-vous essayé d'exécuter la fonction find_elment_by_css_selector dans un bloc try / except dans votre boucle while?


pouvez-vous boucler pendant que captcha présente?


Oui, j'ai essayé de cette façon @QHarr. Le script renvoie une erreur dès que je résolve ce captcha car cette boucle while n'existe plus et cette ligne driver.find_element_by_css_selector (". Listing-content") renvoie la même erreur (cosider que le sélecteur contient élément captcha).


Même chose dans un bloc try?


Je ne peux pas organiser ce bloc try / except de la bonne manière. Comment essayer / exclure le bloc peut-il s'exécuter indéfiniment?


@ robots.txt Avec quel type de captcha avez-vous affaire? Captcha de texte simple?


Non, ils sont de type vicieux comme google @DebanjanB.


3 Réponses :


1
votes

Vous devriez utiliser WebDriverWait:

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

element = WebDriverWait(driver, 10000).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".listing-content")))

Il n'attendra pas indéfiniment, mais vous pouvez définir le délai d'expiration élevé. Sinon, vous pouvez essayer d'utiliser l'instruction WebDriverWait dans une boucle.


0 commentaires

2
votes

Si vous ne voulez pas coder en dur le temps d'attente, vous pouvez utiliser ExplicitWait avec float ("inf") qui en Python signifie INFINITY :

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

wait(driver, float("inf")).until(EC.presence_of_element_located((By.CLASS_NAME, "listing-content")))


0 commentaires

2
votes

Comme vous avez demandé comment organiser le bloc try / except, voici une idée. Je suggérerais cependant de m'en tenir à la méthode inf-wait.

while True:
    try:
        driver.find_element_by_css_selector(".listing-content")
        break
    except:
        time.sleep(0.1)

J'inclurais l'instruction time.sleep () pour minimiser votre nombre d'appels de fonction.


1 commentaires

if ret: est redondant ici: break sera exécuté UNIQUEMENT si ret = driver.find_element_by_css_selector (". listing-content") ne le fait pas lever une exception