Desplace el elemento hacia la vista con selenium

¿Hay alguna forma en Selenium 1.xo 2.x de desplazar la ventana del navegador para que un elemento particular identificado por un XPath esté a la vista del navegador? Hay un método de enfoque en Selenium, pero no parece desplazar físicamente la vista en FireFox. ¿Alguien tiene alguna sugerencia sobre cómo hacer esto?

La razón por la que necesito esto es que estoy probando el clic de un elemento en la página. Lamentablemente, el evento no parece funcionar a menos que el elemento sea visible. No tengo el control del código que se activa cuando se hace clic en el elemento, por lo que no puedo depurar ni modificarlo, así que, la solución más fácil, desplazar el elemento a la vista.

He intentado muchas cosas con respecto al desplazamiento, pero el siguiente código ha proporcionado mejores resultados.

Esto se desplazará hasta que el elemento esté a la vista:

WebElement element = driver.findElement(By.id("id_of_element")); ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element); Thread.sleep(500); //do anything you want with the element 

Puede usar la clase org.openqa.selenium.interactions.Actions para moverse a un elemento:

 WebElement element = driver.findElement(By.id("my-id")); Actions actions = new Actions(driver); actions.moveToElement(element); actions.perform(); 
 JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("javascript:window.scrollBy(250,350)"); 

Es posible que desee probar esto.

Si desea desplazarse por la ventana de Firefox con Selenium webdriver, una de las maneras es usar JavaScript en el código de Java. El código de JavaScript para desplazarse hacia abajo (al final de la página web) es el siguiente:

 JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("window.scrollTo(0, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight, document.documentElement.clientHeight));"); 

Selenium 2 intenta desplazarse al elemento y luego hacer clic en él. Esto se debe a que el Selenio 2 no interactuará con un elemento a menos que piense que es visible.

Desplazarse al elemento sucede implícitamente por lo que solo necesita encontrar el elemento y luego trabajar con él.

 webElement = driver.findElement(By.xpath("bla-bla-bla")); ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement); 

Para ver más ejemplos, ve aquí . Todo en ruso, pero el código de Java es multicultural 🙂

Apuntar a cualquier elemento y enviar las teclas hacia abajo (o arriba / izquierda / derecha) parece funcionar también. Sé que esto es un truco, pero tampoco me gusta la idea de usar JavaScript para resolver el problema del desplazamiento.

Según mi experiencia, Selenium Webdriver no se desplaza automáticamente a un elemento al hacer clic cuando hay más de una sección desplazable en la página (que es bastante común).

Estoy usando Ruby, y para mi AUT, tuve que parchear el método de clic de la siguiente manera;

 class Element # # Alias the original click method to use later on # alias_method :base_click, :click # Override the base click method to scroll into view if the element is not visible # and then retry click # def click begin base_click rescue Selenium::WebDriver::Error::ElementNotVisibleError location_once_scrolled_into_view base_click end end 

El método ‘location_once_scrolled_into_view’ es un método existente en la clase WebElement.

Aprecio que no estés usando Ruby pero debería darte algunas ideas.

Puede usar este fragmento de código para desplazarse:

DO#

 var element = Driver.FindElement(By.Id("element-id")); Actions actions = new Actions(Driver); actions.MoveToElement(element).Perform(); 

ahí tienes

Use el controlador para enviar claves como la tecla de búsqueda hacia abajo o hacia abajo para que aparezca el elemento. Sé que es una solución demasiado simple y podría no ser aplicable en todos los casos.

Esto funcionó para mí:

 IWebElement element = driver.FindElements(getApplicationObject(currentObjectName, currentObjectType, currentObjectUniqueId))[0]; ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element); 

En Selenium necesitamos tomar la ayuda de un ejecutor de JavaScript para desplazarnos a un elemento o desplazarnos por la página:

 je.executeScript("arguments[0].scrollIntoView(true);", element); 

En el element statement anterior es el elemento exacto donde tenemos que desplazarnos.

Probé el código anterior, y funcionó para mí.

Tengo una publicación y un video completos sobre esto:

http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/

A veces también me enfrenté al problema de desplazarme con Selenium. Entonces usé javaScriptExecuter para lograr esto.

Para desplazarse hacia abajo:

 WebDriver driver = new ChromeDriver(); JavascriptExecutor js = (JavascriptExecutor)driver; js.executeScript("window.scrollBy(0, 250)", ""); 

O, también

 js.executeScript("scroll(0, 250);"); 

Para desplazarse hacia arriba:

 js.executeScript("window.scrollBy(0,-250)", ""); 

O,

 js.executeScript("scroll(0, -250);"); 

Si crees que otras respuestas fueron demasiado extravagantes, esta también lo es, pero no hay ninguna inyección de JavaScript involucrada.

Cuando el botón está fuera de la pantalla, se rompe y se desplaza hacia él, así que vuelva a intentarlo … ¯ \ _ (ツ) _ / ¯

 try { element.Click(); } catch { element.Click(); } 

Lo he usado para desplazar el elemento y hago clic en:

 List image = state.getDriver().findElements(By.xpath("//*[contains(@src,'image/plus_btn.jpg')]")); for (WebElement clickimg : image) { ((JavascriptExecutor) state.getDriver()).executeScript("arguments[0].scrollIntoView(false);", clickimg); clickimg.click(); } 
 def scrollToElement(element: WebElement) = { val location = element.getLocation driver.asInstanceOf[JavascriptExecutor].executeScript(s"window.scrollTo(${location.getX},${location.getY});") } 

La secuencia de comandos de Ruby para desplazar un elemento a la vista es la siguiente.

 $driver.execute_script("arguments[0].scrollIntoView(true);", element) sleep(3) element.click 

Es posible que desee visitar la página Desplazarse por los elementos web y la página web: Selenium WebDriver utilizando Javascript :

 public static void main(String[] args) throws Exception { // TODO Auto-generated method stub FirefoxDriver ff = new FirefoxDriver(); ff.get("http://toolsqa.com"); Thread.sleep(5000); ff.executeScript("document.getElementById('text-8').scrollIntoView(true);"); } 

El selenium puede desplazarse automáticamente a algún elemento de la barra de desplazamiento para obtener una IU simple, pero para la IU de carga lenta, scrollToElement sigue siendo necesario.

Esta es mi implementación en Java con JavascriptExecutor. Puede encontrar más detalles en el código fuente de Satix: http://www.binpress.com/app/satix-seleniumbased-automation-testing-in-xml/1958

 public static void perform(WebDriver driver, String Element, String ElementBy, By by) throws Exception { try{ //long start_time = System.currentTimeMillis(); StringBuilder js = new StringBuilder(); String browser = "firefox"; if (ElementBy.equals("id")) { js.append("var b = document.getElementById(\"" + Element + "\");"); } else if (ElementBy.equals("xpath")) { if (!"IE".equals(browser)) { js.append("var b = document.evaluate(\"" + Element + "\", document, null, XPathResult.ANY_TYPE, null).iterateNext();"); } else { throw new Exception("Action error: xpath is not supported in scrollToElement Action in IE"); } } else if (ElementBy.equals("cssSelector")) { js.append("var b = document.querySelector(\"" + Element + "\");"); } else { throw new Exception("Scroll Action error"); } String getScrollHeightScript = js.toString()+ "var o = new Array(); o.push(b.scrollHeight); return o;"; js.append("b.scrollTop = b.scrollTop + b.clientHeight;"); js.append("var tmp = b.scrollTop + b.clientHeight;"); js.append("var o = new Array(); o.push(tmp); return o;"); int tries = 1; String scrollTop = "0"; while (tries > 0){ try{ String scrollHeight = ((JavascriptExecutor)driver).executeScript(getScrollHeightScript).toString(); if (scrollTop.equals(scrollHeight)) { break; } else if (driver.findElement(by).isDisplayed()) { break; } Object o = ((JavascriptExecutor)driver).executeScript(js.toString()); scrollTop = o.toString(); Thread.sleep(interval); tries ++; }catch(Exception e){ throw new Exception("Action error:" + " javascript execute error : " + e.getMessage() + ", javascript : " + js.toString()); } } }catch (Exception e) { try { ScreenshotCapturerUtil.saveScreenShot(driver, CLASSNAME); } catch (IOException e1) { throw new Exception("Save screenshot error!", e1); } throw e; } } 

El comportamiento predeterminado de Selenium es desplazarse para que el elemento apenas se vea en la parte superior de la ventana gráfica. Además, no todos los navegadores tienen exactamente el mismo comportamiento. Esto es muy desagradable. Si graba videos de las pruebas de su navegador, como yo, lo que desea es que el elemento se desplace hacia la vista y se centre verticalmente .

Aquí está mi solución para Java:

 public List getBoundedRectangleOfElement(WebElement we) { JavascriptExecutor je = (JavascriptExecutor) driver; List bounds = (ArrayList) je.executeScript( "var rect = arguments[0].getBoundingClientRect();" + "return [ '' + parseInt(rect.left), '' + parseInt(rect.top), '' + parseInt(rect.width), '' + parseInt(rect.height) ]", we); System.out.println("top: " + bounds.get(1)); return bounds; } 

Y luego, para desplazarse, lo llamas así:

 public void scrollToElementAndCenterVertically(WebElement we) { List bounds = getBoundedRectangleOfElement(we); Long totalInnerPageHeight = getViewPortHeight(driver); JavascriptExecutor je = (JavascriptExecutor) driver; je.executeScript("window.scrollTo(0, " + (Integer.parseInt(bounds.get(1)) - (totalInnerPageHeight/2)) + ");"); je.executeScript("arguments[0].style.outline = \"thick solid #0000FF\";", we); } 

Así es como lo hago con PHP webDriver for Selenium. Funciona para el servidor independiente de Selenium 2.39.0 + https://github.com/Element-34/php-webdriver + Firefox 25.0

 $element=$session->welement("xpath", "//input[@value='my val']"); $element->click(); $element=$session->welement("xpath", "//input[@value='ma val2']"); $element->location_in_view(); // < -- this is the candy $element->click(); 

Nota: uso una versión personalizada del Element34 PHP-webdriver. Pero no hay ningún cambio en el núcleo. Solo uso mi “welement” en lugar de “element”. Pero no influye en el caso en cuestión. El autor del controlador dice “permitir que casi todas las llamadas API sean una transformación directa de lo que se define en el protocolo WebDriver”. Por lo tanto, no debería tener problemas con otros lenguajes de progtwigción.

Simplemente haciendo clic no funcionará en mi configuración. Hará un desplazamiento en lugar de hacer clic, así que tuve que hacer clic dos veces sin llamar a “location_in_view ()”.

Nota: Este método funciona para elementos que se pueden ver, como una entrada de tipo de botón.

Eche un vistazo a: http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location

La descripción de JsonWireProtocol # sugiere el uso de la ubicación + moveto, porque la ubicación _in_view es un método interno.

Algo que funcionó para mí fue utilizar el método Browser.MoveMouseToElement en un elemento en la parte inferior de la ventana del navegador. Milagrosamente funcionó en Internet Explorer, Firefox y Chrome.

Elegí esto sobre la técnica de inyección de JavaScript solo porque se sentía menos hacky.

He estado probando con los componentes del ADF y tiene que tener un comando separado para desplazarse si se usa la carga diferida. Si el objeto no está cargado e intentas encontrarlo usando Selenium, Selenium emitirá una excepción de elemento no encontrado.

Si nada funciona, intente esto antes de hacer clic:

 public void mouseHoverJScript(WebElement HoverElement) { String mouseOverScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseover');}"; ((JavascriptExecutor) driver).executeScript(mouseOverScript, HoverElement); } 

En Java podemos desplazarnos usando JavaScript, como en el siguiente código:

 driver.getEval("var elm = window.document.getElementById('scrollDiv'); if (elm.scrollHeight > elm.clientHeight){elm.scrollTop = elm.scrollHeight;}"); 

Puede asignar un valor deseado a la variable “elm.scrollTop”.

Una solución es:

 public void javascriptclick(String element) { WebElement webElement = driver.findElement(By.xpath(element)); JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("arguments[0].click();", webElement); System.out.println("javascriptclick" + " " + element); } 

Esta es una solución repetida con JavaScript, pero con un elemento agregado de espera.

De lo contrario, ElementNotVisibleException puede aparecer si se realiza alguna acción en el elemento.

 this.executeJavaScriptFunction("arguments[0].scrollIntoView(??true);", elementToBeViewable); WebDriverWait wait = new WebDriverWait(getDriver(), 5); wait.until(ExpectedConditions.visibilityOf(elementToBeViewab??le)); 

Este código me funciona:

 JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("javascript:window.scrollBy(250, 350)"); 

Estoy de acuerdo con todo el mundo que dice “El selenium tiene una opción de desplazamiento implícita”. Además, si estuvo en Selenium 1 y ahora se ha actualizado a Selenium 2 y busca los comandos de la versión anterior, puede usar el comando conocido como:

 Seleniumbackeddriver. WebDriver driver = new FirefoxDriver(); public void setUp() throws Exception { String baseUrl = "http://www.google.co.in/"; selenium = new WebDriverBackedSelenium(driver, baseUrl); } 

Puede hacer uso de estos y usar comandos de ambas versiones.

Haga un clic al azar en la página:

 driver.findElement(By.id("ID of a web element present below")).click 

Luego realiza lo que quieras hacer.