NoSuchElementException et SyntaxError pendant le web-scraping
J'ai quelques difficultés à appliquer cette suggestion pour corriger l'erreur suivante:
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./ancestor-or-self::form"}
obtenu lorsque j'utilise le code suivant:
from selenium import webdriver
query = ' I want to try to translate this text'
chrome_options = webdriver.ChromeOptions('/chromedriver')
driver = webdriver.Chrome()
driver.get('https://translate.google.com/')
search = driver.find_element_by_css_selector('#source')
search.send_keys(query)
search.submit()
Comme expliqué ici: NoSuchElementException - Impossible de localiser l'élément , je devrais utiliser quelque chose comme ça
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("source"));
Mais j'obtiens une SyntaxError (due à WebDriverWait wait =).
J'ai essayé aussi de suivre ces réponses:
NoSuchElementException (SyntaxError: trop de blocs imbriqués statiquement)
Selenium Webdriver - NoSuchElementExceptions
mais j'obtiens toujours des erreurs:
try:
search = driver.find_element_by_css_selector('#source')
break
except NoSuchElementException:
time.sleep(1)
me donne break outside the loop; alors que ce
try:
search = driver.find_element_by_css_selector('#source')
except NoSuchElementException:
pass
ne change rien (me donne toujours l'erreur: NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./ancestor-or-self::form"})
Pourriez-vous s'il vous plaît m'aider à trouver un moyen de corriger ces erreurs?
Mise à jour: j'ai également essayé d'utiliser driver.implicitly_wait(60)et j'ai eu la même NoSuchElementExpectionerreur.
Plus de détails sur l'erreur:
---> 23 search.submit()
24
25
~/anaconda3/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py in submit(self)
83 """Submits a form."""
84 if self._w3c:
---> 85 form = self.find_element(By.XPATH, "./ancestor-or-self::form")
86 self._parent.execute_script(
Réponses
Vous avez fait tout wright dans votre code partagé en haut , sauf cette ligne: search.submit(). Comme vous appelez la submit()méthode d'élément Web et la recherche d'élément définie par vous n'est pas une forme plutôt que c'est un Textarea, par conséquent NoSuchElementException. Parce que la méthode de soumission n'est applicable que pour le formtype d'éléments. Si vous supprimez cette ligne, votre code fonctionnera très bien.
depuis le webdriver d'importation de sélénium
query = ' I want to try to translate this text'
chrome_options = webdriver.ChromeOptions('/chromedriver')
driver = webdriver.Chrome()
driver.get('https://translate.google.com/')
search = driver.find_element_by_css_selector('#source')
search.send_keys(query)
Production
Remarque :
Pour savoir comment utiliser différents mécanismes d'attente en sélénium python, ci-dessous pourrait être une bonne lecture:
https://selenium-python.readthedocs.io/waits.html
<textarea id="source" class="orig tlid-source-text-input goog-textarea" rows="1" spellcheck="false" autocapitalize="off" autocomplete="off" autocorrect="off" style="overflow: auto hidden; box-sizing: border-box; height: 70px; padding-bottom: 18px;"></textarea>
Xpaths peut être soit:
//*[@id='source']
/html/body/div[2]/div[2]/div[1]/div[2]/div[1]/div[1]/div[1]/div[2]/div/div/div[1]/textarea
Attendez un élément, envoyez la requête et appuyez sur Soumettre.
search = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, //*[@id='source']))
search.send_keys(query)
search.submit()
Ajoutez également ces
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC