Selenium click element не работает

Selenium Driver. Нажатие на элемент. Решение часто возникающих проблем

Для того, чтобы выполнить клик по элементу в арсенале класса WebElement есть метод click() .

Существуют определенные условия для элемента, по которому можно кликнуть: элемент должен быть виден и его ширина и высота должны быть больше 0. Если элемент скрыт за границей окна браузера, то Selenium автоматически проскроллит страницу, чтобы элемент стал видимым. И только после этого кликнет по нему. Если проскроллить страницу не получается (это может быть по разным причинам), то возникнет исключение MoveTargetOutOfBoundsException .

В случае, если нажатие на элемент вызывает загрузку новой страницы, то этот метод будет блокировать дальнейшее выполнение, пока страница не загрузится. После перезагрузки страницы любые операции над этим элементом приведут к возникновению StaleElementReferenceException. Если страница загружается с помощью AJAX, то метод не будет дожидаться ее загрузки, в этом случае нужно самостоятельно убедиться в том, что страница была загружена.

Предыдущие версии Selenium осуществляли клик в левый верхний угол элемента, начиная с версии 2.16 это было изменено, теперь клик выполняется в центр элемента. Бывают случаи, когда элемент виден лишь частично и клик в центр элемента может не срабатывать. Для того, чтобы кликнуть по указанным координатам можно использовать класс Actions, а конкретно его методы moveToElement(WebElement toElement, int xOffset, int yOffset) и click() . Подробнее про наведение курсора на элемент можно почитать в этой статье:

Читайте также:  Починить какое спряжение 1 или 2

Selenium сначала наведет курсор в заданную точку (в этом случае в левый верхний угол), а метод click() , выполненный без параметров, осуществит нажатие кнопки мыши в текущем положении курсора.
Для расчета смещения, например, координат правого нижнего угла, будет полезен метод getSize() :

Некоторые веб-приложения переопределяют обработчик нажатия правой кнопки мыши для элементов, например, для вывода кастомного контекстное меню, вместо стандартного меню браузера. Работа с таким меню осуществляется точно также как и с другими элементами страницы — чаще это обычный элемент DOM, который изначально скрыт, или который создается с помощью javascript при нажатии правой кнопки. Для тестирования таких случаев нужно нажать правой кнопкой на элементе и дождаться появления меню, потому что обычно такие элементы загружаются не сразу. Для имитации нажатия правой кнопки мыши используется метод contextClick(WebElement onElement) класса Actions . Клик осуществляется в центр элемента:

Иногда плагины на страницах скрывают элементы, создавая для них обвертки, перенаправляющие нажатия мыши. Бывает, что эти элементы появляются лишь по наведению курсора или при других условиях. И если сам плагин не представляет ценности для тестирования, а нужно лишь выполнить действие, тут и возникает проблема нажатия на невидимый элемент. При попытке кликнуть по скрытому элементу возникнет исключение ElementNotVisibleException . Selenium не взаимодействует с невидимыми элементами, т.е. выполнить нажатие на них нельзя. Но, как говорится, если очень хочется, то можно) Кликнуть по невидимому элементу можно с помощью javascript :

Источник

Не могу нажать на кнопку с помощью selenium: Other element would receive the click

Имеется сайт такого вида

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

Вот сам код этой кнопки взятый из сайта

Пытался еще подставить другой класс

В итоге получаю вот такие ошибки

и еще одну на другую попытку

Требуется нажать на эту кнопку

2 ответа 2

Первая ваша ошибка Compound class names not permitted говорит о том, что искать методом find_element_by_class_name() можно только элементы с одним классом. У вас их два: class=»highcharts-button highcharts-button-normal» . Чтобы искать такие элементы пользуйтесь поиском по css селекторам или xpath.

Вторая ошибка Element is not clickable at point (153, 64). Other element would receive the click говорит о том, что эелемент перекрыт другим. По перекрытым эелементам хромдрайвер не разрешает кликать.

Попробуйте кликнуть по элементу text . Приведу пример, но не ручаюсь, что мой xpath будет работать всегда, так как нужно видеть весь DOM, чтобы составить оптимальный.

Во-первых, я бы предложил сделать assert на то, что кнопка есть и находится в кликабельном состоянии, а во-вторых, никогда не стоит искать по классу, если только этот класс не один-разъединственный вот специально для этого элемента. Нужно искать по наиболее уникальным параметрам. В данном случае, я бы обратил внимание на text. В крайнем случае, в отдельной переменной укажите x-path (либо css-селектор, если больше нравится) кнопки и уже через него ищите ее и кликайте.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.15.40479

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Не всегда срабатывает click по элементу

#1 Prettser

  • Members
  • 53 сообщений
  • Selenium + TestNG + PageFactory

    Строю фреймворк для написания тестов и загвоздка в методе с кликом по кнопке.

    Суть в том, что клик какбЭ не всегда срабатывает, и положенный POST запрос от формы не уходит. Вроде ожидаю как положено элемента, вроде кликаю по нему, но почти в половине случаев фактически в браузере клика не происходит.

    Привожу части кода

    #2 elvis

  • Members
  • 189 сообщений
    • Город: Tallinn

    не отработали какие-то вещи на странице, нужно ждать, так как ExpectedConditions . elementToBeClickable — не панацея, увы

    #3 Prettser

  • Members
  • 53 сообщений
  • Забыл написать, что submit самой формы вместо click по button — выручает, но это не честно по отношению к действиям настоящего пользователя.

    Исходя из этого, есть подозрение, что просто браузер еще не знает о функции

    которая прописана сразу же после блока с формой. Может ли быть это причиной?

    #4 elvis

  • Members
  • 189 сообщений
    • Город: Tallinn

    попробуй проверять document.readyState (гугл в помощь) или то, что функция определена

    #5 serjb9

  • Members
  • 68 сообщений
  • Вместо клика что происходит?

    Элемент в зоне видимости?

    Переинциализировать элемент перед кликом пробовал?

    #6 Prettser

  • Members
  • 53 сообщений
  • Вместо клика что происходит?

    Элемент в зоне видимости?

    Переинциализировать элемент перед кликом пробовал?

    Ничего не происходит. По крайней мере не происходит логаут. Строчка кода выполняется, но результат клика не виден, ни каких ошибок тоже. В этом вся суть вопроса

    Элемент в зоне видимости, доступен и кликабелен.

    Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.

    Селениум не выкидывает ошибок, он думает, что честно нажал на видимый элемент. Склоняюсь к озвученному мной выше варианту, что дело в функции.

    — Селениум жмет кнопку

    — После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.

    Попросил разработчиков функцию прописать выше. А пока делаю submit формы вместо функции.

    #7 serjb9

  • Members
  • 68 сообщений
  • Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.

    Я тоже раньше так считал, и не поверил своим глазам, когда повесил переинициализацию на элементы.

    Где собака зарыта и на какой глубине, я пока не знаю (возможно плацебо + время инициализации делают свое дело 🙂 ).

    — После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.

    Можно было проще обыграть:

    — Т.к. это логаут смотрим, разлогинило нас или нет

    Если не вышли: — Чекаем контент на script (есть ли, загрузился ли)

    — Жмем кнопку еще раз

    и в loop если необходимо

    #8 elvis

  • Members
  • 189 сообщений
    • Город: Tallinn

    Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.

    Я тоже раньше так считал, и не поверил своим глазам, когда повесил переинициализацию на элементы.

    Где собака зарыта и на какой глубине, я пока не знаю (возможно плацебо + время инициализации делают свое дело 🙂 ).

    — После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.

    Можно было проще обыграть:

    — Т.к. это логаут смотрим, разлогинило нас или нет

    Если не вышли: — Чекаем контент на script (есть ли, загрузился ли)

    — Жмем кнопку еще раз

    и в loop если необходимо

    А если у юзеров кнопка будет срабатывать всегда со 2й попытки? Тест ваш будет зелёный?

    #9 serjb9

  • Members
  • 68 сообщений
  • Постановка такой конструкции дала бы понять, что клик происходит после загрузки скрипта.

    Можно было бы вычеркнуть 1+2 шаги нажатия на кнопку, согласен.

    А что делать, если затрекать события не получается ни в какую?

    #10 Prettser

  • Members
  • 53 сообщений
  • Перед кликом на кнопку временно сделал вытаскивание в строку driver .getPageSource(); И там вся страница целиком (вместе со скриптом).

    И, наверное, это логично. Ведь если элемент отрисован и кликабелен (что проверяется перед кликом), значит это уже идет этап отрисовки и код страницы загружен вместе с нужной функцией.

    Простой слип в 1000мс перед кликом избавляет от проблемы. Значит чего-то не хватает секундой раньше, но так и не пойму чего. 🙂

    Секунда ничего не решает и можно так и оставить. По отношению к пользователю и функциональному тестированию все честно, ведь никто в реальности так быстро жать кнопку не сможет.

    Но я же теперь спать нормально не смогу, буду думать о вопросе «Почему? И как можно сделать красиво?»

    #11 elvis

  • Members
  • 189 сообщений
    • Город: Tallinn

    Перед кликом на кнопку временно сделал вытаскивание в строку driver .getPageSource(); И там вся страница целиком (вместе со скриптом).

    И, наверное, это логично. Ведь если элемент отрисован и кликабелен (что проверяется перед кликом), значит это уже идет этап отрисовки и код страницы загружен вместе с нужной функцией.

    Простой слип в 1000мс перед кликом избавляет от проблемы. Значит чего-то не хватает секундой раньше, но так и не пойму чего. 🙂

    Секунда ничего не решает и можно так и оставить. По отношению к пользователю и функциональному тестированию все честно, ведь никто в реальности так быстро жать кнопку не сможет.

    Но я же теперь спать нормально не смогу, буду думать о вопросе «Почему? И как можно сделать красиво?»

    Если это один тест, то можно сформулировать требование так — кнопка logout активна через N ms после того, как стала видимой. И требования к задержке согласовать с продакт оунером. Далее дрючить девов 😀

    Источник

    Оцените статью