Selenium webdriver no puede hacer clic en un enlace fuera de la página

Tengo un problema con Selenium WebDriver. Intento hacer clic en un enlace que está fuera de la página de la ventana (necesitarás desplazarte hacia arriba para verlo). Mi código actual es bastante estándar:

menuItem = driver.findElement(By.id("MTP")); menuItem.click(); // I also tried menuItem.sendKeys(Keys.RETURN); 

Sé que podría desplazarme hacia arriba, y funcionaría en este caso. Pero en el caso de que tenga una larga lista de elementos, no necesariamente sabe hasta dónde tiene que desplazarse hacia abajo.

¿Hay alguna manera de hacer clic en un enlace que no está en la parte visible de la página (pero que sería visible si se desplaza)?

Como nota al margen, estoy usando Firefox, pero estoy planeando usar IE7 / 8/9 y Chrome también.

Cualquier ayuda sería muy apreciada.

Editar: me temo que no puedo dar el código fuente, ya que la empresa para la que trabajo no lo permite, pero puedo dar el código del enlace en el que quiero hacer clic:

  

El mismo código funciona cuando el enlace está visible, solo cuando no funciona no funciona.

Edit2: en realidad, por extraño que parezca, no genera ninguna excepción y simplemente va a la siguiente instrucción. Entonces, básicamente, lo que sucede es:

 menuItem = driver.findElement(By.id("MTP")); // no exception menuItem.click(); // no exception //... some code ensuring we got to the next page: timeout reached driver.findElement(By.id("smLH")).click(); // NoSuchElementException, as we're on the wrong page. 

En realidad, es posible desplazarse automáticamente al elemento. Aunque esta no es una buena solución en este caso (debe haber una forma de que funcione sin desplazarse) lo publicaré como una solución alternativa. Espero que a alguien se le ocurra una mejor idea …

 public void scrollAndClick(By by) { WebElement element = driver.findElement(by); int elementPosition = element.getLocation().getY(); String js = String.format("window.scroll(0, %s)", elementPosition); ((JavascriptExecutor)driver).executeScript(js); element.click(); } 

Me encontré con un problema similar recientemente cuando había una lista de objetos seleccionables en un diálogo JS. Algunas veces el selenium no seleccionaría el objeto correcto en la lista. Así que encontré esta sugerencia de JavaScript:

 WebElement target = driver.findElement(By.id("myId")); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", target); Thread.sleep(500); //not sure why the sleep was needed, but it was needed or it wouldnt work :( target.click(); 

Eso resolvió mi problema

Publiqué esta misma respuesta en otra pregunta, así que esto es solo copiar y pegar.

Una vez tuve un cuadro combinado que no estaba a la vista que necesitaba expandir. Lo que hice fue usar el constructor Acciones porque la función moveToElement () desplazará automáticamente el objeto a la vista. Luego puede hacer clic en.

 WebElement element = panel.findElement(By.className("tabComboBoxButton")); Actions builder = new Actions(this.driver); builder.moveToElement(element); builder.click(); builder.build().perform(); 

(el panel es simplemente un elemento envuelto en mi POM)

En lugar de mover la barra de desplazamiento a la posición del botón, que a veces no funcionaba para mí, le envío la tecla Intro al botón

 var element = driver.FindElement(By.Id("button")); element.SendKeys(Keys.Enter); 

Oye, puedes usar esto para ruby

 variable.element.location_once_scrolled_into_view 

Almacenar el elemento para encontrar en variable

Esta solución funcionó como un encanto para mí:

 public void click(By by) throws Exception{ WebElement element = driver.findElement(by); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element); Thread.sleep(500); element.click(); } 

Puede estar ocurriendo porque el elemento del encabezado o el elemento del pie de página podría estar bloqueando la vista del elemento sobre el que desea realizar la acción. El selenium intenta desplazarse a la posición del elemento cuando tiene que realizar alguna acción en el elemento (estoy usando Selenium WebDriver v3.4.0).

Aquí hay una solución:

 private WebElement scrollToElementByOffset(WebElement element, int offset) { JavascriptExecutor jse = (JavascriptExecutor) driver; jse.executeScript("window.scrollTo(" + element.getLocation().getX() + "," + (element.getLocation().getY() + offset) + ");"); return element; } 

La función anterior desplaza la vista al elemento y luego se desplaza más lejos por el desplazamiento que proporcione. Y puedes llamar a este método haciendo algo como …

 WebElement webElement = driver.findElement(By.id("element1")); scrollToElementByOffset(webElement, -200).click(); 

Ahora, esto es solo una solución. Con mucho gusto recibo mejores soluciones para este problema.

Esto funciona para mí (en c #) –

 item = driver.findelement(by.....); item.SendKeys(Keys.LeftControl); item.Click(); 

Solo una adición: en mi caso, el botón estaba superpuesto por otro botón flotante.

¡Solo cambiar el tamaño de la ventana del navegador resolvió el problema!

Usé el método a continuación para resolver un problema similar para Selenium Java:

 public static void scrollToElementByElement(WebElement element) { Coordinates coordinates = ((Locatable)element).getCoordinates(); coordinates.inViewPort(); coordinates.click(); //if needed } 

Luego llamé al método en mi clase de prueba principal