Selenium webdriver无法单击页面外的链接

时间:2012-08-20 09:16:03

标签: java selenium scroll click webdriver

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

11 个答案:

答案 0 :(得分:13)

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

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();
}

答案 1 :(得分: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();

这解决了我的问题

答案 2 :(得分:7)

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

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

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

Actions builder = new Actions(this.driver);

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

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:5)

嘿,你可以将它用于红宝石

variable.element.location_once_scrolled_into_view

将元素存储到变量

中查找

答案 5 :(得分: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();
}

答案 6 :(得分:3)

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

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

答案 7 :(得分:1)

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

item = driver.findelement(by.....);
item.SendKeys(Keys.LeftControl);
item.Click();

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

public static void scrollToElementByElement(WebElement element) {

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

}

然后调用我的主测试类

上的方法

答案 10 :(得分: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);
            }

        }


    }