NoSuchElementException y SyntaxError durante el web-scraping

Sep 01 2020

Tengo algunas dificultades al aplicar esta sugerencia para corregir el siguiente error:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./ancestor-or-self::form"}

tengo cuando uso el siguiente código:

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()

Como se explica aquí: NoSuchElementException: no se puede ubicar el elemento , debería usar algo como esto

WebDriverWait wait = new WebDriverWait(driver, 10);

wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("source"));

Pero obtengo un SyntaxError (debido a WebDriverWait wait =).

También he intentado seguir estas respuestas:

NoSuchElementException (SyntaxError: demasiados bloques anidados estáticamente)

Selenium Webdriver - NoSuchElementExceptions

pero sigo recibiendo errores:

try:
    search = driver.find_element_by_css_selector('#source')

    break
except NoSuchElementException:
    time.sleep(1)

me da break outside the loop; mientras que este

try:
    search = driver.find_element_by_css_selector('#source')

except NoSuchElementException:         
    pass

no cambia nada (todavía me da el error: NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./ancestor-or-self::form"})

¿Podría ayudarme a encontrar una manera de corregir estos errores?

Actualización: también intenté usar driver.implicitly_wait(60)y obtuve el mismo NoSuchElementExpectionerror.

Más detalles sobre el error:

---> 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(

Respuestas

rahulrai Sep 02 2020 at 04:59

Usted ha hecho todo Wright en su código compartido en la parte superior, excepto esta línea: search.submit(). Como está llamando al submit()método de elemento web y la búsqueda de elementos definida por usted no es una forma, sino un Textarea, por lo tanto NoSuchElementException. Porque el método de envío es aplicable solo para formtipos de elementos. Si elimina esta línea, su código funcionará bien.

desde el controlador web de importación de selenio

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)

Salida

Nota :

Para saber cómo usar diferentes mecanismos de espera en selenium python, a continuación podría ser una buena lectura:

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>

Los XPath pueden ser:

//*[@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

Básicamente, espere un elemento y envíe la consulta y presione enviar.

search = WebDriverWait(driver, 10).until( 
        EC.presence_of_element_located((By.XPATH, //*[@id='source'])) 
search.send_keys(query)
search.submit()

También agregue estos

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