NoSuchElementException et SyntaxError pendant le web-scraping

Sep 01 2020

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

rahulrai Sep 02 2020 at 04:59

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

ArundeepChohan Sep 02 2020 at 02:16
<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