31

我遇到了 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>

完全相同的代码在链接可见时有效,只有在链接不可见时才有效。

Edit2:实际上,奇怪的是,它没有引发任何异常,只是转到下一条指令。所以基本上,会发生什么:

menuItem = driver.findElement(By.id("MTP")); // no exception
menuItem.click();  // no exception
//... some code ensuring we got to the next page: timeout reached
driver.findElement(By.id("smLH")).click(); // NoSuchElementException, as we're on the wrong page.
4

11 回答 11

18

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

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();
}
于 2012-08-20T17:32:13.523 回答
13

我在另一个问题中发布了相同的答案,所以这只是一个复制和粘贴。

我曾经有一个组合框,我认为不需要扩展。我所做的是使用 Actions 构建器,因为 moveToElement() 函数会自动将对象滚动到视图中。然后就可以点击了。

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

Actions builder = new Actions(this.driver);

builder.moveToElement(element);
builder.click();
builder.build().perform();

(面板只是我 POM 中的一个包装元素)

于 2014-08-11T13:16:21.417 回答
12

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

var element = driver.FindElement(By.Id("button"));
element.SendKeys(Keys.Enter);
于 2016-10-07T13:17:43.747 回答
7

最近,当 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();

这解决了我的问题

于 2012-12-13T15:16:04.330 回答
5

嘿,你可以用这个来做红宝石

variable.element.location_once_scrolled_into_view

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

于 2013-09-06T09:17:26.767 回答
4

这可能是因为您的页眉元素或页脚元素可能会阻止您要对其执行操作的元素的视图。当 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();

现在,这只是一种解决方法。我很高兴欢迎更好的解决方案来解决这个问题。

于 2017-05-23T16:33:20.720 回答
3

这个解决方案对我来说就像一个魅力:

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();
}
于 2013-10-22T20:52:30.467 回答
1

这对我有用(在 c# 中)-

item = driver.findelement(by.....);
item.SendKeys(Keys.LeftControl);
item.Click();
于 2016-09-30T15:22:10.490 回答
0

只是一个补充:在我的情况下,按钮被另一个浮动按钮重叠。

只需调整浏览器窗口的大小即可解决问题!

于 2015-07-21T07:50:45.367 回答
0

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

public static void scrollToElementByElement(WebElement element) {

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

}

然后在我的主测试类上调用该方法

于 2016-08-08T13:19:02.510 回答
0

我使用以下方法来解决可见区域中不存在元素的问题。代码向下滚动网页,直到可以对元素执行 selenium 操作。根据需要更改 Y 轴坐标和 i 值。

public void scrooling(By ele) throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            try {
                driver.findElement(ele);
                break;
            } catch (ElementNotVisibleException e) {
                JavascriptExecutor js = (JavascriptExecutor) driver;
                js.executeScript("window.scrollBy(0,400)");
                System.out.println("inside ElementNotVisibleException block");
                Thread.sleep(3000);
            } catch (NoSuchElementException e) {
                JavascriptExecutor js = (JavascriptExecutor) driver;
                js.executeScript("window.scrollBy(0,400)");
                System.out.println("inside NoSuchElementException block");
                Thread.sleep(3000);
            }

        }


    } 
于 2021-07-14T16:44:14.317 回答