Содержание
Краткая памятка по нажатию кнопок в Selenium
- Убедитесь, что WebDriver установлен и настроен для вашего браузера.
- Импортируйте необходимые модули: from selenium.webdriver.common.by import By.
- Найдите элемент кнопки, используя один из методов поиска (ID, Class, CSS, XPath).
- Для динамических элементов используйте WebDriverWait с условием element_to_be_clickable.
- Вызовите метод.click() на найденном элементе.
- Если кнопка находится в iframe, переключитесь на него перед поиском.
- Обрабатывайте возможные исключения (NoSuchElementException, TimeoutException).
- Для сложных сценариев используйте ActionChains (двойной клик, контекстное меню).
- В крайнем случае применяйте JavaScript Executor для принудительного клика.
- Всегда проверяйте, что кнопка видима и активна перед нажатием.
- Используйте уникальные и стабильные локаторы для надежности тестов.
- Не забывайте закрывать браузер после выполнения тестов (driver.quit()).
Что такое Selenium?
Selenium — это популярный инструмент с открытым исходным кодом для автоматизации работы браузеров. Разработчики чаще всего используют его для автоматизации тестирования веб-приложений. Они пишут сценарии Selenium для автоматического перехода по URL-адресу, заполнения форм, нажатия на кнопки, чтобы убедиться, что веб-приложение ведет себя в соответствии с их ожиданиями.
Нажатие кнопки при помощи Selenium
Чтобы нажать на кнопку с помощью Selenium, сначала найдите элемент, на котором нужно щелкнуть, а затем используйте метод click() для выполнения одиночного щелчка левой кнопкой мыши.
# click on button with the id «login-btn» button = driver.find_element(, «login-btn») ()
Стратегии поиска кнопки
Но чтобы нажать на кнопку с помощью Selenium, ее еще нужно найти. Для поиска кнопок применяются различные стратегии, предполагающие использование локаторов. Локатор — это способ идентификации элемента на веб-странице. Также это аргумент, который передается в метод findElement.
Поиск кнопки по идентификатору
Если для кнопки задан ID, то для поиска элемента можно использовать стратегию локатора ID. Ниже приведен пример использования:
// click on button with the id «login-btn» button = driver.find_element(, «login-btn») ()
Поиск кнопки с использованием имени класса
Если для кнопки задан класс, то для ее поиска можно использовать локатор по имени класса. Ниже приведен пример использования By.CLASS_NAME:
Поиск кнопки по тексту ссылки
Если кнопка, которую мы хотим нажать, является ссылкой, стилизованной под кнопку, то для ее поиска можно использовать поиск по тексту ссылки. Приведем пример использования By.LINK_TEXT:
// click on link with the text «Login» button = driver.find_element(By.LINK_TEXT, «Login») ()
Поиск кнопки с помощью CSS-селектора
CSS-селекторы — это выражения, которые обычно используются для определения элементов для стилизации.
Если вы знакомы с использованием CSS-селекторов, то для поиска кнопки в Selenium можете применить стратегию локатора CSS-селекторов. Вот пример использования By.CSS_SELECTOR:
// click on button that has the «data-test-id» attribute set to «login-btn»
Поиск кнопки для нажатия с помощью XPATH
XPATH — это мощный язык запросов для навигации по XML-документам, включая веб-страницы HTML.
Если вы знакомы с использованием XPATH, то для поиска кнопки в Selenium вы можете применить локатор XPATH. Вот пример использования:
Лучшие практики использования локаторов
Многие жалобы на часто ломающиеся 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.
UIlicious Snippets — это бесплатная версия сообщества UIlicious Studio — облачной среды разработки для написания, выполнения и постоянного мониторинга кроссбраузерных тестов для веб-приложений.
Структура страницы
Возьмём случайную пивоварню — у неё 105 чекинов, то есть, отзывов. Страница с чекинами пивоварни показывает не более 25 чекинов и выглядит так:
Если попробуем промотать в самый низ, столкнёмся с той самой кнопкой, мешающей нам взять все 105 за раз:
display display block display none display none
У кнопки есть свойства стиля, а именно —. В случае, если кнопка должна отображаться, принимает значение. Но когда промотаем страницу до самого конца, кнопку не нужно будет показывать, ведь открывать больше нечего — поэтому кнопки примет значение. В случае, если мы запросим у кнопки и вернётся будем знать, что открывать больше нечего и можно перестать жать на кнопку.
Пишем код
display more_checkins none display soup bs4
Напишем функцию, которая принимает ссылку, переходит по ней, полностью раскрывает страницу и возвращает нам soup, который можно будет распарсить. Получим кнопки и запишем в переменную: пока он не равен будем нажимать на кнопку и снова получать её. Сделаем интервал в две секунды между нажатиями, чтобы подождать прогрузку страницы. Как только будет получена вся страница, переведём её в библиотекой.
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().























