Selenium webdriver can't click on a link outside the page

安稳与你 提交于 2019-11-26 22:29:57

It is actually possible to scroll automatically to element. Although this is not a good solution in this case (there must be a way to get it working without scrolling) I will post it as a workaround. I hope someone will come up with better idea...

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

I ran into a similar problem recently when there was a list of selectable objects in a JS dialog. Sometimes selenium would not select the correct object in the list. So i found this javascript suggestion:

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

That solved my issue

Bill Thayer

I posted this same answer in another question so this is just a copy and paste.

I once had a combo box that wasn't in view that I needed to expand. What I did was use the Actions builder because the moveToElement() function will automatically scroll the object into view. Then it can be clicked on.

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

Actions builder = new Actions(this.driver);

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

(panel is simply a wrapped element in my POM)

Instead of move the scrollbar to the button position, which sometimes it didn't work for me, I send the enter key to the button

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

Hey you can use this for ruby

variable.element.location_once_scrolled_into_view

Store the element to find in variable

It might be occurring because your header element or the footer element might be blocking the view of the element you want to perform action on. Selenium tries to scroll to the element position when it has to perform some action on the element (I am using Selenium WebDriver v3.4.0).

Here is a workaround -

private WebElement scrollToElementByOffset(WebElement element, int offset) {
    JavascriptExecutor jse = (JavascriptExecutor) driver;
    jse.executeScript("window.scrollTo(" + element.getLocation().getX() + "," + (element.getLocation().getY()
            + offset) + ");");

    return element;
}

The above function scrolls the view to the element and then scrolls further by the offset you provide. And you can call this method by doing something like -

WebElement webElement = driver.findElement(By.id("element1"));
scrollToElementByOffset(webElement, -200).click();

Now, this is just a workaround. I gladly welcome better solutions to this issue.

This solution worked like a charm for me:

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

This works for me (in c#)-

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

Just an addition: In my case the button was overlapped by another floating button.

Just resizing the browser window solved the problem!

BlueGunner

I used the method below to solve a similar issue for Selenium Java:

public static void scrollToElementByElement(WebElement element) {

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

}

Then called on the method on my main test class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!