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

Sti*_*rik 24 java selenium scroll webdriver click

我遇到了Selenium WebDriver的问题.我尝试点击窗口页面外的链接(你需要向上滚动才能看到它).我目前的代码是相当标准的:

menuItem = driver.findElement(By.id("MTP"));
menuItem.click();
// I also tried menuItem.sendKeys(Keys.RETURN);
Run Code Online (Sandbox Code Playgroud)

我知道我可以向上滚动,在这种情况下它会起作用.但是如果你有很长的项目列表,你不一定知道你需要向下滚动多远.

有没有办法点击不在页面可见部分的链接(但滚动时会显示)?

作为旁注,我正在使用Firefox,但我打算也使用IE7/8/9和Chrome.

任何帮助将不胜感激.

编辑:我担心我不能提供源代码,因为我工作的公司不允许它,但我可以给出我想点击的链接的代码:

<div class="submenu">
  <div id="MTP">Link title</div>
</div>
Run Code Online (Sandbox Code Playgroud)

链接可见时,完全相同的代码有效,只有当链接不可用时才能使用.

编辑2:实际上,奇怪的是,它不会引发任何异常,只是转到下一条指令.所以基本上,会发生什么:

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.
Run Code Online (Sandbox Code Playgroud)

Jac*_*ekM 14

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

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();
}
Run Code Online (Sandbox Code Playgroud)


小智 10

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

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

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

Actions builder = new Actions(this.driver);

builder.moveToElement(element);
builder.click();
builder.build().perform();
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*IBM 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();
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题


小智 7

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

var element = driver.FindElement(By.Id("button"));
element.SendKeys(Keys.Enter);
Run Code Online (Sandbox Code Playgroud)

  • 大量痛苦的答案,当这对于许多情况来说足够了..很好的电话。 (2认同)

The*_*kie 5

嘿,你可以用这个红宝石

variable.element.location_once_scrolled_into_view
Run Code Online (Sandbox Code Playgroud)

存储元素以在变量中查找