使用selenium将元素滚动到视图中

在Selenium 1.x或2.x中有没有办法滚动浏览器窗口,以便XPath标识的特定元素在浏览器中? 在Selenium中有一个焦点方法,但它似乎并没有在FireFox中物理地滚动视图。 有没有人有任何build议如何做到这一点?

我需要这个的原因是我正在testing页面上的一个元素的点击。 不幸的是,事件似乎没有工作,除非元素是可见的。 我没有控制单击元素时触发的代码,所以我不能debugging或修改它,所以,最简单的解决scheme,将项目滚动到视图中。

已经尝试了很多关于滚动的东西,但是下面的代码提供了更好的结果。

这将滚动,直到元素在视图中:

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 

您可以使用org.openqa.selenium.interactions.Actions类来移动到一个元素:

 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)"); 

你可能想试试这个。

如果您想使用Selenium Webdriver在Firefox窗口上滚动,其中一种方法是在Java代码中使用JavaScript。 向下滚动的JavaScript代码(至网页底部)如下所示:

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

Selenium 2试图滚动到元素,然后点击它。 这是因为selenium2不会与元素相互作用,除非它认为它是可见的。

滚动到元素隐式发生,所以你只需要find该项目,然后使用它。

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

有关更多示例, 请转到此处 。 全部在俄罗斯,但Java代码是跨文化的:)

针对任何元素,并发送键 (或向上/向左/右)似乎也起作用。 我知道这是一个黑客,但我没有真正的使用JavaScript解决滚动问题的想法。

你可以使用这个代码片段来滚动:

C#

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

你有它

根据我的经验,Selenium Webdriver在页面上有多个可滚动部分(这很常见)时不会自动滚动到单击元素上。

我正在使用Ruby,而对于我的AUT,我不得不按如下步骤修补click方法:

 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 

“location_once_scrolled_into_view”方法是WebElement类中的现有方法。

我赞赏你可能没有使用Ruby,但它应该给你一些想法。

如果您认为其他答案太过于粗鲁,那么也是这样,但是没有涉及JavaScript注入。

当button离开屏幕时,它会中断并滚动到它,所以重试它…¯\ _(ツ)_ /¯

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

使用驱动程序发送button,向下翻页键或向下键以将元素显示在屏幕上 。 我知道这是一个太简单的解决scheme,可能不适用于所有情况。

我用这种方法滚动元素,然后单击:

 List<WebElement> 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});") } 

将元素滚动到视图中的Ruby脚本如下所示。

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

有时我也遇到了用selenium滚动的问题。 所以我用javaScriptExecuter来实现这一点。

向下滚动:

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

或者,也是

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

滚动:

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

要么,

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

你可能想访问页面滚动Web元素和Web页面 – 使用JavaScript Selenium WebDriver

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

这对我工作:

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

Selenium可以自动滚动到一些简单的UI滚动条中的某个元素,但对于延迟加载UI,仍然需要scrollToElement。

这是我用JavascriptExecutor在Java中的实现。 您可以在Satix源代码中find更多详细信息: 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; } } 

Selenium的默认行为是滚动,因此元素几乎不在视口的顶部。 而且,并不是所有的浏览器都有完全相同的行为。 这是非常不令人满意的。 如果你像我一样logging你的浏览器testing的video,你想要的是元素滚动到视图和垂直居中

这是我的Java解决scheme:

 public List<String> getBoundedRectangleOfElement(WebElement we) { JavascriptExecutor je = (JavascriptExecutor) driver; List<String> bounds = (ArrayList<String>) 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; } 

然后,滚动,你这样称呼它:

 public void scrollToElementAndCenterVertically(WebElement we) { List<String> 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); } 

这里是我如何使用PHP webDriver for Selenium。 适用于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(); 

注意:我使用Element34 PHP-webdriver的自定义版本。 但核心没有任何变化。 我只是用我的“元素”而不是“元素”。 但是对这个案子没有影响。 驱动程序作者说:“几乎所有的API调用都是WebDriver协议本身定义的直接转换”。 所以你应该没有其他编程语言的问题。

只是点击将无法在我的设置。 它会做一个滚动而不是点击,所以我不得不点击两次而不调用“location_in_view()”。

注意:此方法适用于可以查看的元素,例如typesbutton的input。

看看: http : //code.google.com/p/selenium/wiki/JsonWireProtocol#/session/ : sessionId/element/ : id/location

JsonWireProtocol#的描述build议使用location + moveto,因为location _in_view是一个内部方法。

对我来说有效的是在浏览器窗口底部的一个元素上使用Browser.MoveMouseToElement方法。 奇迹般地在Internet Explorer,Firefox和Chrome上运行。

我之所以selectJavaScript注入技术,是因为它感觉不太好。

我一直在用ADF组件进行testing,如果使用延迟加载,你必须有一个单独的滚动命令。 如果这个对象没有被加载,并且你试图用Selenium来find它,那么Selenium会抛出一个没有find元素的exception。

如果没有任何效果,请在点击之前试用

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

在Java中,我们可以使用JavaScript进行滚动,如下面的代码所示:

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

您可以将所需的值分配给“elm.scrollTop”variables。

解决scheme是:

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

在Selenium中,我们需要借助JavaScript执行程序来滚动页面或滚动页面:

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

在上面的语句element是我们需要滚动的确切元素。

我试过上面的代码,它为我工作。

我有一个完整的文章和video:

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

这是一个JavaScript的重复解决scheme,但增加了元素的等待。

否则,如果元素上的一些操作正在完成,则可能会出现ElementNotVisibleException

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

此代码正在为我工​​作:

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

Python中,您可以使用属性location_once_scrolled_into_view允许将视图滚动到所需的元素以及滚动获取其(x,y)坐标:

 element = driver.find_element_by_id('id_value') element.location_once_scrolled_into_view 

Selenium 2自动向下滚动,只要你的元素被点击浏览器的视图。 所以你在Selenium 2.0中不用担心。