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?
3 Réponses :
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.
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")))
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.
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
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.