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

问题描述 投票:0回答:12

我在使用 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.
java selenium scroll click webdriver
12个回答
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();
}

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 中的一个包装元素)


13
投票

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

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

7
投票

我最近遇到了类似的问题,JS 对话框中有一个可选择对象的列表。有时,硒不会在列表中选择正确的对象。所以我找到了这个 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();

解决了我的问题


5
投票

嘿,你可以用它来红宝石

variable.element.location_once_scrolled_into_view

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


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

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


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

1
投票

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

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

0
投票

补充一下: 就我而言,该按钮与另一个浮动按钮重叠。

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


0
投票

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

public static void scrollToElementByElement(WebElement element) {

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

}

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


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

        }


    } 

0
投票

我不知道 Java 的等效项,但解决“单击页面外部链接”问题的最简单方法是使用 WebElements 的

location_once_scrolled_into_view
属性。

此属性可能会更改,恕不另行通知。使用它来发现元素在屏幕上的位置,以便我们可以单击它。此方法应该使元素滚动到视图中。 返回屏幕上的左上角位置,如果元素不可见,则返回零坐标。

如果您需要它们,它会返回坐标,但它也会自动向下滚动页面以显示元素。

例如:

element = driver.find_element(By.XPATH, '//b[text()="Next"]')
element.location_once_scrolled_into_view
element.click()

我使用的是Python3.11,Selenium 4。

© www.soinside.com 2019 - 2024. All rights reserved.