Java Selenium webdriver可以';t单击页面外的链接

Java Selenium webdriver可以';t单击页面外的链接,java,selenium,scroll,click,webdriver,Java,Selenium,Scroll,Click,Webdriver,我对Selenium WebDriver有问题。我尝试单击窗口页面之外的链接(您需要向上滚动才能看到)。我目前的代码相当标准: menuItem = driver.findElement(By.id("MTP")); menuItem.click(); // I also tried menuItem.sendKeys(Keys.RETURN); 我知道我可以向上滚动,在这种情况下它会起作用。但是,如果您有一个很长的项目列表,您不一定知道需要向下滚动多远 是否有任何方法可以单击不在页面可见部分

我对Selenium WebDriver有问题。我尝试单击窗口页面之外的链接(您需要向上滚动才能看到)。我目前的代码相当标准:

menuItem = driver.findElement(By.id("MTP"));
menuItem.click();
// I also tried menuItem.sendKeys(Keys.RETURN);
我知道我可以向上滚动,在这种情况下它会起作用。但是,如果您有一个很长的项目列表,您不一定知道需要向下滚动多远

是否有任何方法可以单击不在页面可见部分的链接(但如果滚动,该链接将可见)

顺便说一句,我正在使用Firefox,但我也计划使用IE7/8/9和Chrome

任何帮助都将不胜感激

编辑:恐怕我不能给出源代码,因为我工作的公司不允许,但我可以给出我想要点击的链接的代码:

<div class="submenu">
  <div id="MTP">Link title</div>
</div>

实际上,可以自动滚动到元素。虽然在这种情况下这不是一个好的解决方案(必须有一种不滚动的方式使其工作),但我将把它作为一种解决方法发布。我希望有人能想出更好的主意

public void scrollAndClick(By by)
{
   WebElement element = driver.findElement(by);
   int elementPosition = element.getLocation().getY();
   String js = String.format("window.scroll(0, %s)", elementPosition);
   ((JavascriptExecutor)driver).executeScript(js);
   element.click();
}

我最近遇到了一个类似的问题,在JS对话框中有一个可选对象列表。有时候selenium无法在列表中选择正确的对象。所以我发现了这个javascript建议:

WebElement target = driver.findElement(By.id("myId"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", target);
Thread.sleep(500); //not sure why the sleep was needed, but it was needed or it wouldnt work :(
target.click();

这就解决了我的问题

嘿,你可以把这个用在ruby上

variable.element.location_once_scrolled_into_view

将要查找的元素存储在变量中

此解决方案对我来说非常有吸引力:

public void click(By by) throws Exception{
    WebElement element = driver.findElement(by);
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    Thread.sleep(500);
    element.click();
}

我发布了同样的答案,所以这只是一个复制和粘贴

我曾经有一个组合框,在我看来不需要扩展。我使用的是Actions builder,因为moveToElement()函数会自动将对象滚动到视图中。然后可以点击它

WebElement element = panel.findElement(By.className("tabComboBoxButton"));

Actions builder = new Actions(this.driver);

builder.moveToElement(element);
builder.click();
builder.build().perform();
(面板只是我POM中的一个包装元素)

只是一个添加: 在我的例子中,按钮与另一个浮动按钮重叠


只需调整浏览器窗口的大小就解决了问题

我使用下面的方法来解决Selenium Java的类似问题:

public static void scrollToElementByElement(WebElement element) {

    Coordinates coordinates = ((Locatable)element).getCoordinates();
    coordinates.inViewPort();
    coordinates.click(); //if needed

}
然后调用主测试类上的方法

这对我来说很有效(在c#中)-


我没有将滚动条移动到按钮位置(有时它对我不起作用),而是将enter键发送到按钮

var element = driver.FindElement(By.Id("button"));
element.SendKeys(Keys.Enter);

这可能是因为页眉元素或页脚元素可能阻止了要对其执行操作的元素的视图。当Selenium必须对元素执行某些操作时,它会尝试滚动到元素位置(我使用的是Selenium WebDriver v3.4.0)

这里有一个解决方法-

private WebElement scrollToElementByOffset(WebElement element, int offset) {
    JavascriptExecutor jse = (JavascriptExecutor) driver;
    jse.executeScript("window.scrollTo(" + element.getLocation().getX() + "," + (element.getLocation().getY()
            + offset) + ");");

    return element;
}
上面的函数将视图滚动到元素,然后按您提供的偏移量进一步滚动。您可以通过以下操作调用此方法-

WebElement webElement = driver.findElement(By.id("element1"));
scrollToElementByOffset(webElement, -200).click();

现在,这只是一个解决办法。我高兴地欢迎更好地解决这一问题

您使用的是什么版本的webdriver?我知道这在早期版本中是一个问题,但在以后的版本中得到了解决。如果不需要,请尝试使用2.25。您是否需要滚动浏览器的滚动条或页面上列表的自定义滚动条?我已经在使用2.25版了。至于滚动条,页面中只有浏览器的滚动条。但理想情况下,我不想使用任何滚动条。你能提供一些测试中网页的源代码吗?你有例外吗?你能把它贴出来吗?真是妙不可言!(所有的方法都是大写的,尽管在C#)Bill中,这个链接回到了同一个问题。我想看看你想链接到的问题。你能用正确的链接更新吗?我怎样才能在不调整浏览器窗口大小的情况下解决这个问题?老实说,这已经是很久以前的事了。我刚刚想到了什么,但这只是一个猜测,需要有人验证:如果按钮首先在3D hirarchy(z-index属性)中用javascript上移到顶部会怎么样?只是个主意。不知道它是否有效。大量痛苦的答案,当这对许多情况来说足够了。。打得好。我认为真正的问题是webdriver找不到按钮。
private WebElement scrollToElementByOffset(WebElement element, int offset) {
    JavascriptExecutor jse = (JavascriptExecutor) driver;
    jse.executeScript("window.scrollTo(" + element.getLocation().getX() + "," + (element.getLocation().getY()
            + offset) + ");");

    return element;
}
WebElement webElement = driver.findElement(By.id("element1"));
scrollToElementByOffset(webElement, -200).click();