NoSuchElementExeption, el selenium no puede localizar el elemento

Me gustaría encontrar mi TextField en selenium, pero no sé cómo (uso el selenium por primera vez).

Lo intenté:

driver.findElement(By.id("originTextField")) 

o por xPath y cssSelector Cadena generada por chrome en las herramientas de desarrollo.

Por favor, ayúdenme, agradecería una explicación.

esto es html:

enter image description here

NoSuchElementException

org.openqa.selenium.NoSuchElementException conocida popularmente como NoSuchElementException extends org.openqa.selenium.NotFoundException, que es un tipo de WebDriverException .

NoSuchElementException se puede lanzar en 2 casos de la siguiente manera:

  • Al usar WebDriver.findElement(By by) :

     //example : WebElement my_element = driver.findElement(By.xpath("//my_xpath")); 
  • Cuando se usa WebElement.findElement(By by) :

     //example : WebElement my_element = element.findElement(By.xpath("//my_xpath")); 

Según JavaDocs, al igual que cualquier otra WebDriverException , NoSuchElementException debe contener los siguientes campos constantes :

 Constant Field Type Value SESSION_ID public static final java.lang.String "Session ID" eg (Session info: chrome=63.0.3239.108) DRIVER_INFO public static final java.lang.String "Driver info" eg (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86) BASE_SUPPORT_URL protected static final java.lang.String "http://seleniumhq.org/exceptions/" eg (For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html) 

Razón

El motivo de NoSuchElementException puede ser cualquiera de los siguientes:

  • La estrategia de localización que ha adoptado no identifica ningún elemento en el HTML DOM .
  • La estrategia de localización que ha adoptado no puede identificar el elemento, ya que no está dentro de la ventana gráfica del navegador.
  • La estrategia de localización que ha adoptado identifica el elemento, pero es invisible debido a la presencia del atributo style = “display: none;” .
  • La estrategia de localización que ha adoptado no identifica de manera única el elemento deseado en el HTML DOM y actualmente encuentra algún otro elemento oculto / invisible .
  • El WebElement que intenta ubicar está dentro de una etiqueta .
  • La instancia de WebDriver está buscando WebElement incluso antes de que el elemento esté presente / visible en el HTML DOM .

Solución

La solución para abordar NoSuchElementException puede ser una de las siguientes:

  • Adopte una estrategia de localización que identifique de forma única el WebElement deseado. Puede tomar la ayuda de las Herramientas de desarrollo ( Ctrl + Shift + I o F12 ) y usar Element Inspector .

    Aquí encontrará una discusión detallada sobre cómo inspeccionar el elemento en selenium3.6 ya que el firebug ya no es una opción para FF 56.

  • Use el método executeScript() para desplazarse por el elemento y verlo de la siguiente manera:

     WebElement elem = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem); 

    Aquí encontrará una discusión detallada sobre Desplazamiento a la parte superior de la página en Python usando Selenio

  • El elemento Incase tiene el atributo style = “display: none;” , elimine el atributo mediante el método executeScript() siguiente manera:

     WebElement element = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element) element.sendKeys("text_to_send"); 
  • Para comprobar si el elemento está dentro de un recorra el HTML para localizar la etiqueta respectiva y switchTo() el iframe deseado mediante uno de los siguientes métodos:

     driver.switchTo().frame("frame_name"); driver.switchTo().frame("frame_id"); driver.switchTo().frame(1); // 1 represents frame index 

    Aquí puede encontrar una discusión detallada sobre ¿Es posible cambiar a un elemento en un marco sin usar driver.switchTo (). Frame (“frameName”) en Selenium Webdriver Java? .

  • Si el elemento no está presente / visible en el HTML DOM de inmediato, induzca WebDriverWait con ExpectedConditions establecido en el método adecuado de la siguiente manera:

    • Para esperar a presenceOfElementLocated :

       new WebDriverWait(driver, 20).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']"))); 
    • Para esperar a visibilityOfElementLocated :

       new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']"))); 
    • Esperar por elementToBeClickable :

       new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']"))); 

Tu código es correcto, sospecho que el problema provocó que la página no se cargara cuando encontraste el elemento.

Intente agregar una suspensión larga antes de encontrar el elemento, si agregar la suspensión funcionó, cambie la suspensión para esperar.

Aquí está el código, significa esperar 10 segundos si el elemento no está presente:

 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "originTextField")) )