NoSuchElementException y SyntaxError durante el web-scraping
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
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
<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