“El elemento no está visible actualmente y, por lo tanto, no se puede interactuar con él”, pero ¿otro es?

He creado otra pregunta que creo que es la causa de este error: ¿Por qué el controlador de Selenium Firefox considera que el modal no se muestra cuando el padre tiene un desbordamiento: oculto?

Selenio versión 2.33.0
Driver firefox

El código que causa el error:

System.Threading.Thread.Sleep(5000); var dimentions = driver.Manage().Window.Size; var field = driver.FindElement(By.Id("addEmployees-password")); //displayed is true field.Click(); //works fine var element = driver.FindElement(By.Id(buttonName)); //displayed is false element.Click(); //errors out 

El botón que está intentando hacer clic:

  
  • Si cambio la llamada a FindElements , obtengo UN elemento, así que no hay nada más en la página.
  • Si FindElement un FindElement en un campo que aparece justo antes del botón, diga addEmployees-employee , se addEmployees-employee
  • En el navegador mismo, se muestra bien, todo lo que necesito hacer es hacer clic en el botón y el comportamiento deseado se ejecuta, pero el controlador web se niega a considerar el elemento que se muestra.

¿Cómo es que un campo puede ser considerado desplegado y el otro no?

introduzca la descripción de la imagen aquí

El modal con el botón de agregar en la parte inferior derecha, se muestran todos los demás elementos = verdadero

El tamaño de la ventana es 1200×645 por driver.Manage().Window.Size;
La ubicación del elemento es: 800x355y por driver.FindElement(By.Id(buttonName)).Location
Las dimensiones del elemento son: 51×30 por driver.FindElement(By.Id(buttonName)).Size
La ubicación del elemento de la contraseña es: 552x233y por driver.FindElement(By.Id("addEmployees-password")).Size

¡Selenium WebDriver no solo comprueba la opacidad! = 0, visibilidad = verdadera, altura> 0 y muestra! = Ninguno en el elemento actual en cuestión, sino que también busca la cadena de antepasados ​​del DOM para asegurarse de que no haya elementos principales que también emparejar estas damas ( ACTUALIZACIÓN Después de ver el código de conexión JSON al que se refieren todos los enlaces, SWD también requiere desbordamiento = = oculto , así como algunos otros casos ).

Haría dos cosas antes de reestructurar el código como sugiere @Brian.

  1. Asegúrese de que el elemento “div.modal_footer” no tenga ninguna razón para que SWD considere que no está visible.

  2. Inyecte un poco de Javascript para resaltar el elemento en cuestión en su navegador para que sepa absolutamente que ha seleccionado el elemento correcto. Puede utilizar esta esencia como punto de partida. Si el botón está resaltado en un borde amarillo, entonces sabe que tiene seleccionado el elemento correcto. Si no, significa que el elemento seleccionado se encuentra en otro lugar en el DOM. Si este es el caso, es probable que no tenga una ID única como cabría esperar, lo que hace que la manipulación del DOM sea muy confusa.

Si tuviera que adivinar, diría que el número dos es lo que estás encontrando. Esto también me ha sucedido a mí, cuando un Dev reutilizó una ID de elemento, causando una contención en qué elemento se supone que debes encontrar.

La respuesta de Brian fue correcta: use una espera explícita versus Thread.Sleep (). El sueño () generalmente es quebradizo, estás perdiendo cinco segundos innecesariamente y, además, es una práctica realmente mala para las pruebas automatizadas. (Me tomó mucho tiempo LARGO tiempo para aprender eso, así que no estás solo).

Evitar las esperas implícitas. Por lo general, funcionan para los nuevos elementos que se agregan al DOM, no para las transiciones para que cosas como un modo se activen.

Las esperas explícitas tienen un gran conjunto de condiciones esperadas ( detalladas en Javadox ) que pueden hacer que superen estos problemas. Use la Condición Expected que coincida con el estado que necesita para su próxima acción.

También, vea la excelente publicación de blog de Ian Rose sobre el tema , también.

Después de discutir esto contigo en el chat, creo que la mejor solución (por ahora, al menos) es mover el botón del pie de página para tu modal y hacia el cuerpo.

Esto es lo que quieres (por ahora):

  

Y no esto:

   

Tuve el mismo problema de elemento no visible por lo que no puedo interactuar con él. Se acaba de resolver. Actualicé mi servidor independiente de selenium. La versión anterior era 2.33.0 y ahora es 2.35.0

En mi caso, el elemento ya estaba presente en la página pero estaba deshabilitado, por lo que no funcionó (python):

 wait.until(lambda driver: driver.find_element_by_id("myBtn")) driver.find_element_by_id("myBtn").click() 

falló con error:

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

Para resolver mi problema, tuve que esperar un par de segundos ( time.sleep(5) ) hasta que el elemento se hizo visible.

También puede habilitar el elemento usando JavaScript, un ejemplo de python:

 driver.execute_script("document.getElementById('myBtn').disabled='' ") driver.execute_script("document.getElementById('myBtn').click() ")