Нажатие на кнопку в Selenium Python: как это сделать

0
48

Краткая памятка по нажатию кнопок в Selenium

  1. Убедитесь, что WebDriver установлен и настроен для вашего браузера.
  2. Импортируйте необходимые модули: from selenium.webdriver.common.by import By.
  3. Найдите элемент кнопки, используя один из методов поиска (ID, Class, CSS, XPath).
  4. Для динамических элементов используйте WebDriverWait с условием element_to_be_clickable.
  5. Вызовите метод.click() на найденном элементе.
  6. Если кнопка находится в iframe, переключитесь на него перед поиском.
  7. Обрабатывайте возможные исключения (NoSuchElementException, TimeoutException).
  8. Для сложных сценариев используйте ActionChains (двойной клик, контекстное меню).
  9. В крайнем случае применяйте JavaScript Executor для принудительного клика.
  10. Всегда проверяйте, что кнопка видима и активна перед нажатием.
  11. Используйте уникальные и стабильные локаторы для надежности тестов.
  12. Не забывайте закрывать браузер после выполнения тестов (driver.quit()).

Что такое Selenium?

Selenium - изображение номер один
Selenium — изображение номер один

Selenium — это популярный инструмент с открытым исходным кодом для автоматизации работы браузеров. Разработчики чаще всего используют его для автоматизации тестирования веб-приложений. Они пишут сценарии Selenium для автоматического перехода по URL-адресу, заполнения форм, нажатия на кнопки, чтобы убедиться, что веб-приложение ведет себя в соответствии с их ожиданиями.

Нажатие кнопки при помощи Selenium

Click a button using - изображение номер два
Click a button using — изображение номер два

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

# click on button with the id «login-btn» button = driver.find_element(, «login-btn») ()

Стратегии поиска кнопки

How to - изображение номер три
How to — изображение номер три

Но чтобы нажать на кнопку с помощью Selenium, ее еще нужно найти. Для поиска кнопок применяются различные стратегии, предполагающие использование локаторов. Локатор — это способ идентификации элемента на веб-странице. Также это аргумент, который передается в метод findElement.

Поиск кнопки по идентификатору

How to click a button in selenium python - изображение номер четыре
How to click a button in selenium python — изображение номер четыре

Если для кнопки задан ID, то для поиска элемента можно использовать стратегию локатора ID. Ниже приведен пример использования:

// click on button with the id «login-btn» button = driver.find_element(, «login-btn») ()

Поиск кнопки с использованием имени класса

Python - изображение номер пять
Python — изображение номер пять

Если для кнопки задан класс, то для ее поиска можно использовать локатор по имени класса. Ниже приведен пример использования By.CLASS_NAME:

Поиск кнопки по тексту ссылки

Selenium with - изображение номер шесть
Selenium with — изображение номер шесть

Если кнопка, которую мы хотим нажать, является ссылкой, стилизованной под кнопку, то для ее поиска можно использовать поиск по тексту ссылки. Приведем пример использования By.LINK_TEXT:

// click on link with the text «Login» button = driver.find_element(By.LINK_TEXT, «Login») ()

Поиск кнопки с помощью CSS-селектора

How to click a button using using - изображение номер семь
How to click a button using using — изображение номер семь

CSS-селекторы — это выражения, которые обычно используются для определения элементов для стилизации.

Если вы знакомы с использованием CSS-селекторов, то для поиска кнопки в Selenium можете применить стратегию локатора CSS-селекторов. Вот пример использования By.CSS_SELECTOR:

// click on button that has the «data-test-id» attribute set to «login-btn»

Поиск кнопки для нажатия с помощью XPATH

How to click the - изображение номер восемь
How to click the — изображение номер восемь

XPATH — это мощный язык запросов для навигации по XML-документам, включая веб-страницы HTML.

ЧИТАТЬ ТАКЖЕ:  Что такое int в Python: целые числа, их создание и операции

Если вы знакомы с использованием XPATH, то для поиска кнопки в Selenium вы можете применить локатор XPATH. Вот пример использования:

Лучшие практики использования локаторов

#Tutorials 24 - изображение номер девять
#Tutorials 24 — изображение номер девять

Многие жалобы на часто ломающиеся Selenium-тесты связаны с использованием нестабильных стратегий поиска элементов при помощи локаторов.

Настоятельно рекомендуется совместными усилиями тестировщиков и фронтенд-разработчиков определить соглашение по настройке локаторов элементов для автоматизированного тестирования.

Общепринятым является задание уникальных атрибутов data-test-id для элементов. Эти атрибуты используются вместо ID элемента или имен классов. Последние часто изменяются разработчиками фронтенда для привязки JavaScript-событий и стилизации. Благодаря уникальности атрибутов фронтендеры не забудут, что их нельзя удалять или переименовать, потому что на них ссылаются тестовые скрипты Selenium. Таким образом снизится вероятность случайного нарушения работы тестов.

Таргетирование кнопок с помощью пользовательских меток

🔥 - изображение номер десять
🔥 — изображение номер десять

Если в вашей команде невозможно определить соглашение по настройке локаторов для повышения их стабильности, вы можете рассмотреть альтернативные инструменты тестирования, такие как UIlicious. Эти инструменты позволяют писать тесты, управляемые ключевыми словами, и используют интеллектуальный алгоритм поиска целевого элемента.

UIlicious позволяет находить целевые элементы на основе их пользовательских меток, которые обычно более стабильны, чем идентификаторы, имена классов, селекторов css и xpaths. При выполнении теста алгоритм UIlicious анализирует структуру HTML-страницы и находит целевой элемент, используя оценку, рассчитанную на основе его семантики, меток, соответствующих атрибутов, окружающего текста, доступности и близости к элементам, идентифицированным для предыдущих команд.

Приведем пример нажатия на кнопку с использованием пользовательских меток с помощью команды в UIlicious:

// Navigate to login page («») // Fill in login email and password («Email», «john@») («Password», «supersecretpassword») // Click the «Sign in» button («Sign in») // Validate that error message is shown to user («Incorrect username or password.»)

Основная философия UIlicious — «Тестируйте путь пользователей, а не HTML». Вы можете попробовать UIlicious и бесплатно протестировать свой сайт с помощью UIlicious Snippets.

How to click a button using - изображение номер одиннадцать
How to click a button using — изображение номер одиннадцать

UIlicious Snippets — это бесплатная версия сообщества UIlicious Studio — облачной среды разработки для написания, выполнения и постоянного мониторинга кроссбраузерных тестов для веб-приложений.

Структура страницы

✔ - изображение номер двенадцать
✔ — изображение номер двенадцать

Возьмём случайную пивоварню — у неё 105 чекинов, то есть, отзывов. Страница с чекинами пивоварни показывает не более 25 чекинов и выглядит так:

Mastering - изображение номер тринадцать
Mastering — изображение номер тринадцать

Если попробуем промотать в самый низ, столкнёмся с той самой кнопкой, мешающей нам взять все 105 за раз:

display display block display none display none
У кнопки есть свойства стиля, а именно —. В случае, если кнопка должна отображаться, принимает значение. Но когда промотаем страницу до самого конца, кнопку не нужно будет показывать, ведь открывать больше нечего — поэтому кнопки примет значение. В случае, если мы запросим у кнопки и вернётся будем знать, что открывать больше нечего и можно перестать жать на кнопку.

Пишем код

display more_checkins none display soup bs4
Напишем функцию, которая принимает ссылку, переходит по ней, полностью раскрывает страницу и возвращает нам soup, который можно будет распарсить. Получим кнопки и запишем в переменную: пока он не равен будем нажимать на кнопку и снова получать её. Сделаем интервал в две секунды между нажатиями, чтобы подождать прогрузку страницы. Как только будет получена вся страница, переведём её в библиотекой.

ЧИТАТЬ ТАКЖЕ:  Бесконечный цикл for в Python: как сделать с помощью while True и итератора

def get_html_page(url): (url) driver.maximize_window() more_checkins = driver.execute_script(«var more_checkins=(‘more_checkins_logged’).;return more_checkins;») print(more_checkins) while more_checkins!= «none»: driver.execute_script(«(‘more_checkins_logged’).click()») (2) more_checkins = driver.execute_script(«var more_checkins=(‘more_checkins_logged’).;return more_checkins;») print(more_checkins) source_data = driver.page_source soup = bs(source_data, ‘lxml’) return soup

url get_html_page soup
Напишем следующую функцию: она тоже будет принимать страницы, передавать его в, получать и парсить его. Функция вернёт запакованные списки с идентификатором пива и оценкой к нему.

def parse_html_page(url): soup = get_html_page(url) brewery_id = soup.find_all(‘a’, {‘class’:’label’, ‘href’:(‘][‘href’][28:] items = soup.find_all(‘div’, {‘class’:’item’, ‘id’:(‘checkin_*’)}) checkin_rating_list = [] beer_id_list = [] count = 0 print(‘Заполняю списки’) for checkin in items: print(count, ‘/’, len(items)) try: checkin_rating_list.append(float((‘div’, {‘class’:’caps’})[‘data-rating’])) except Exception: checkin_rating_list.append(‘cast(Null as Nullable(Float32))’) try: beer_id_list.append(int((‘a’, {‘class’:’label’})[‘href’][-7:])) except Exception: beer_id_list.append(‘cast(Null as Nullable(UInt64))’) count += 1 return zip(checkin_rating_list, beer_id_list)

Наконец, напишем вызов функций по пивоварням. В материале «Использование словарей в Clickhouse на примере данных Untappd» мы уже рассмотрели, как получить список идентификаторов российских пивоварен — обратимся к нему через таблицу в Clickhouse

brewery_list
Если посмотрим на, то узнаем, что данные вернулись в неудобном формате: это список кортежей.

Как кликать на кнопки с разными классами на - изображение номер четырнадцать
Как кликать на кнопки с разными классами на — изображение номер четырнадцать

flatten = lambda lst: [item for sublist in lst for item in sublist] brewery_list = flatten(brewery_list)

url url parse_html_page get_html_page beer_id rating_score
Для каждой пивоварни в списке сформируем — он состоит из стандартной ссылки и идентификатора пивоварни в конце. Отправим в функцию, которая сама вызовет и вернёт списки с и. Так как два списка вернутся упакованными можем пройти по ним итератором, сформировав кортеж и отправив его в Clickhouse.

for brewery_id in brewery_list: print(‘Беру пивоварню с id’, brewery_id, count, ‘/’, len(brewery_list)) url = ‘/’ + str(brewery_id) returned_checkins = parse_html_page(url) for rating, beer_id in returned_checkins: tuple_to_insert = (rating, beer_id) try: (f’INSERT INTO beer_reviews VALUES {tuple_to_insert}’) except as E: print(E) count += 1

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

Часто задаваемые вопросы о нажатии кнопок в Selenium Python

Вопрос: Какой самый надежный способ найти кнопку в Selenium?
Ответ: Самый надежный способ — использовать уникальный идентификатор (ID) кнопки, если он есть, или уникальный CSS-селектор/XPath.

Вопрос: Что делать, если Selenium не может найти кнопку?
Ответ: Проверьте, загрузилась ли страница полностью (используйте WebDriverWait), и убедитесь, что кнопка не находится внутри фрейма (iframe).

Вопрос: Как нажать на кнопку, которая появляется после выполнения JavaScript?
Ответ: Используйте явные ожидания (WebDriverWait) с условием element_to_be_clickable, чтобы дождаться появления и активации кнопки.

Вопрос: В чем разница между find_element и find_elements?
Ответ: find_element возвращает первый найденный элемент или вызывает исключение, если элемент не найден. find_elements возвращает список всех найденных элементов (пустой список, если ничего не найдено).

Вопрос: Можно ли нажать на кнопку, используя ее текст?
Ответ: Да, для этого можно использовать поиск по тексту ссылки (By.LINK_TEXT) или частичному тексту ссылки (By.PARTIAL_LINK_TEXT), но это подходит только для элементов .

Вопрос: Как нажать на кнопку внутри iframe?
Ответ: Сначала нужно переключиться на iframe с помощью driver.switch_to.frame(), выполнить нажатие, а затем вернуться обратно с помощью driver.switch_to.default_content().

Вопрос: Что такое WebDriverWait и как его использовать для кнопок?
Ответ: WebDriverWait — это механизм явного ожидания. Он позволяет ждать определенного условия, например, пока кнопка не станет кликабельной: WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, «myButton»))).

Вопрос: Как обработать исключение NoSuchElementException?
Ответ: Используйте конструкцию try-except, чтобы перехватить исключение и выполнить альтернативные действия, например, поиск другим локатором или логирование ошибки.

Вопрос: Как нажать на кнопку с помощью JavaScript Executor?
Ответ: Используйте driver.execute_script(«arguments[0].click();», button_element). Это может помочь, если обычный.click() не срабатывает из-за перекрытия элемента.

Вопрос: Как симулировать двойной клик по кнопке?
Ответ: Используйте класс ActionChains: ActionChains(driver).double_click(button_element).perform().