es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Selenium (RSelenium) dando un error de StaleElementReference al hacer clic en un elemento que se ha buscado recientemente.

Estoy intentando realizar algunas pruebas de Selenium contra una aplicación Shiny que tiene algunas notificaciones. Tengo una función siguiente que llamaría para cerrar todas las notificaciones que están allí, y la referencia al elemento se recupera justo antes de llamar al clic.

close_notifications <- function() {
buttons <- remDr$findElements(using = “xpath”, “//[@id=’shiny-notification-panel’]///div[contains(text(),’×’)]”)
close_function <- function(btn) {
btn$clickElement()
}
lapply(buttons, close_function)
}

Sin embargo, cuando hay una notificación visible en la aplicación e intento llamarla, obtengo el siguiente error al respecto.

Error: Prueba fallida:
* Resumen: StaleElementReference
Detalle: Un comando de elemento falló porque el elemento de referencia ya no está unido al DOM.
Clase: org.openqa.selenium.StaleElementReferenceException

¿Cuál podría ser la razón por la que obtengo este error, incluso cuando la referencia se recupera justo antes de intentar hacer clic en el botón? La duración de la notificación en sí misma es bastante larga, por lo que no desaparece en la interfaz de usuario incluso cuando obtengo la referencia StaleElementReference. No estoy seguro si Shiny cambia algo bajo el capó para que no sea el mismo elemento DOM, sin embargo, supongo que no debería ser el caso cuando intento presionar el botón justo después de buscarlo con el controlador Selenium.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error StaleElementReference ocurre cuando el elemento que se hizo referencia anteriormente ya no está unido al DOM. Este error puede ocurrir si el elemento fue eliminado o modificado de alguna manera entre el momento en que se encontró y el momento en que se hizo clic en él. En este caso, es posible que la notificación esté siendo actualizada o eliminada por la aplicación Shiny durante la prueba.

    Una forma de manejar este error es actualizar la página o esperar a que la página se cargue por completo antes de llamar a la función close_notifications. Otro enfoque es agregar una declaración tryCatch alrededor de la llamada de función clickElement() y manejar el error StaleElementReference encontrando el elemento nuevamente y haciendo clic en él nuevamente. Por ejemplo:

    close_function <- function(btn) {
      tryCatch(
        btn$clickElement(),
        error = function(e) {
          if (grepl("StaleElementReference", e$message)) {
            buttons <<- remDr$findElements(using = "xpath", "//[@id='shiny-notification-panel']///div[contains(text(),'×')]")
            btn <<- buttons[[which(buttons == btn)]]
            btn$clickElement()
          } else {
            stop(e)
          }
        }
      )
    }
    

    Este código intentará hacer clic en el elemento como de costumbre, pero si se produce un error StaleElementReference, buscará el elemento nuevamente e intentará nuevamente el clic.

Comments are closed.