如何使用Selenium WebDriver和Java滚动特定的DIV?

时间:2014-11-28 12:57:36

标签: java selenium selenium-webdriver

WebDriver无法识别某些WebElements,WebDriver无法找到浏览器可见区域中不可见的元素。

为了使WebDri可以通过WebDriver查看,我们需要在浏览器的视图中显示该元素以向下滚动特定的div!

如何在我的网页的特定区域执行操作(向下滚动并单击)。我尝试了很多,没有帮助我。

请帮我解决我的问题。

10 个答案:

答案 0 :(得分:8)

首先,这里发布的大多数答案都不在主题之内。我现在一直在使用selenium 2和selenium 3,webdriver可以处理窗口滚动以使元素可见。

对于每个人发布的片段如:

driver.execute_script('scrollBy(0, 250)')

你根本得不到问题!

实际上我还没有找到一种方法来正确模拟滚动手柄的拖动动作,但this answer看起来很有希望 - 但我没试过。

所以到目前为止,我个人有两种方法可以做到这一点:

  1. 使用Keys.ARROW_DOWN
  2. 使用Keys.PAGE_DOWN
  3. 实际上还有第三种方法,只要放弃硒,如果他们提供任何API,请联系网站。

答案 1 :(得分:6)

向下滚动:

import org.openqa.selenium.JavascriptExecutor;
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(0, 250)"); //y value '250' can be altered

向上滚动:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); //x value '250' can be altered

滚动页面底部:

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

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.END).perform();

以慢动作完全滚动到底部:

for (int second = 0;; second++) {
    if(second >=60){
        break;
    }
    ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,400)", ""); //y value '400' can be altered
    Thread.sleep(3000);
}

JavascriptExecutor jse = (JavascriptExecutor)driver;
for (int second = 0;; second++) {
    if(second >=60){
        break;
    }
    jse.executeScript("window.scrollBy(0,800)", ""); //y value '800' can be altered
    Thread.sleep(3000);
}

自动滚动到您的WebElement:

Point hoverItem =driver.findElement(By.xpath("Value")).getLocation();
((JavascriptExecutor)driver).executeScript("return window.title;");    
Thread.sleep(6000);
((JavascriptExecutor)driver).executeScript("window.scrollBy(0,"+(hoverItem.getY())+");"); 
// Adjust your page view by making changes right over here (hoverItem.getY()-400)

((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", driver.findElement(By.xpath("Value')]")));

WebElement element = driver.findElement(By.xpath("Value"));
Coordinates coordinate = ((Locatable)element).getCoordinates(); 
coordinate.onPage(); 
coordinate.inViewPort();

答案 2 :(得分:6)

最简单的方法是执行Javascript以向上/向下滚动元素。

JavascriptExecutor jsExec = (JavascriptExecutor) driver;
jsExec.executeScript("document.getElementById('id').scrollDown += 100");

答案 3 :(得分:3)

'Settings.Secure.putString()'

答案 4 :(得分:2)

使用JavascriptExceutor的{​​{1}}方法执行此操作的另一种方法:

scrollIntoView()

答案 5 :(得分:1)

首先你应该滚动而不是找到元素,如下所示:

document.getElementById("your div id").scrollTop(250);

在上面你可以找到特定的div。

您也可以尝试以下内容:

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

答案 6 :(得分:0)

考虑您的HTML如下所示:

<div id="someId" class="className" style="position: relative; top: 0px; left: opx;>

您可以在style中观察div属性 在上面的示例

中检查top的值 0px

现在尝试做类似的事情:

$('.className').animate({top: "-60px"});

这将帮助您向下滚动。 它是一个JavaScript执行器,所以你当然需要实现它。

答案 7 :(得分:0)

我的“替代方法”是按元素的x和y坐标滚动到位置。我还为y添加了一个偏移量,这样任何页眉/页脚或其他元素都不会阻止我想要滚动到的元素的可见性。

我在这个问题下贴了我的答案 -

Selenium webdriver can't click on a link outside the page

答案 8 :(得分:0)

所有发布的答案都不适合我,但我找到了基于this post的解决方案。

((JavascriptExecutor) driver).executeScript(
    "arguments[0].scrollTop=arguments[1].offsetTop",
    divWithScrollbarElement,
    elementToScrollTo);

其中divWithScrollbarElement是您要滚动的div元素,而elementToScrollTo是您想要查看的子元素(在我的情况下实际上是我的元素的父元素)最初试图查看)。如果elementToScrollTo实际上还没有在DOM中,您可能需要使用脚本一次尽可能向下滚动,然后再次加载元素。

答案 9 :(得分:0)

如您所见,webdriver将找不到不可见的元素,因此您需要滚动到该元素。但是,您无法直接滚动到该元素,因为webdriver在可见之前不会找到它。赶上22。

但是我确实有一种方法可以让您在DIV中滚动。首先将要滚动的DIV分配给元素变量,然后可以使用javascript滚动该元素,而不是滚动整个窗口。

一些VB.NET示例代码应易于适应其他语言:

Dim div_to_scroll As IWebElement = driver.FindElement(By.XPath("[put your xpath here]"))

driver.ExecuteJavaScript("arguments[0].scrollBy(0,500)", div_to_scroll)

' Short pause to make sure the screen updates:
System.Threading.Thread.Sleep(500)

如果您不知道需要滚动多远,则需要进行循环测试,以查看所需的元素是否可见。这不是一种特别优雅或快速的处理方式,但是webdriver并不是一开始的快速解决方案,我发现这种方法非常健壮。