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

Dan*_*and 185 selenium scroll automated-tests

在Selenium 1.x或2.x中是否有任何方法可以滚动浏览器窗口,以便XPath识别的特定元素可以在浏览器中查看?Selenium中有一个焦点方法,但它似乎没有在FireFox中物理滚动视图.有没有人对如何做到这一点有任何建议?

我需要这个的原因是我正在测试页面上元素的点击.不幸的是,除非元素可见,否则事件似乎不起作用.我无法控制单击该元素时触发的代码,因此我无法对其进行调试或修改,因此,最简单的解决方案是将项目滚动到视图中.

Ami*_*ith 189

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

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

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
Run Code Online (Sandbox Code Playgroud)

  • 如果您要滚动到的对象位于当前所在的位置,则将"true"传递给"scrollIntoView",如果您要滚动到的对象位于当前位置之上,则返回"false".我很难搞清楚这一点. (18认同)
  • 这是一个很好的解决方案,当你在页面上有一个带有"position:fixed"的元素时,它会模糊Selenium想要点击的元素.通常这些固定元素位于底部,因此设置`scrollIntoView(true)`可以很好地将其移动到视口的顶部. (6认同)
  • 这段代码对我有用,而Actions则没有. (3认同)
  • 基于最新版本的硒(2.53),现在这是一个很好的帮助解决方案.Selenium并不总是将元素滚动到视图中,所以这肯定会派上用场. (3认同)
  • 为什么需要线程睡眠?executeScript应该是同步的 (2认同)
  • @riccardo.tasso 可能已实施睡眠来处理目标应用程序的未知情况。如果它具有动态滚动,或者在滚动后加载页面的下一位的单页应用程序,以及其他可能性。从经验来看,Selenium 经常破坏我公司的网站,因为自动操作发生的速度比 Javascript 完成的速度快,从而传递了不完整的数据模型。有些地方可能认为这是一个错误,但我被告知“没有人可以调用这样的场景,所以这不是一个真正的错误。” 这就是生活。 (2认同)

小智 141

您可以使用org.openqa.selenium.interactions.Actions该类移动到元素.

Java的:

WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(driver.sl.find_element_by_id('my-id')).perform()
Run Code Online (Sandbox Code Playgroud)

  • @Dominik:Selenium如何将鼠标移动到屏幕外的元素?显然,它必须首先将元素滚动到视图中,然后将鼠标移动到它.我测试了它.此代码适用于Firefox Webdriver 2.48,但有一个错误:当页面中有iframe时,在iframe中滚动无法正常工作,而element.LocationOnScreenOnceScrolledIntoView正确滚动.(虽然文档说这个命令只返回一个位置,但它也会滚动!) (6认同)
  • 如果WebElement不在View Port中,这是否可行? (5认同)
  • https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/interactions/Actions.html#moveToElement-org.openqa.selenium.WebElement-上的文档清楚地说明了"移动鼠标"到元素的中间.元素滚动到视图中,其位置使用getBoundingClientRect计算." (5认同)
  • 上面的代码是"官方方式"Java Selenium希望你将元素滚动到视口中,但是在尝试了许多事情之后,JS实现似乎对我来说更可靠.[此方法](http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver)特别. (3认同)
  • 没有为我工作:-| 改用/sf/answers/1673144791/。 (2认同)

小智 28

JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("javascript:window.scrollBy(250,350)");
Run Code Online (Sandbox Code Playgroud)

你可能想试试这个.


小智 15

如果要使用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));");
Run Code Online (Sandbox Code Playgroud)


Dev*_*ave 8

定位任何元素并向下发送键(或向上/向左/向右)似乎也有效.我知道这有点像黑客,但我并不是真的想用JavaScript来解决滚动问题.


小智 8

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

有关更多示例,请转到此处.全部用俄语,但Java代码是跨文化的:)


Ash*_*eze 7

我发现我的元素的边界矩形不正确,导致浏览器滚动到屏幕之外。然而,下面的代码对我来说效果很好:

private void scrollToElement(WebElement webElement) throws Exception {
    ((JavascriptExecutor)webDriver).executeScript("arguments[0].scrollIntoViewIfNeeded()", webElement);
    Thread.sleep(500);
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是官方的答案。它工作完美! (2认同)

Aut*_*ter 6

Selenium 2尝试滚动到元素,然后单击它.这是因为Selenium 2不会与元素交互,除非它认为它是可见的.

滚动到元素是隐式发生的,因此您只需要找到该项目然后使用它.

  • 对我来说似乎没有这样的方式.对于不在视图中的元素,我会得到"元素不可点击"的错误 (54认同)
  • 这是怎么回答这个问题的? (19认同)
  • 这个答案是对的.根据Selenium 2.0的规范`WebElement.click()`要求元素可见才能点击它.它不会代表您滚动. (9认同)
  • @DevDave我有同样的问题,除了在我的情况下,selenium不对元素执行点击操作,没有例外.我以前没有遇到过这个问题,我不知道是什么导致了这个问题. (5认同)
  • 隐式滚动因浏览器而异.我在页面中间的弹出菜单中测试了一个元素.使用Ruby gem selenium_webdriver 2.43我发现chrome-browser 37(我相信Internet Explorer)确实将菜单项滚动到视图中并单击它.但Firefox 32似乎根本没有滚动,然后失败,"元素当前不可见,因此可能无法与之交互". (5认同)

Gan*_*h S 5

使用驱动程序发送键,例如pagedowndownarrow键,以使该元素可见。我知道这太简单了,可能无法在所有情况下都适用。

  • 是。我同意。但是我确实说过“并非在所有情况下都适用” (2认同)

小智 5

这为我工作:

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


小智 5

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

je.executeScript("arguments[0].scrollIntoView(true);", element);
Run Code Online (Sandbox Code Playgroud)

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

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

我对此有完整的帖子和视频:

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


Moh*_*wan 5

您可以使用以下代码片段进行滚动:

C#

var element = Driver.FindElement(By.Id("element-id"));
Actions actions = new Actions(Driver);
actions.MoveToElement(element).Perform();
Run Code Online (Sandbox Code Playgroud)

你有它