- Selenium Driver. Нажатие на элемент. Решение часто возникающих проблем
- Не могу нажать на кнопку с помощью selenium: Other element would receive the click
- 2 ответа 2
- Похожие
- Подписаться на ленту
- Не всегда срабатывает click по элементу
- #1 Prettser
- #2 elvis
- #3 Prettser
- #4 elvis
- #5 serjb9
- #6 Prettser
- #7 serjb9
- #8 elvis
- #9 serjb9
- #10 Prettser
- #11 elvis
Selenium Driver. Нажатие на элемент. Решение часто возникающих проблем
Для того, чтобы выполнить клик по элементу в арсенале класса WebElement есть метод click() .
Существуют определенные условия для элемента, по которому можно кликнуть: элемент должен быть виден и его ширина и высота должны быть больше 0. Если элемент скрыт за границей окна браузера, то Selenium автоматически проскроллит страницу, чтобы элемент стал видимым. И только после этого кликнет по нему. Если проскроллить страницу не получается (это может быть по разным причинам), то возникнет исключение MoveTargetOutOfBoundsException .
В случае, если нажатие на элемент вызывает загрузку новой страницы, то этот метод будет блокировать дальнейшее выполнение, пока страница не загрузится. После перезагрузки страницы любые операции над этим элементом приведут к возникновению StaleElementReferenceException. Если страница загружается с помощью AJAX, то метод не будет дожидаться ее загрузки, в этом случае нужно самостоятельно убедиться в том, что страница была загружена.
Предыдущие версии Selenium осуществляли клик в левый верхний угол элемента, начиная с версии 2.16 это было изменено, теперь клик выполняется в центр элемента. Бывают случаи, когда элемент виден лишь частично и клик в центр элемента может не срабатывать. Для того, чтобы кликнуть по указанным координатам можно использовать класс Actions, а конкретно его методы moveToElement(WebElement toElement, int xOffset, int yOffset) и click() . Подробнее про наведение курсора на элемент можно почитать в этой статье:
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
Selenium + TestNG + PageFactory
Строю фреймворк для написания тестов и загвоздка в методе с кликом по кнопке.
Суть в том, что клик какбЭ не всегда срабатывает, и положенный POST запрос от формы не уходит. Вроде ожидаю как положено элемента, вроде кликаю по нему, но почти в половине случаев фактически в браузере клика не происходит.
Привожу части кода
#2 elvis
- Город: Tallinn
не отработали какие-то вещи на странице, нужно ждать, так как ExpectedConditions . elementToBeClickable — не панацея, увы
#3 Prettser
Забыл написать, что submit самой формы вместо click по button — выручает, но это не честно по отношению к действиям настоящего пользователя.
Исходя из этого, есть подозрение, что просто браузер еще не знает о функции
которая прописана сразу же после блока с формой. Может ли быть это причиной?
#4 elvis
- Город: Tallinn
попробуй проверять document.readyState (гугл в помощь) или то, что функция определена
#5 serjb9
Вместо клика что происходит?
Элемент в зоне видимости?
Переинциализировать элемент перед кликом пробовал?
#6 Prettser
Вместо клика что происходит?
Элемент в зоне видимости?
Переинциализировать элемент перед кликом пробовал?
Ничего не происходит. По крайней мере не происходит логаут. Строчка кода выполняется, но результат клика не виден, ни каких ошибок тоже. В этом вся суть вопроса
Элемент в зоне видимости, доступен и кликабелен.
Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.
Селениум не выкидывает ошибок, он думает, что честно нажал на видимый элемент. Склоняюсь к озвученному мной выше варианту, что дело в функции.
— Селениум жмет кнопку
— После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.
Попросил разработчиков функцию прописать выше. А пока делаю submit формы вместо функции.
#7 serjb9
Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.
Я тоже раньше так считал, и не поверил своим глазам, когда повесил переинициализацию на элементы.
Где собака зарыта и на какой глубине, я пока не знаю (возможно плацебо + время инициализации делают свое дело 🙂 ).
— После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.
Можно было проще обыграть:
— Т.к. это логаут смотрим, разлогинило нас или нет
Если не вышли: — Чекаем контент на script (есть ли, загрузился ли)
— Жмем кнопку еще раз
и в loop если необходимо
#8 elvis
- Город: Tallinn
Это на самом деле не элемент, а проксиэлемент (этож PageFactory) и поиск по сути происходит при каждом обращении.
Я тоже раньше так считал, и не поверил своим глазам, когда повесил переинициализацию на элементы.
Где собака зарыта и на какой глубине, я пока не знаю (возможно плацебо + время инициализации делают свое дело 🙂 ).
— После этого прогружается функция, которая не вызвалась на момент нажатия кнопки.
Можно было проще обыграть:
— Т.к. это логаут смотрим, разлогинило нас или нет
Если не вышли: — Чекаем контент на script (есть ли, загрузился ли)
— Жмем кнопку еще раз
и в loop если необходимо
А если у юзеров кнопка будет срабатывать всегда со 2й попытки? Тест ваш будет зелёный?
#9 serjb9
Постановка такой конструкции дала бы понять, что клик происходит после загрузки скрипта.
Можно было бы вычеркнуть 1+2 шаги нажатия на кнопку, согласен.
А что делать, если затрекать события не получается ни в какую?
#10 Prettser
Перед кликом на кнопку временно сделал вытаскивание в строку driver .getPageSource(); И там вся страница целиком (вместе со скриптом).
И, наверное, это логично. Ведь если элемент отрисован и кликабелен (что проверяется перед кликом), значит это уже идет этап отрисовки и код страницы загружен вместе с нужной функцией.
Простой слип в 1000мс перед кликом избавляет от проблемы. Значит чего-то не хватает секундой раньше, но так и не пойму чего. 🙂
Секунда ничего не решает и можно так и оставить. По отношению к пользователю и функциональному тестированию все честно, ведь никто в реальности так быстро жать кнопку не сможет.
Но я же теперь спать нормально не смогу, буду думать о вопросе «Почему? И как можно сделать красиво?»
#11 elvis
- Город: Tallinn
Перед кликом на кнопку временно сделал вытаскивание в строку driver .getPageSource(); И там вся страница целиком (вместе со скриптом).
И, наверное, это логично. Ведь если элемент отрисован и кликабелен (что проверяется перед кликом), значит это уже идет этап отрисовки и код страницы загружен вместе с нужной функцией.
Простой слип в 1000мс перед кликом избавляет от проблемы. Значит чего-то не хватает секундой раньше, но так и не пойму чего. 🙂
Секунда ничего не решает и можно так и оставить. По отношению к пользователю и функциональному тестированию все честно, ведь никто в реальности так быстро жать кнопку не сможет.
Но я же теперь спать нормально не смогу, буду думать о вопросе «Почему? И как можно сделать красиво?»
Если это один тест, то можно сформулировать требование так — кнопка logout активна через N ms после того, как стала видимой. И требования к задержке согласовать с продакт оунером. Далее дрючить девов 😀
Источник