seleniumwebdriver不能点击页面外的链接

我有一个Selenium WebDriver的问题。 我尝试点击窗口页面外的链接(您需要向上滚动以查看)。 我目前的代码是相当标准的:

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

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

有什么办法可以点击不在页面可见部分的链接(但是如果你滚动的话就可以看到)?

作为一个方面说明,我使用Firefox,但我打算使用IE7 / 8/9和Chrome。

任何帮助将不胜感激。

编辑:恐怕我不能给源代码,因为我工作的公司不允许它,但我可以给我点击链接的代码:

 <div class="submenu"> <div id="MTP">Link title</div> </div> 

当链接可见时,完全相同的代码工作,只有当链接不可用时才起作用。

编辑2:其实,奇怪的是,它不会引发任何exception,只是去下一个指令。 所以基本上,会发生什么是:

 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. 

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

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

当JS对话框中有一个可选对象列表时,我最近碰到类似的问题。 有时selenium不会在列表中select正确的对象。 所以我发现这个javascript的build议:

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

这解决了我的问题

嘿,你可以使用这个ruby

 variable.element.location_once_scrolled_into_view 

存储元素以查找variables

而不是将滚动条移动到button位置,有时它不适用于我,我发送回车键到button

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

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

我曾经有一个combobox,是不是我需要扩大。 我所做的是使用“动作”构build器,因为moveToElement()函数将自动将对象滚动到视图中。 然后它可以被点击。

 WebElement element = panel.findElement(By.className("tabComboBoxButton")); Actions builder = new Actions(this.driver); builder.moveToElement(element); builder.click(); builder.build().perform(); 

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

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

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

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

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

这适用于我(在C#中) –

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

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

只是调整浏览器窗口大小解决了问题!

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

 public static void scrollToElementByElement(WebElement element) { Coordinates coordinates = ((Locatable)element).getCoordinates(); coordinates.inViewPort(); coordinates.click(); //if needed } 

然后调用我的主要testing类的方法