在当前视图中找到一个元素

时间:2012-02-16 14:36:12

标签: java firefox selenium webdriver

当我将方法WebElement#findElement(By)By.cssSelector一起使用时,它会在整个页面中搜索元素。但我想通过current-view-only来限制选择。我不想让Selenium“使用滚动条”。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

实现这一目标的方法可能是获取页面上的所有元素,然后将其从视口中过滤掉。

WebElement.getLocation()是此的基础工具。

如果您位于页面的左上角(加载后默认),则可以使用window.innerHeightwindow.innerWidth(大多数浏览器,但IE9 +)。

// assuming JS is enabled for this instance of driver
JavascriptExecutor js = (JavascriptExecutor)driver;

int viewportWidth = (Integer)js.executeScript("return window.innerWidth;");
int viewportHeight = (Integer)js.executeScript("return window.innerHeight;");

List<WebElement> list = driver.findElements(By.cssSelector("whatever"));
for (Iterator<WebElement> iter = list.iterator(); iter.hasNext(); ) {
    WebElement elem = iter.next();
    Point p = elem.getLocation();
    if ((p.getX() > viewportWidth) || (p.getY() > viewportHeight)) {
        iter.remove();
    }
}

如果您无法确定视口是否处于默认位置(坐标[0,0]处),则可以添加window.mozInnerScreenXwindow.mozInnerScreenY(需要Firefox 3.6+)条件。或者,可能更好,window.scrollXwindow.scrollY

您还必须定义是否包含部分显示的元素,并相应地调整算法(WebElement.getSize()以进行救援!)。

如果您在搜索后遇到问题,视口会发生变化,请尝试通过window.scroll()将其恢复到原始位置。