selenium selenium-webdriver css-selectors webdriver selenium-chromedriver

selenium - NoSuchElementExeption, el selenio no puede ubicar el elemento



selenium-webdriver css-selectors (2)

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

Lo intenté:

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

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

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

esto es html:


NoSuchElementException

org.openqa.selenium.NoSuchElementException conocido 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:

  • Al usar WebDriver.findElement(By by) :

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

  • Cuando use WebElement.findElement(By by) :

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

Según los 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, ya que no está dentro de la Viewport 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 exclusiva el elemento deseado en el DOM HTML y actualmente encuentra algún otro elemento oculto / invisible .
  • El elemento web que está intentando localizar está dentro de una etiqueta <iframe> .
  • La instancia de WebDriver está buscando el elemento web incluso antes de que el elemento esté presente / visible dentro del DOM HTML .

Solución

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

  • Adopte una estrategia de localización que identifique de forma exclusiva el elemento web deseado. Puede obtener ayuda de las Herramientas para desarrolladores ( Ctrl + Shift + I o F12 ) y usar el Inspector de elementos .

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

  • Use el método executeScript() para desplazar 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 Desplazarse hacia la parte superior de la página en Python usando Selenium

  • 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 verificar si el elemento está dentro de un <iframe> recorre el HTML hacia arriba para ubicar la etiqueta <iframe> 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 el HTML DOM de inmediato, induzca WebDriverWait con ExpectedConditions establecido en el método adecuado de la siguiente manera:

    • Para esperar presenceOfElementLocated :

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

    • Para esperar visibilityOfElementLocated :

      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'']")));


Su código es correcto, sospecho que el problema causó que la página no se cargara completamente cuando encuentre el elemento.

Intente agregar un sueño largo 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")) )