Arhn - архитектура программирования

Веб-драйвер Selenium не может щелкнуть ссылку за пределами страницы

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

  • Какую версию вебдрайвера вы используете? Я знаю, что это было проблемой в более ранних версиях, но она была решена в более поздних версиях. Попробуйте использовать 2.25, если это не так. 20.08.2012
  • Также вам нужно прокручивать прокрутку браузера или какую-то пользовательскую прокрутку для списка на странице? 20.08.2012
  • Я уже использую версию 2.25. Что касается полосы прокрутки, то на странице присутствует только прокрутка браузера. Но в идеале я не хочу использовать полосу прокрутки. 20.08.2012
  • Можете ли вы предоставить исходный код тестируемой веб-страницы? 20.08.2012
  • Вы получаете исключение? Не могли бы вы опубликовать это? 20.08.2012
  • Отредактировал свой пост, чтобы ответить на ваши вопросы Арек и ЯцекМ. 21.08.2012
  • Используйте PhantomJS вместо Firefox 01.11.2015

Ответы:


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

2

Я разместил этот же ответ в другом вопросе так что это просто копирование и вставка.

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

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

Actions builder = new Actions(this.driver);

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

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

11.08.2014
  • Работал как шарм! (Все методы в верхнем регистре, хотя в C#) 26.09.2015
  • @ Билл, эта ссылка ведет к тому же вопросу. Я хотел бы увидеть проблему, на которую вы хотели сослаться. Не могли бы вы обновить с правильной ссылкой, пожалуйста? 10.09.2019

  • 3

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

    var element = driver.FindElement(By.Id("button"));
    element.SendKeys(Keys.Enter);
    
    07.10.2016
  • Тонны мучительных ответов, когда этого достаточно во многих случаях... хороший звонок. 17.10.2017
  • Я думаю, что настоящая проблема в том, что веб-драйвер не может найти кнопку. 18.12.2018

  • 4

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

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

    13.12.2012

    5

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

    variable.element.location_once_scrolled_into_view
    

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

    06.09.2013

    6

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

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

    23.05.2017

    7

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

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

    8

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

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

    9

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

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

    21.07.2015
  • Как я могу решить проблему, не изменяя размер окна браузера? 25.05.2016
  • Честно говоря, это уже было некоторое время назад. Что только приходит мне в голову, но это всего лишь догадка, которая должна быть проверена кем-то: что, если кнопка сначала будет перемещена в 3D-иерархии (свойство z-index) наверх с помощью javascript? Просто идея. Не знаю, работает ли это. 27.05.2016

  • 10

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

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

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

    08.08.2016

    11

    Я использовал метод ниже, чтобы решить проблему элемента, отсутствующего в видимой области. Код прокручивает веб-страницу вниз, пока над элементом не можно будет выполнить операции с селеном. Измените координату оси Y и значение i в соответствии с требованием.

    public void scrooling(By ele) throws InterruptedException {
            for (int i = 0; i < 10; i++) {
                try {
                    driver.findElement(ele);
                    break;
                } catch (ElementNotVisibleException e) {
                    JavascriptExecutor js = (JavascriptExecutor) driver;
                    js.executeScript("window.scrollBy(0,400)");
                    System.out.println("inside ElementNotVisibleException block");
                    Thread.sleep(3000);
                } catch (NoSuchElementException e) {
                    JavascriptExecutor js = (JavascriptExecutor) driver;
                    js.executeScript("window.scrollBy(0,400)");
                    System.out.println("inside NoSuchElementException block");
                    Thread.sleep(3000);
                }
    
            }
    
    
        } 
    
    14.07.2021
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..