hacer down con como bajar java selenium scroll click webdriver

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



selenium scroll down python (10)

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

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

Estoy teniendo un problema con Selenium WebDriver. Intento hacer clic en un enlace que está fuera de la página de la ventana (es necesario desplazarse 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 cuánto tiene que desplazarse hacia abajo.

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

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

Cualquier ayuda sería muy apreciada.

Edit: 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:

<div class="submenu"> <div id="MTP">Link title</div> </div>

El mismo código exacto funciona cuando el enlace está visible, pero cuando no lo está, no funciona.

Edit2: En realidad, por extraño que parezca, no genera ninguna excepción y simplemente pasa a la siguiente instrucción. Así que 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 hacerlo funcionar sin desplazamiento) lo publicaré como 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(); }


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(); }


Esto me funciona (en c #) -

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


Hey puedes usar esto para ruby

variable.element.location_once_scrolled_into_view

Almacenar el elemento a encontrar en variable.


Podría estar ocurriendo porque su elemento de encabezado o el elemento de pie de página podrían estar bloqueando la vista del elemento sobre el que desea realizar la acción. 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 según 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 sólo una solución. Con mucho gusto doy la bienvenida a mejores soluciones para este problema.


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

Una vez tuve un cuadro combinado que no estaba a la vista y que necesitaba expandir. Lo que hice fue usar el generador de acciones porque la función moveToElement () desplazará automáticamente el objeto a la vista. Entonces se 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)


Recientemente me encontré con un problema similar cuando había una lista de objetos seleccionables en un cuadro de diálogo JS. A veces, el selenio no selecciona el objeto correcto en la lista. Así que encontré esta sugerencia 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


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

Solo redimensionando la ventana del navegador solucionó el problema


Utilicé el siguiente método 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 }

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