硒网络驱动程序无法单击页面外的链接

2022-09-01 09:31: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.

答案 1

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

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

答案 2

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

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

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

Actions builder = new Actions(this.driver);

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

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