Подтвердить что ты не робот

Selenium webdriver не может щелкнуть ссылку за пределами страницы

У меня проблема с 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.
4b9b3361

Ответ 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

Недавно я столкнулся с аналогичной проблемой, когда в диалоговом окне 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();

Это решило мою проблему

Ответ 3

Вместо того, чтобы переместить полосу прокрутки в положение кнопки, которая иногда не срабатывала для меня, я посылаю клавишу ввода на кнопку

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

Ответ 4

Эй, вы можете использовать это для ruby ​​

variable.element.location_once_scrolled_into_view

Сохраните элемент для поиска в переменной

Ответ 5

Я отправил этот же ответ в еще один вопрос, так что это всего лишь копия и вставка.

У меня когда-то был поле со списком, которое не было видно, что мне нужно было расширить. То, что я сделал, это использовать конструктор Actions, потому что функция moveToElement() автоматически прокручивает объект в представлении. Затем его можно нажать.

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

Actions builder = new Actions(this.driver);

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

(панель - это просто обернутый элемент в моей POM)

Ответ 6

Это решение работало как прелесть для меня:

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

Ответ 7

Это может произойти, потому что ваш элемент заголовка или элемент нижнего колонтитула может блокировать представление элемента, для которого вы хотите выполнить действие. Селен пытается прокрутить до позиции элемента, когда ему нужно выполнить некоторые действия над элементом (я использую 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();

Теперь это всего лишь обходной путь. Я с радостью приветствую лучшее решение этой проблемы.

Ответ 8

Это работает для меня (в С#) -

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

Ответ 9

Просто добавление: В моем случае кнопка была перекрыта другой плавающей кнопкой.

Просто изменение размера окна браузера решило проблему!

Ответ 10

Я использовал метод ниже для решения аналогичной проблемы для Selenium Java:

public static void scrollToElementByElement(WebElement element) {

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

}

Затем вызывается метод в моем основном тестовом классе