NoSuchElementException, Selenium no puede localizar el elemento

Resuelto Janek Podwysocki asked hace 6 años • 3 respuestas

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

Lo intenté:

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

o por xPath y cssSelector String generado por Chrome en las herramientas de desarrollo.

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

este es html:

ingrese la descripción de la imagen aquí

Janek Podwysocki avatar Jan 27 '18 07:01 Janek Podwysocki
Aceptado

Ninguna excepción de elemento tal

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

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

  • Cuando usas WebDriver.findElement(By by):

    //example : WebElement my_element = driver.findElement(By.xpath("//my_xpath"));
    
  • Cuando usas 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"
e.g. (Session info: chrome=63.0.3239.108)

DRIVER_INFO         public static final java.lang.String        "Driver info"
e.g. (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/"
e.g. (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 DOM HTML .
  • La estrategia de localización que ha adoptado no puede identificar el elemento porque no se encuentra 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 forma única el elemento deseado en el DOM HTML y actualmente encuentra algún otro elemento oculto / invisible .
  • El WebElement que intenta localizar está dentro de una <iframe>etiqueta.
  • La instancia de WebDriver busca el WebElement incluso antes de que el elemento esté presente/visible dentro del HTML DOM .

Solución

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

  • Adopte una estrategia de localización que identifique de forma única el elemento web deseado . Puede utilizar las herramientas de desarrollo ( ++ Ctrlo ) y utilizar Element Inspector .ShiftIF12

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

  • Utilice executeScript()el método para desplazar el elemento para 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 cómo desplazarse a la parte superior de la página en Python usando Selenium.

  • El elemento en caso de que tenga el atributo style="display: none;" , elimine el atributo mediante executeScript()el método de la siguiente manera:

    WebElement element = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element)
    element.sendKeys("text_to_send");
    
  • Para verificar si el elemento está dentro, <iframe>recorra el HTML para ubicar la <iframe>etiqueta respectiva y switchTo()el iframe deseado a través de cualquiera 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 HTML DOM inmediatamente, induzca WebDriverWait con ExpectedConditions configurado en el método adecuado de la siguiente manera:

    • Para esperar la presencia de ElementLocated :

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

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

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

Referencia

Puedes encontrar Seleniumpitóndiscusión relevante basada en el cliente en:

  • Selenio “selenium.common.exceptions.NoSuchElementException” cuando se usa Chrome
undetected Selenium avatar Jan 27 '2018 05:01 undetected Selenium

Su código es correcto, sospecho que el problema provocó que la página no se cargara por completo cuando encontró el elemento.

Intente agregar un sueño prolongado antes de encontrar el elemento; si agregar sueño funcionó, cambie el sueño 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"))
)
yong avatar Jan 27 '2018 04:01 yong