it-swarm.com.ru

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.
19
Stilltorik

На самом деле можно автоматически прокрутить до элемента. Хотя это не очень хорошее решение в этом случае (должен быть способ заставить его работать без прокрутки), я опубликую его как обходной путь. Я надеюсь, что кто-то придумает лучшую идею ...

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

Я отправил этот же ответ в другой вопрос так что это просто копия и вставка.

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

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

Actions builder = new Actions(this.driver);

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

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

7
Bill Thayer

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

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

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

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

7
Brian Gleeson - IBM

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

variable.element.location_once_scrolled_into_view

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

5
The Rookie

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

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

3
yuva

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

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

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

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

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

Изменение размера окна браузера решило проблему!

0
Kurt Ludikovsky

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

public static void scrollToElementByElement(WebElement element) {

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

}

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

0
BlueGunner