Selenium для Python. Глава 2. Первые Шаги
Продолжение перевода неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.
Содержание:
2. Первые шаги
2.1. Простое использование
Если вы установили привязку Selenium к Python, вы можете начать использовать ее с помощью интерпретатора Python.
Код выше может быть сохранен в файл (к примеру, python_org_search.py), и запущен:
Запускаемый вами Python должен содержать установленный модуль selenium.
2.2. Пошаговый разбор примера
Модуль selenium.webdriver предоставляет весь функционал WebDriver’а. На данный момент WebDriver поддерживает реализации Firefox, Chrome, Ie и Remote. Класс Keys обеспечивает взаимодействие с командами клавиатуры, такими как RETURN, F1, ALT и т.д…
Далее создается элемент класса Firefox WebDriver.
Метод driver.get перенаправляет к странице URL в параметре. WebDriver будет ждать пока страница не загрузится полностью (то есть, событие “onload” игнорируется), прежде чем передать контроль вашему тесту или скрипту. Стоит отметить, что если страница использует много AJAX-кода при загрузке, то WebDriver может не распознать, загрузилась ли она полностью:
Следующая строка — это утверждение (англ. assertion), что заголовок содержит слово “Python” [assert позволяет проверять предположения о значениях произвольных данных в произвольном месте программы. По своей сути assert напоминает констатацию факта, расположенную посреди кода программы. В случаях, когда произнесенное утверждение не верно, assert возбуждает исключение. Такое поведение позволяет контролировать выполнение программы в строго определенном русле. Отличие assert от условий заключается в том, что программа с assert не приемлет иного хода событий, считая дальнейшее выполнение программы или функции бессмысленным — Прим. пер.]:
WebDriver предоставляет ряд способов получения элементов с помощью методов find_element_by_*. Для примера, элемент ввода текста input может быть найден по его атрибуту name методом find_element_by_name. Подробное описание методов поиска элементов можно найти в главе Поиск Элементов:
После этого мы посылаем нажатия клавиш (аналогично введению клавиш с клавиатуры). Специальные команды могут быть переданы с помощью класса Keys импортированного из selenium.webdriver.common.keys:
После ответа страницы, вы получите результат, если таковой ожидается. Чтобы удостовериться, что мы получили какой-либо результат, добавим утверждение:
В завершение, окно браузера закрывается. Вы можете также вызывать метод quit вместо close. Метод quit закроет браузер полностью, в то время как close закроет одну вкладку. Однако, в случае, когда открыта только одна вкладка, по умолчанию большинство браузеров закрывается полностью:
2.3. Использование Selenium для написания тестов
Selenium чаще всего используется для написания тестовых ситуаций. Сам пакет selenium не предоставляет никаких тестовых утилит или инструментов разработки. Вы можете писать тесты с помощью модуля Python unittest. Другим вашим выбором в качестве тестовых утилит/инструментов разработки могут стать py.test и nose.
В этой главе, в качестве выбранной утилиты будет использоваться unittest. Ниже приводится видоизмененный пример с использованием этого модуля. Данный скрипт тестирует функциональность поиска на сайте python.org:
Вы можете запустить тест выше из командной строки следующей командой:
Результат сверху показывает, что тест завершился успешно.
2.4. Пошаговый разбор примера
Сначала были импортированы все основные необходимые модули. Модуль unittest встроен в Python и реализован на Java’s JUnit. Этот модуль предоставляет собой утилиту для организации тестов.
Модуль selenium.webdriver предоставляет весь функционал WebDriver’а. На данный момент WebDriver поддерживает реализации Firefox, Chrome, Ie и Remote. Класс Keys обеспечивает взаимодействие с командами клавиатуры, такими как RETURN, F1, ALT и т.д…
Класс теста унаследован от unittest.TestCase. Наследование класса TestCase является способом сообщения модулю unittest, что это тест:
setUp — это часть инициализации, этот метод будет вызываться перед каждым методом теста, который вы собираетесь написать внутри класса теста. Здесь мы создаем элемент класса Firefox WebDriver.
Далее описан метод нашего теста. Метод теста всегда должен начинаться с фразы test. Первая строка метода создает локальную ссылку на объект драйвера, созданный методом setUp.
Метод driver.get перенаправляет к странице URL в параметре. WebDriver будет ждать пока страница не загрузится полностью (то есть, событие “onload” игнорируется), прежде чем передать контроль вашему тесту или скрипту. Стоит отметить, что если страница использует много AJAX-кода при загрузке, то WebDriver может не распознать, загрузилась ли она полностью:
Следующая строка — это утверждение, что заголовок содержит слово “Python”:
WebDriver предоставляет ряд способов получения элементов с помощью методов find_element_by_*. Для примера, элемент ввода текста input может быть найден по его атрибуту name методом find_element_by_name. Подробное описание методов поиска элементов можно найти в главе Поиск Элементов:
После этого мы посылаем нажатия клавиш (аналогично введению клавиш с клавиатуры). Специальные команды могут быть переданы с помощью класса Keys импортированного из selenium.webdriver.common.keys:
После ответа страницы, вы получите результат, если таковой ожидается. Чтобы удостовериться, что мы получили какой-либо результат, добавим утверждение:
Метод tearDown будет вызван после каждого метода теста. Это метод для действий чистки. В текущем методе реализовано закрытие окна браузера. Вы можете также вызывать метод quit вместо close. Метод quit закроет браузер полностью, в то время как close закроет одну вкладку. Однако, в случае, когда открыта только одна вкладка, по умолчанию большинство браузеров закрывается полностью.:
Завершающий код — это стандартная вставка кода для запуска набора тестов [Сравнение __name__ с «__main__» означает, что модуль (файл программы) запущен как отдельная программа («main» (англ.) — «основная», «главная») (а не импортирован из другого модуля). Если вы импортируете модуль, атрибут модуля __name__ будет равен имени файла без каталога и расширения — Прим. пер.]:
2.5. Использование Selenium с remote WebDriver
Строка выше сообщает о том, что вы можете использовать указанный URL для подключения remote WebDriver. Ниже приводится несколько примеров:
Переменная desired_capabilities — это словарь. Вместо того, чтобы использовать словари по умолчанию, вы можете явно прописать значения:
Ультимативная шпаргалка по Selenium с Python для автоматизации тестирования
Python – один из самых популярных языков для веб-автоматизации с Selenium, поскольку в нем есть упрощенный синтаксис, который позволяет выполнять больше задач за меньшее количество строк кода! Таким образом, Python и Selenium создают идеальную комбинацию для автоматизированного тестирования в вебе.
Начнем с того, что Selenium – это открытый фреймворк, который в основном используется для автоматизации взаимодействия с веб-элементами в AUT (Application Under Test). Наряду с Python, Selenium также поддерживает Java, C#, JavaScript, Ruby и PHP. Однако, по своему опыту скажу, что Python – лучший вариант для веб-автоматизации в комбинации с Selenium.
Все больше разработчиков, как и я в свое время, осваивают Python, который считается третьим по популярности языком, если верить опросу Stack Overflow Developer Survey 2021. Поэтому шпаргалка по Selenium с Python может служить для ознакомления с полезным API для автоматизации веб-сайтов (или веб-приложений).
Если в Selenium вы новичок и вам интересно, что же это такое, мы рекомендуем ознакомиться с нашим руководством What is Selenium?.
В этой статье мы разберемся с модулем в Python, который предоставляет нам функционал Selenium WebDriver. Для установки пакета Selenium WebDriver мы воспользуемся Python Package Index (PyPI). Выполните в терминале следующую команду, чтобы установить Selenium для Python:
Если вы хотите запускать свои сценарии тестирования онлайн с Selenium Grid, воспользуйтесь LambdaTest для автоматизации тестирования.
Эта библиотека Python оборачивает Selenium WebDriver и предоставляет методы для автоматизации целого ряда задач, таких как заполнение форм, вход на сайт, нажатие на кнопки и многое другое. Кроме того, вы можете ознакомиться с руководством по Selenium с Python, в котором подробно рассматриваются неотъемлемые аспекты Selenium Python с точки зрения автоматизации веб-тестирования.
Команды, которые вы увидите в шпаргалке, можно использовать в качестве удобного ресурса для всех, кто играется с Selenium на Python для автоматизации веб-приложений. Если вам нужно краткое описание работы Selenium в Python, ознакомьтесь с руководством, в котором подробно рассматривается архитектура Selenium WebDriver и освещаются неотъемлемые аспекты, связанные с Selenium WebDriver в Python. Итак, давайте начнем нашу шпаргалку!
Импортируем библиотеку Selenium
Перед тем, как начать пользоваться командами Selenium, вам нужно импортировать пакет Selenium WebDriver.
Инициализация дайвера в Python
После загрузки соответствующего драйвера браузера вам необходимо запустить Selenium WebDriver и драйвер браузера (например, ChromeDriver для Chrome, GeckoDriver для Firefox и т.д.).
Для Internet Explorer
Если местоположения драйвера браузера нет в переменной PATH (или если его нет в System Path), нужно добавить следующие аргументы:
executable_path : Путь к вашему веб-драйверу Selenium (бинарный файл)
options : Параметры, касающиеся выполнения веб-браузеров
Настройка параметров Selenium WebDriver
Класс Options в Selenium обычно используется в сочетании с желаемыми возможностями кастомизации Selenium WebDriver.
Так вы можете выполнять различные операции, такие как открытие браузера (Chrome, Firefox, Safari, IE, Edge и т.д.) в режиме увеличения, включение и отключение расширений браузера, отключение режима GPU, отключение всплывающих окон и многое другое. Поэтому важно хорошо разобраться в этом разделе шпаргалки по Selenium в Python, поскольку так вы сможете решить проблемы автоматизации, связанные с изменением свойств браузера, о которых мы говорили ранее.
Для Chrome
Импорт опций Chrome
2. Инициализация опций Chrome
3. Добавление желаемых возможностей
4.Добавление желаемых возможностей сессии
Для Firefox
Импорт опций Firefox
2. Инициализация опций Firefox
3. Добавление желаемых возможностей
4. Добавление желаемых возможностей сессии
Поиск элемента
Поиск элемента по атрибуту ID
В этом методе поиск элемента в DOM производится по ID. ID уникален для каждого элемента на странице. Таким образом, с помощью ID можно однозначно идентифицировать элемент. Например, ниже показано использование атрибута ID для поиска веб-элементов на странице входа в систему LambdaTest:
Так вы можете воспользоваться атрибутом ID в Selenium:
Поиск элемента по классу CSS
Элементы в HTML DOM еще можно найти по имени класса, который хранится в атрибуте класса HTML-тега. У класса может быть несколько экземпляров, но метод вернет первый элемент с соответствующим классом.
Так можно использовать имя класса для определения местоположения элемента Email Address на странице LambdaTest:
Поиск элемента по имени
Веб-элементы, такие как открывающий тег, имеют связанный с ними атрибут Name. В Selenium есть метод поиска веб-элементов с помощью атрибута NAME. Если у нескольких элементов одинаковое имя, он вернет первое совпадение.
Вот HTML-код, в котором есть элемент ввода имени Name.
Ниже показано использование метода Selenium Python для определения местоположения веб-элемента с помощью атрибута NAME:
Поиск элемента по XPath
XPath использует путь для выбора узлов и определения местоположения необходимого веб-элемента. Метод find_element_by_xpath() используется для поиска соответствующего элемента в документе с помощью XPath. Вы можете почитать руководство по XPath в Selenium, чтобы получить более глубокое представление об использовании XPath для поиска веб-элементов при автоматизации с Selenium.
Ниже показан поиск элемента email с помощью атрибута XPath:
Поиск элемента по тегу
Этот метод используется для поиска и выбора веб-элементов по HTML-тегу. Метод find_element_by_tag_name() используется для поиска таких тегов, как H1, DIV, INPUT и т.д. Если тег встречается несколько раз, он возвращает первый совпадающий.
Ниже показан поиск элемента с email-адресом по тегу:
Поиск элемента по тексту ссылки и частичному тексту ссылки
Этот метод ищет элемент по тексту ссылки (целому или части). При поиске частичного текста ссылки не ищется точное совпадение со строковым значением, поскольку ищется подмножество строк (в тексте ссылки).
Локатор текста ссылок в Selenium и частичного текста ссылок работает только со ссылками текущего веб-приложения.
Ниже показан поиск элемента на странице входа LambdaTest с помощью локатора текста ссылок:
Ниже показан поиск элемента на странице входа LambdaTest с помощью локатора частичного текста ссылок:
Различные методы поиска элементов
Есть два метода, которые могут быть полезны для поиска элементов страницы в сочетании с классом «By» для выбора атрибутов.
find_elements возвращает список всех экземпляров веб-элементов, соответствующих определенному атрибуту. Список будет пустым, если в DOM нет нужных элементов.
Ниже вы увидите список атрибутов, доступных для класса By :
TAG_NAME = “tag name”
CLASS_NAME = “class name”
LINK_TEXT = “link text”
PARTIAL_LINK_TEXT = “partial link text”
Открытие ссылки или документа
Перед выполнением любых операций с веб-элементами, присутствующими на странице, важно открыть целевой URL-адрес (или тестовый URL-адрес). Далее вы увидите несколько способов открыть URL-адрес в Selenium с Python:
driver.get(URL)
Метод driver.get() переходит на страницу, которая передается методу в параметре. Selenium WebDriver будет ждать, пока страница не загрузится полностью, после чего он запустит событие «onload» и вернет управление сценарию тестирования. В статье Selenium Waits in Python вы можете найти дополнительную информацию про обработку ожиданий в Selenium.
Обновление страницы
Бывают сценарии, в которых нужно обновлять содержимое страницы. Метод обновления страниц в Selenium WebDriver используется для обновления веб-страниц.
Метод driver.refresh() обновляет текущую веб-страницу. Он не принимает никаких аргументов и не возвращает никаких значений.
Ввод текста в веб-элемент
Метод send_keys() в Python используется для ввода текста в текстовый элемент. Такой текст передается методу в качестве аргумента. Тот же метод можно использовать для имитации нажатия клавиш в любом поле (например, в полях ввода формы).
Удаление текста в веб-элементе
Метод element.clear() в Selenium используется для удаления текста из полей, таких как поля ввода формы и т.д.
Пример использования метода очистки содержимого поля ввода электронной почты на домашней странице LambdaTest:
Нажатие на веб-элемент
Метод element.click() в Selenium используется для нажатия на элемент, такой как ссылка-якорь, кнопка и т.д.
Вот так с помощью метода click() можно нажать на кнопку на домашней странице LambdaTest:
Перетаскивание веб-элемента
Перетаскивание объектов является одним из широко используемых сценариев в популярных приложениях (или программах), таких как Canvas, Google Drive, Trello, Asana и т.д. Метод drag_and_drop (элемент, цель) в Selenium помогает автоматизировать функционал перетаскивания веб-элементов из источника и переноса их в целевую область (или элемент).
У класса Actions в Selenium есть два метода, с помощью которых вы можете выполнять операции перетаскивания при тестировании кроссбраузерной совместимости. Обязательно ознакомьтесь с нашим подробным руководством, в котором есть информация о том, как выполнять перетаскивание в Selenium.
Вот простой пример использования метода drag_and_drop() :
Выбор опции
Select (элемент) предоставляет полезные методы для взаимодействия с раскрывающимися списками, выбора элементов и многого другого.
Так можно выбрать элемент по индексу:
Вот некоторые вариации выбора нужного элемента с помощью метода select_by_*() :
Метод
Описание
Метод принимает строковое значение и выбирает опцию, в которой есть нужный текст.
Метод принимает строковое значение и выбирает параметр с тем же значением атрибута.
Метод позволяет отменить выбор всех выбранных опций.
Навигация между окнами
Если у вас несколько окон, может потребоваться переключаться между ними перед выполнением действий с веб-элементами из DOM.
driver.switch_to_window(“имя_окна”)
Все последующие вызовы WebDriver теперь применяются к окну в фокусе (или к новому окну после переключения).
driver.window_handles
driver.current_window_handle
Метод current_window_handle() возвращает дескриптор текущего окна (или окна в фокусе).
Переключение на iFrame
Selenium WebDriver не умеет получать доступ или находить веб-элементы внутри iFrame в контексте главной страницы. Следовательно, вам необходимо переключиться на iFrame, прежде чем обращаться к элементам внутри него.
driver.switch_to_frame(“имя_iframe”)
Метод switch_to_frame() в Selenium Python позволяет менять контекст WebDriver из контекста главной страницы. Также мы можем получить доступ к сабфреймам, добавив между путем и индексом точку.
driver.switch_to_default_content()
Метод позволяет возвращаться обратно к контексту главной страницы.
Обработка всплывающих окон и оповещений
Существует всего три основных типа всплывающих окон и предупреждений, которые обычно используются в веб-приложениях:
Вы можете переключиться на оповещение, отклонить его или принять. Ознакомьтесь нашим подробным руководством по обработке оповещений и всплывающих окон в Selenium. Несмотря на то, что там используется язык C#, основы остаются неизменными!
driver.switch_to.alert
alert_obj.accept()
Как только у вас есть дескриптор окна alert (например, alert_obj ), метод accept() поможет вам принять всплывающее окно предупреждения.
alert_obj.dismiss()
alert_obj.text()
Этот метод используется для извлечения сообщения из всплывающего окна предупреждения.
Получение кода страницы
Метод page_source() в Selenium WebDriver используется для получения кода страницы.
Навигация по истории браузера
Selenium WebDriver на Python предоставляет несколько функций для перемещения вперед-назад по истории браузера.
driver.forward()
Этот метод позволяет сценариям перемещаться на один шаг вперед по истории браузера.
driver.back()
Этот метод позволяет сценариям перемещаться на один шаг назад по истории браузера.
Обработка Cookie в Selenium
Обработка файлов cookie в Selenium WebDriver является одним из распространенных сценариев, с которым вам, возможно, придется иметь дело при автоматизации. Можно выполнять различные операции, такие как добавление, удаление, получение имени файла cookie и многое другое.
driver.add_cookie()
Этот метод помогает настроить файл cookie для сессии Selenium. Он принимает значения в виде пары ключ-значение.
driver.get_cookies()
Этот метод выводит все доступные файлы cookie для текущей сессии Selenium.
driver.delete_cookie()
Есть возможность удалить определенный файл cookie или все файлы cookie, связанные с текущей сессией Selenium.
Установка размера окна
Настройка тайм-аутов в Selenium WebDriver
Когда браузер загружает страницу, веб-элементы внутри нее могут загружаться через различные промежутки времени. Это может создать сложности при взаимодействии с динамическими элементами, присутствующими на странице.
Если элемент отсутствует в DOM веб-страницы, метод locate вызовет исключение. Ожидания в Selenium позволяют добавлять задержки (в миллисекундах или секундах) между действиями, выполняемыми между загрузкой страницы и поиском требуемого веб-элемента.
Неявное ожидание в Selenium Python
Неявное ожидание информирует Selenium WebDriver о необходимости проверять DOM в течение определенного периода времени при попытке найти веб-элемент, который не доступен сразу после загрузки страницы.
По умолчанию неявное ожидание равно нулю. Однако, как только мы определяем его, оно устанавливается на время жизни объекта WebDriver. Ознакомьтесь с подробным руководством, в котором более детально демонстрируется использование неявного ожидания в Selenium Python.
Явное ожидание в Selenium Python
Явное ожидание в Selenium с Python используется, когда мы хотим дождаться выполнения определенного условия, прежде чем продолжить работу.
В Selenium WebDriver есть несколько удобных методов, которые позволяют подождать, пока не будет выполнено определенное условие. Например, явное ожидание можно получить с помощью класса webdriverWait в сочетании с ожидаемыми условиями в Selenium.
Вот некоторые из ожидаемых условий, которые можно использовать в сочетании с явным ожиданием в Selenium Python:
Не могу нажать на кнопку с помощью selenium: Other element would receive the click
Имеется сайт такого вида
Вверху видно кнопки, на которые у меня не получается нажать
Вот сам код этой кнопки взятый из сайта
Пытался еще подставить другой класс
В итоге получаю вот такие ошибки
и еще одну на другую попытку
Требуется нажать на эту кнопку
2 ответа 2
Вторая ошибка Element is not clickable at point (153, 64). Other element would receive the click говорит о том, что эелемент перекрыт другим. По перекрытым эелементам хромдрайвер не разрешает кликать.
Во-первых, я бы предложил сделать assert на то, что кнопка есть и находится в кликабельном состоянии, а во-вторых, никогда не стоит искать по классу, если только этот класс не один-разъединственный вот специально для этого элемента. Нужно искать по наиболее уникальным параметрам. В данном случае, я бы обратил внимание на text. В крайнем случае, в отдельной переменной укажите x-path (либо css-селектор, если больше нравится) кнопки и уже через него ищите ее и кликайте.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.12.16.41042
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как автоматизировать вход в систему с помощью Selenium в Python?
Автоматизация процесса входа на какой-либо веб-сайт, используя программу, написанную на Python, очень удобна и практична в эксплуатации. Реализовывается это благодаря библиотеке Selenium WebDriver. Selenium WebDriver — это библиотека для управления браузером, которая поддерживает все основные браузеры и доступна для разных языков программирования, включая Python. И в данной работе я бы хотел использовать ее для автоматизированного входа на GitHub.
Первым делом, что нам необходимо сделать – это установить Selenium для Python, использую команду: pip3 install selenium. После этого, понадобится установить специфичный драйвер для браузера, которым мы хотим управлять. Лично я, буду использовать ChromeDriver, но вы можете использовать любой другой. Далее, необходимо открыть новый скрипт Python, инициализировать WebDriver и ввести свои учетные данные от GitHub:
После того, как мы загрузили и разархивировали драйвер, необходимо будет его поместить в текущий каталог, то есть, скачанный мною chromedriver.exe я помещаю в папку с проектом. Именно поэтому, я просто передаю его имя конструктору.
Поскольку мы заинтересованы в автоматизации входа в систему GitHub, то перейдем на страницу входа в Github и посмотрим на неё через кнопку f12 для того, чтобы найти её HTML элементы, а именно: идентификатор полей ввода логина и пароля, а также имя кнопки входа, необходимые для получения этих элементов в коде и их запрограммирования. Обратите внимание, что поле ввода имени пользователя/адреса электронной почты имеет id поля login_field, где поле ввода пароля имеет id password. Также кнопка отправки имеет имя commit. И приведенный ниже код переходит на страницу входа в Github, извлекает эти элементы, заполняет учетные данные и нажимает кнопку:
В данном коде, функция find_element_by_id() извлекает HTML элемент по его идентификатору, а метод send_keys() имитирует нажатие клавиш. Приведенный выше код заставит Chrome ввести электронное письмо и пароль, а затем нажать кнопку «Sign in».
Следующее, что нужно сделать, это определить, был ли наш вход в систему успешным. Для этого есть масса способов, но здесь мы попытаемся обнаружить ошибку при входе в систему. С помощью все той же консоли, которая вызывается клавишей f12, мы увидим, что при непрвильном вводе учетных данных, появляется новый элемент div HTML с классом «flash-error», который имеет текст «Incorrect username or password» («Неправильное имя пользователя или пароль»). Приведенный ниже код отвечает за ожидание загрузки страницы после входа в систему с помощью WebDriverWait() и проверяет наличие ошибки:
Тут мы используем WebDriverWait, чтобы дождаться завершения загрузки документа, метод execute_script() выполняет Javascript в браузере, код JS возвращает document.readyState === ‘complete’ возвращает True, если всё хорошо и False в противном случае.
В результате всех этих действий мы получаем очень удобную программу, которая упрощает нам жизнь. Например, мы написали какую-либо программу на Python и хотим ее выгрузить на наш GitHub. И раньше, чтобы это сделать, необходимо было заходить в браузер, переходить на сайт, вводить свои учетные данные и после этого уже загружать свой новый проект в репозиторий. Теперь же, достаточно просто запустить эту программу, и она все основные действия сделает за вас, вам останется лишь загрузить свой проект.





