¿Cómo forzar a Selenium WebDriver a hacer clic en el elemento que no está visible actualmente?

Estoy usando Selenium 2 Java API con FirefoxDriver. Cuando llene un formulario, las casillas de verificación se agregan a la página dependiendo de las entradas de formularios.

Me gustaría simular un clic en esas casillas usando Selenium. El elemento es visible y utilizable en un navegador normal, pero el selenium afirma que los elementos no son visibles.

"Element is not currently visible and so may not be interacted with" 

¿Puedo forzar que el selenium ignore el estado no visible de los elementos? ¿Cómo puedo obligar a Selenium a interactuar con el elemento no visible?

El selenium determina que un elemento es visible o no según los siguientes criterios (use un inspector DOM para determinar qué CSS se aplica a su elemento, asegúrese de mirar el estilo calculado):

  • visibilidad! = oculto
  • display! = none (también se compara con cada elemento principal)
  • opacity! = 0 (esto no está marcado para hacer clic en un elemento)
  • alto y ancho son ambos> 0
  • para una entrada, el tipo de atributo! = oculto

Su elemento coincide con uno de esos criterios. Si no tiene la capacidad de cambiar el estilo del elemento, aquí está cómo puede hacerlo con fuerza con javascript (asumiendo WebDriver desde que dijo Selenium2 API):

 ((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement); 

Pero eso no disparará un evento de javascript, si dependes del evento de cambio para esa entrada, tendrás que dispararlo también (muchas formas de hacerlo, la más fácil de usar es la biblioteca javascript que se cargue en esa página).

La fuente de la verificación de visibilidad –

https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577

La especificación WebDriver que define esto –

https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#widl-WebElement-isDisplayed-boolean

A veces, esto significa que hay múltiples elementos en una página que tienen la misma propiedad por la que está intentando buscar y que está “hablando con la persona incorrecta”.

Si su elemento no puede ser identificado de manera única por: id o: name (o: class), podría ser complicado.

A veces, la búsqueda del elemento por: xpath ayudará y, en algunos casos, incluso eso no es práctico.

En esos casos, es posible que deba obtener todos los elementos que coincidan con sus criterios y hacer referencia a la correcta según el índice. Está sucio, pero funciona.

Estoy usando Selenium / Watir de la aplicación Ruby on Rails, por lo que en mi caso el ejemplo sería:

 browser = Watir::Browser.new(:firefox, :profile => "default") browser.goto("http://www.google.com/analytics") # login browser.divs(:text, "+ New Property").last.click 

Espero que esto ayude.

Tuve un problema similar, pero estaba relacionado con que el elemento no se veía en la ventana gráfica. Tomé una captura de pantalla y me di cuenta de que la ventana del navegador era demasiado estrecha y el elemento no se podía ver. Hice uno de estos y funcionó:

 driver.maximize_window() 

Ver: WebDriver.maximize_window ()

O puede usar Selenium Action Class para simular la interacción del usuario. Por ejemplo

  WebDriver = new FirefoxDriver(); WebElement menu = driver.findElement(By.xpath("")); // the triger event element Actions build = new Actions(driver); // heare you state ActionBuider build.moveToElement(menu).build().perform(); // Here you perform hover mouse over the needed elemnt to triger the visibility of the hidden WebElement m2m= driver.findElement(By.xpath(""));//the previous non visible element m2m.click(); 

También hay otro caso en el que el elemento visible se reconocerá como no visible:

  • Cuando el Elemento es CSS transformado
  • Cuando el elemento primario del elemento se transforma CSS

Para comprobar si el elemento con el que quieres interactuar es CSS transformado, en CROMO haz esto:

  1. inspector abierto
  2. Encuentra un elemento interesante (o más probablemente su elemento padre, supuestamente elemento div)
  3. Seleccione la pestaña ‘Calculado’
  4. si hay un parámetro: webkit-transform: matrix (…) significa que el elemento es CSS transformado, y puede no ser reconocido por el selenium 2 como un elemento visible

La invisibilidad también puede deberse al momento en que se supone que el elemento aparecerá lentamente. Obligar al navegador a esperar un poco podría ayudar en ese caso.

Consulte, por ejemplo, la pregunta sobre dejar que WebDriver espere hasta que haya un elemento presente .

Tuve el mismo problema con el selenium 2 en Internet Explorer 9, pero mi solución es realmente extraña. No pude hacer clic en las entradas dentro de mi formulario -> repeticiones de selenium, no son visibles.

Ocurrió cuando mi forma tenía sombras curvas -> http://www.paulund.co.uk/creating-different-css3-box-shadows-effects : en el concreto “Efecto nº 2”

No tengo idea, por qué y cómo esta solución de pseudo elemento detiene las pruebas de selenium, pero funciona para mí.

No puede forzar el acceso / cambio de elementos a los que el usuario normalmente no tiene acceso, ya que Selenium está diseñado para imitar la interacción del usuario.

Si ocurre este error, verifique si:

  • el elemento es visible en su ventana gráfica, intente maximizar la ventana actual que usa webdriver (por ejemplo, maximize() en node.js , maximize_window() en Python),
  • su elemento no aparece dos veces (en el mismo selector), y está seleccionando el elemento incorrecto,
  • si tu elemento está oculto, considera hacerlo visible,
  • si desea acceder / cambiar el valor del elemento oculto a pesar de la limitación, entonces use Javascript para eso (por ejemplo, executeScript() en node.js , execute_script() en Python).

Acabo de resolver este error al usar capybara en el proyecto ror al agregar:

 Capybara.ignore_elements = true 

a features/support/env.rb

Solo resuelvo este error esperando la propiedad de visualización del elemento

 waitFor() { element.displayed } 

Me meto en la excepción ElementNotVisibleException usando selenium para pruebas funcionales en un sitio django con glifos bootstrap como enlaces en plantillas como:

  

Durante mis pruebas funcionales, el estilo bootstrap no está cargado, luego, al tratar de hacer clic en tales enlaces se elevará ElementNotVisibleException. Logré hacer que se puedan hacer clic simplemente agregando un espacio en la etiqueta, así:

   

La respuesta aceptada funcionó para mí. A continuación se muestra un código para encontrar el elemento principal que hace que Selenium piense que no es visible.

 function getStyles(element){ computedStyle = window.getComputedStyle(element); if(computedStyle.opacity === 0 || computedStyle.display === "none" || computedStyle.visibility === "hidden" || (computedStyle.height < 0 && computedStyle.height < 0) || element.type === "hidden") { console.log("Found an element that Selenium will consider to not be visible") console.log(element); console.log("opacity: " + computedStyle.opacity); console.log("display: " + computedStyle.display); console.log("visibility: " + computedStyle.visibility); console.log("height: " + computedStyle.height); console.log("width: " + computedStyle.width); } if(element.parentElement){ getStyles(element.parentElement); } } getStyles(document.getElementById('REPLACE WITH THE ID OF THE ELEMENT YOU THINK IS VISIBLE BUT SELENIUM CAN NOT FIND'));