使用java在Selenium WebDriver(Selenium 2)中向上或向下滚动页面
Posted
技术标签:
【中文标题】使用java在Selenium WebDriver(Selenium 2)中向上或向下滚动页面【英文标题】:Page scroll up or down in Selenium WebDriver (Selenium 2) using java 【发布时间】:2012-08-30 20:45:14 【问题描述】:我在 Selenium 1(又名 Selenium RC)中编写了以下代码,用于使用 java 进行页面滚动:
selenium.getEval("scrollBy(0, 250)");
Selenium 2 (WebDriver) 中的等效代码是什么?
【问题讨论】:
【参考方案1】:场景/测试步骤: 1. 打开浏览器并导航到TestURL 2.向下滚动一些像素并向上滚动
向下滚动:
WebDriver driver = new FirefoxDriver();
javascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(0,250)");
或者,您可以执行以下操作:
jse.executeScript("scroll(0, 250);");
向上滚动:
jse.executeScript("window.scrollBy(0,-250)");
OR,
jse.executeScript("scroll(0, -250);");
滚动到页面底部:
场景/测试步骤: 1. 打开浏览器并导航到TestURL 2. 滚动到页面底部
方式 1:使用 JavaScriptExecutor
jse.executeScript("window.scrollTo(0, document.body.scrollHeight)");
方式2:按ctrl+end
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL, Keys.END);
方式 3:使用 Java Robot 类
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_END);
robot.keyRelease(KeyEvent.VK_END);
robot.keyRelease(KeyEvent.VK_CONTROL);
【讨论】:
以上代码用于向下滚动。向上滚动: jse.executeScript("scroll(250, 0)");只有值是反向的 否 - 将滚动到右侧。向上滚动将是scroll(0,-250)
谢谢斯蒂芬。 scroll(250,0) 和 scroll(0,-250) 都应该适用于向上滚动。
向上滚动 (0, -250) 是合乎逻辑的。我同意斯蒂芬的观点。
jse.executeScript("window.scrollBy(0,250)", "");它工作正常。我想将变量用作 int y = 250; jse.executeScript("window.scrollBy(0,y)", "");在这种情况下,错误显示为“未定义 y”。这种情况下如何使用变量?【参考方案2】:
滚动到页面底部:
JavascriptExecutor js = ((JavascriptExecutor) driver);
js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
【讨论】:
顺便提一下,它是用来向下滚动的 它在我的 salesforce 应用程序中不起作用,而 window.scrollBy(0,250) 起作用。但它不会滚动到页面末尾。【参考方案3】:在 Selenium Webdriver 中有很多上下滚动的方法,我总是使用 Java Script 来做同样的事情。
如果我想向上或向下滚动,下面是总是对我有用的代码
// This will scroll page 400 pixel vertical
((JavascriptExecutor)driver).executeScript("scroll(0,400)");
您可以从这里获取完整代码Scroll Page in Selenium
如果你想滚动一个元素,那么下面的代码将适合你。
je.executeScript("arguments[0].scrollIntoView(true);",element);
您将在这里获得完整的文档Scroll for specific Element
【讨论】:
如果我必须向下滚动,这很有效。如何向上滚动页面? 代码的第一个sn-p只滚动页面,而不是元素本身,我该怎么做?【参考方案4】:这可能不是您问题的准确答案(就 WebDriver 而言),但我发现 java.awt
库比 selenium.Keys
更稳定。
因此,使用前者的向下翻页操作将是:
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_PAGE_DOWN);
robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
【讨论】:
【参考方案5】:JavascriptExecutor js = ((JavascriptExecutor) driver);
向下滚动:
js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
向上滚动:
js.executeScript("window.scrollTo(0, -document.body.scrollHeight);");
【讨论】:
【参考方案6】:试试这个:
Actions dragger = new Actions(driver);
WebElement draggablePartOfScrollbar = driver.findElement(By.xpath("//*[@id='jobreslist_outercontainer']/div/div[2]/div"));
// drag downwards
int numberOfPixelsToDragTheScrollbarDown = 50;
for (int i = 10; i < 500; i += numberOfPixelsToDragTheScrollbarDown)
try
// this causes a gradual drag of the scroll bar, 10 units at a time
dragger.moveToElement(draggablePartOfScrollbar).clickAndHold().moveByOffset(0, numberOfPixelsToDragTheScrollbarDown).release().perform();
Thread.sleep(1000L);
catch(Exception e1)
// now drag opposite way (downwards)
numberOfPixelsToDragTheScrollbarDown = -50;
for (int i = 500; i > 10; i += numberOfPixelsToDragTheScrollbarDown)
// this causes a gradual drag of the scroll bar, -10 units at a time
dragger.moveToElement(draggablePartOfScrollbar).clickAndHold().moveByOffset(0, numberOfPixelsToDragTheScrollbarDown).release().perform();
Thread.sleep(1000L);
【讨论】:
我真的很喜欢这个,因为它可以滚动用户的方式【参考方案7】:我不想使用 JavaScript 或任何外部库,所以这是我的解决方案 (C#):
IWebElement body = Driver.FindElement(By.TagName("body"));
IAction scrollDown = new Actions(Driver)
.MoveToElement(body, body.Size.Width - 10, 15) // position mouse over scrollbar
.ClickAndHold()
.MoveByOffset(0, 50) // scroll down
.Release()
.Build();
scrollDown.Perform();
您还可以轻松地将其用作在任何元素上向上或向下滚动的扩展方法。
【讨论】:
@raffamaiden 对您的浏览器嗤之以鼻,哈哈……我不知道为什么有人要针对他们的用户实际上不会使用的浏览器进行测试 你是对的。但是 OP 没有指定它正在测试一个应用程序。您也可以将 Selenium 用于其他目的(例如网页抓取)。【参考方案8】:1.将页面滚动到底部使用window.scrollTo(0,document.body.scrollHeight)作为参数
//导航到底部的代码
WebDriver driver = new ChromeDriver();
JavascriptExecutor jsExecuter = (JavascriptExecutor)driver;
jsExecuter.executeScript(window.scrollTo(0,document.body.scrollHeight));
2.将页面滚动到顶部使用window.scrollTo(0,document.body.scrollTop)作为参数
//导航到顶部的代码
WebDriver driver = new ChromeDriver();
JavascriptExecutor jsExecuter = (JavascriptExecutor)driver;
jsExecuter.executeScript(window.scrollTo(0,document.body.scrollTop));
3.向左滚动页面使用window.scrollTo(0,document.body.scrollLeft)作为参数
//向左导航的代码
WebDriver driver = new ChromeDriver();
JavascriptExecutor jsExecuter = (JavascriptExecutor)driver;
jsExecuter.executeScript(window.scrollTo(0,document.body.scrollLeft));
4.滚动到某个点 window.scrollTo(0,500) 作为参数
//导航到某个点的代码,例如500 在这里作为值传递
WebDriver driver = new ChromeDriver();
JavascriptExecutor jsExecuter = (JavascriptExecutor)driver;
jsExecuter.executeScript(window.scrollTo(0,500));
要直接在浏览器中检查导航,请在浏览器中打开开发人员工具并导航到控制台。 在控制台 window.scrollTo(0,400) 上执行命令
【讨论】:
【参考方案9】:Javascript
我们可以滚动到一个特定的元素:
const element = await driver.findElement(...)
await driver.executeScript("arguments[0].scrollIntoView(true);", element)
await driver.sleep(500);
【讨论】:
【参考方案10】:JavascriptExecutor jse = ((JavascriptExecutor) driver);
jse.executeScript("window.scrollTo(0, document.body.scrollHeight)");
此代码对我有用。作为我正在测试的页面,在我们向下滚动时加载。
【讨论】:
【参考方案11】:Javascript 执行器总是能完美地完成工作:
((JavascriptExecutor) driver).executeScript("scroll(0,300)");
其中(0,300)
分别是水平和垂直距离。根据您的要求放置距离。
如果您是完美主义者,并且希望在第一次尝试时获得您希望向上滚动的确切距离,请使用此工具,MeasureIt。这是一个出色的 Firefox 插件。
【讨论】:
【参考方案12】:感谢 Ripon Al Wasim 的回答。我做了一些改进。因为网络问题,我重试了3次直到break loop。
driver.get(url)
# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
try_times = 0
while True:
# Scroll down to bottom
driver.execute_script("window.scrollBy(0,2000)")
# Wait to load page
time.sleep(scroll_delay)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
if last_height == new_height:
try_times += 1
if try_times > 3:
try_times = 0
break
last_height = new_height
【讨论】:
【参考方案13】:JavascriptExecutor 最好是向下滚动一个网页
window.scrollTo
JavascriptExecutor 中的函数可以做到这一点
JavascriptExecutor js = ((JavascriptExecutor) driver);
js.executeScript("window.scrollTo(0,100");
以上代码将向下滚动 100 y 坐标
【讨论】:
【参考方案14】:JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollBy(0,250)");
【讨论】:
【参考方案15】:您应该向页面添加滚动以选择所有元素:
Selenium.executeScript("window.scrollBy(0,450)", "");
如果您的列表很大,请在执行过程中多次添加滚动条。请注意,滚动只会转到页面中的某个点,例如 (0, 450)
。
【讨论】:
【参考方案16】:如果您想垂直滚动页面以执行某些操作,您可以使用以下 JavaScript 来实现。 ((JavascriptExecutor)driver).executeScript(“window.scrollTo(0, document.body.scrollHeight)”);
Where ‘JavascriptExecutor’ is an interface, which helps executing JavaScript through Selenium WebDriver. You can use the following code to import.
导入 org.openqa.selenium.JavascriptExecutor;
2.如果要在特定元素处滚动,需要使用下面的JavaScript。
WebElement 元素 = driver.findElement(By.xpath(“//input [@id='email']”));((JavascriptExecutor) driver).executeScript(“arguments[0].scrollIntoView();”, element);
其中“元素”是您要滚动的定位器。
3.如果要在特定坐标处滚动,请使用以下 JavaScript。((JavascriptExecutor)driver).executeScript(“window.scrollBy(200,300)”); 其中“200,300”是坐标。
4.如果要垂直向上滚动,可以使用下面的JavaScript。 ((JavascriptExecutor) driver).executeScript(“window.scrollTo(document.body.scrollHeight,0)”);
如果您想向右水平滚动,请使用以下 JavaScript。 ((JavascriptExecutor)driver).executeScript(“window.scrollBy(2000,0)”);
如果要向左水平滚动,请使用以下 JavaScript。 ((JavascriptExecutor)driver).executeScript(“window.scrollBy(-2000,0)”);
【讨论】:
以上是关于使用java在Selenium WebDriver(Selenium 2)中向上或向下滚动页面的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 的 Selenium WebDriver (Selenium 2) 中 selenium.refresh() 的等效代码
使用java在Selenium WebDriver(Selenium 2)中向上或向下滚动页面
如何在 Java 中使用 Selenium WebDriver (Selenium 2) 输入文本框?
java+selenium webdriver怎么实现数据参数化