Selenium — это бесплатная и открытая библиотека для автоматизированного тестирования веб-приложений. Я предполагаю Если вы посетили этот сайт, скорее всего, вы хотя бы слышали и имеете представление о Selenium.
Что такое Selenium?
Библиотека первоначально была создана в 2004 году Джейсоном Хаггинсом, к которому впоследствии присоединились другие его коллеги из компании ThoughtWorks. Selenium поддерживает все основные браузеры, и тесты могут быть записаны на многих языках программирования, а также работать на платформах Windows, Linux и Macintosh.
Selenium 2 объединяется с другим тестовым фреймворком WebDriver (именно поэтому вы видите ‘seleniumwebdriver‘) во главе с Саймоном Стюартом в Google. Сегодня Саймон работает в FaceBook. Selenium 2.0 был выпущен в июле 2011 года.
Язык программирования для Selenium
Тесты могут быть написаны в нескольких языках программирования, таких как Java, C#, Python, JavaScript и Ruby. Весьма часто можно услышать высказывание типа «Это Java, поэтому мы также будем писать тесты на Java.» Это не совсем правильно. Тестирование программного обеспечения заключается в том, соответствует ли работа программиста требованиям заказчика. В некотором смысле, тестеры представляют самих клиентов. Тестеры должны иметь больший вес при определении тестового синтаксиса, чем программисты. Плюс, зачем вам требовать, чтобы у ваших тестировщиков был один и тот же язык программирования?
Сценарные языки программирования, такие как Ruby и Python больше подходят для тестовых скриптов, чем компилируемые языки, такие как C# и Java.
Все примеры на этом сайте написаны в Selenium, в связке с Python. Это не означает, что этот материал предназначен только для тестеров / разработчиков, которые знают Python. В нижеприведенных примерах можно увидеть, что использование Selenium в различных языках программирования очень похоже. Как только вы овладеете одним, вы сможете применять его к другим довольно легко. Взгляните на простой тестовый сценарий Selenium в пяти разных языковых привязках: Java, C#, JavaScript, Ruby и Python.
Selenium для Python. Глава 1. Установка
Представляю перевод неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.
Предисловие от автора статьи
Selenium WebDriver – это программная библиотека для управления браузерами. WebDriver представляет собой драйверы для различных браузеров и клиентские библиотеки на разных языках программирования, предназначенные для управления этими драйверами.
По сути своей использование такого веб-драйвера сводится к созданию бота, выполняющего всю ручную работу с браузером автоматизированно.
Чаще всего Selenium WebDriver используется для тестирования функционала веб-сайтов/веб-ориентированных приложений. Автоматизированное тестирование удобно, потому что позволяет многократно запускать повторяющиеся тесты. Регрессионное тестирование, то есть, проверка, что старый код не перестал работать правильно после внесения новых изменений, является типичным примером, когда необходима автоматизация. WebDriver предоставляет все необходимые методы, обеспечивает высокую скорость теста и гарантирует корректность проверки (поскольку человеский фактор исключен). В официальной документации Selenium приводятся следующие плюсы автоматизированного тестирования веб-приложений:
Также одной из незаменимых особенностей Selenium WebDriver является ожидание загрузки страницы. Сюда можно отнести случаи, когда парсинг данных на странице невозможен из-за страниц перенаправления или ожидания, содержащих примерно такой текст: «Подождите, страница загружается». Такие страницы, само собой разумеется, не является целью парсинга, однако обойти их часто не представляется возможным. Естественно, без Selenium WebDriver. Selenium WebDriver позволяет в таких случаях «ожидать», как ожидал бы человек, пока на странице, к примеру, не появится элемент с необходимым именем.
Еще один плюс Selenium заключен в том, что действия веб-драйвера видимы визуально и требуют минимального времени нахождения на странице, это позволяет с удобством демонстрировать функционал сайта, когда необходима презентация сервиса.
Некоторые проблемы WebDriver (из сети и личного опыта):
Содержание:
1. Установка
1.1. Введение
Привязка Selenium к Python предоставляет собой простой API [Интерфейс программирования приложений (англ. Application Programming Interface) — Прим. пер.] для написания тестов функциональности/тестов соответствия требованиям с использованием веб-драйвера Selenium WebDriver. С помощью Selenium Python API вы можете интуитивно просто получить доступ ко всему функционалу Selenium WebDriver.
Привязка Python-Selenium предоставляет удобный API для доступа к таким веб-драйверам Selenium как Firefox, Ie, Chrome, Remote и других. На данный момент поддерживаются версии Python 2.7, 3.2, 3.3 и 3.4.
В данной документации рассмотрен Selenium 2 WebDriver API. Selenium 1 / Selenium RC API в ней не охвачены.
1.2. Загрузка Selenium для Python
Для создания изолированной среды Python вы можете использовать virtualenv. Также библиотека Python 3.4 содержит модуль pyvenv, который практически аналогичен virtualenv.
1.3. Подробная инструкция для пользователей Windows
Примечание
Для данной инсталляции вам необходим доступ к сети Интернет.
1.4. Загрузка Selenium server
Примечание
Selenium server необходим в случаях, когда вы хотите использовать remote WebDriver [удаленный — Прим. пер.]. За дополнительной информацией обращайтесь к разделу Использование Selenium с remote WebDriver. Если вы только начинаете изучать Selenium, вы можете пропустить этот раздел и продолжить изучение со следующей главы.
Selenium server написан на языке Java. Для его запуска рекомендована среда Java Runtime Environment (JRE) версии 1.6 или выше.
Вы можете скачать Selenium server 2.x на странице загрузок сайта selenium. Имя файла должно выглядеть примерно таким образом: selenium-server-standalone-2.x.x.jar. Вы всегда можете загрузить последнюю версию Selenium server 2.x.
Если Java Runtime Environment (JRE) не установлена в вашей системе, вы можете скачать JRE с сайта Oracle. Если вы используете системы GNU/Linux и имеете права root [права администратора — Прим. пер.], вы так же можете установить JRE, используя инструкции вашей системы.
Если команда java доступна в PATH (переменная окружения), вы можете запустить Selenium server используя следующую команду:
Замените 2.x.x актуальной версией Selenium server, скачанной вами с сайта.
Если JRE установлена под пользователем, не обладающим правами root и/или если она недоступна в переменной окружения PATH, вы можете ввести относительный или полный путь до файла java. Аналогично, вы можете дополнить имя jar-файла Selenium server до относительного или полного пути. После этого команда будет выглядеть так:
Selenium тестирование в Python
Библиотека Selenium в Python предоставляет простой API для написания функциональных и интеграционных тестов веб-приложений. Благодаря Selenium Python API легко получить доступ ко всем функциям Selenium WebDriver интуитивным способом.
Для работы Selenium требуется WebDriver. В настоящее время есть WebDriver для Firefox, Chrome, Edge и Safari. В примерах далее будет использован chromedriver.
Установка Selenium
Для установки пакета selenium воспользуемся программой pip. Установку рекомендуется проводить в виртуальном окружении Python.
Установка chromedriver
Процесс установки довольно прост, потому что chromedriver просто исполняемый файл в операционной системе, с которым Selenium будет взаимодействовать в процессе тестирования. Сверьтесь с официальной страницей chromedriver для загрузки и последующей установки свежей версии программы. Установка в Linux выглядит так :
Управление Chrome из Python
Теперь импортируем пакет webdriver из selenium сказав ему использовать chromedriver.
Выполнение этого кода приведёт к кратковременному появлению окна Chrome. Дальше ничего не будет происходить, потому что пример не сообщает webdriver никаких дополнительных инструкций.
Решим простую задачу получения текущей версии программы учёта картриджей и принтеров в организации. Беглый взгляд на код главной страницы показывает, что версия находится внутри разметки:
Таким образом, версия программы находится в тэге a внутри div с классом callout. Поиск его на странице показывает, что этот класс не уникален, поэтому используем Selenium для поиска первого элемента и получения его содержимого следующим образом:
Запуск кода приведёт к вызову окна Chrome, которое загружает страницу целиком, затем производится поиск нужного результата с последующей его печатью в терминал. После выполнения скрипта производится закрытие окна браузера. В этом примере используется селектор CSS с Selenium методом find_elements_by_css_selector. Для навигации по страницам также доступно множество других методов find_element_by_ *.
Скрытый запуск браузера
Для последующих примеров будет полезно использовать chromedriver в режиме скрытого запуска браузера. Для этого немного изменим предыдущий пример:
Разница в скорости выполнения двух примеров незначительна, но при использовании на реальных тестах, с возможными сотнями отдельных тестов, экономия времени будет существенной.
Ключевые возможности selenium
Поиск элементов
Всего восемь методов поиска (плюс ещё восемь во множественном числе):
Все эти методы довольно длинные, поэтому хорошим помощником является класс webdriver.common.By. By может заменить методы более длинной формы простым сокращением. Предыдущий пример кода можно заменить на:
Хотя этот код не является кратким, поэтому предлагается его немного доработать создав метод обертки для поиска элементов. Это должно значительно сократить усилия по набору этих методов по мере увеличения размера теста и сложности. Вот примерная обёртка:
Используется множественный метод find_elements и возвращает либо список, либо один элемент в зависимости от того, сколько их найдено. При этом можно использовать find(By.ID, ‘my-id’), вместо driver.find_element_by_id(‘my-id’). Эта форма преобразует код в гораздо более чистый, особенно при переходе между различными доступными методами поиска.
Отправка Input
Большинство проектов веб-приложений будут иметь дело с полями ввода, Selenium также это хорошо поддерживает. Каждый класс webelement (результат различных методов find_element) содержит метод send_keys, который может использоваться для моделирования ввода текста в элементе. Попробуем использовать эту функцию для поиска «Python» в Википедии.
Быстрый просмотр источника страницы Википедии показывает, что элемент ввода поиска использует идентификатор searchInput.
Вышеприведенный код откроет окно Chrome с загруженной страницей в Википедии и «Python» в поле ввода поиска. Это окно остаются открытым, потому что код не включает команду driver.close(), которая используется в предыдущих примерах.
Есть несколько вариантов отправить форму. Далее приведено несколько способов, которые позволяют это выполнить.
Отправка содержимого формы
Еще раз взглянув на html источник в Википедии, форма поиска содержит Далее идентификатор можно использовать с методом webelement.submit() для отправки формы.
Добавьте в предыдущий пример следующий код:
Запуск кода приведёт к открытию окна Chrome с результатами поиска в Википедии слова Python.
Нажатие кнопки submit формы
Страница поиска Wikiedpia включает в себя причудливую, стилизованную кнопку отправки запроса поиска. У него нет уникального идентификатора, поэтому для определения и «щелчка» кнопки код должен использовать какой-либо другой метод. Это единственный элемент button внутри формы поиска, поэтому его можно легко выбрать с помощью селектора CSS.
Добавьте в пример использования Input:
Нажатие клавиши ENTER
В заключении, Selenium содержит набор кодов клавиш, которые могут использоваться для имитации нажатия «специальных» (не буквенно-цифровых) клавиш. Эти коды находятся в webdriver.common.keys. Чтобы отправить форму, код должен будет использовать клавишу Enter, поэтому пересмотренная версия поискового кода Википедии выглядит так:
Как и два предыдущих примера, этот скрипт запустит открытую страницу Chrome с результатами поиска в Википедии.
Это, пожалуй, самый чистый способ отправки данных формы, потому что не требует поиска других элементов, но тщательный тестер может захотеть рассмотреть возможность тестирования нескольких методов отправки для обеспечения гарантии функциональности.
Очистка input
Хотя Selenium предлагает метод webelement.clear(), его реализация несовместима в разных браузерах, и ее поведение может быть определено по-разному в зависимости от тестируемого приложения и элемента. По этим причинам не рекомендуется им пользоваться для очистки полей ввода формы. Вместо этого класс Keys может использоваться для имитации нажатия клавиши backspace несколько раз в input.
Простая функция реализации.
Простая функция будет принимать WebElement, вычислять длину его атрибута value и имитировать нажатие BACK_SPACE, пока весь текст не будет удален из input.
Давайте используем Selenium для поиска в Google слова «selenium». Элемент input поиска Google не имеет уникального идентификатора или класса, но он использует атрибут name со значением «q». Его можно использовать для поиска элемента и отправки keys.
На странице результатов поле поиска по-прежнему имеет значение «q» и теперь заполнено значением «selenium». Хотя имя не изменилось, Selenium нужно будет снова найти элемент, потому что страница изменилась. Добавьте в код изменения, чтобы найти элемент и использовать пользовательскую функцию clear() для его очистить:
В целом BACK_SPACE должен быть намного надежнее, чем метод webelement.clear().
Ожидание
«Ожидание» в Selenium может быть обманчиво сложной проблемой. До сих пор все примеры основывались на способности Selenium дождаться, когда страница закончит загрузку, прежде чем предпринимать какие-либо конкретные действия. Для простых тестов это может быть вполне достаточным. Но по мере усложнения тестов и приложений этот метод может не всегда быть пригодным.
Неявные ожидания Самый простой способ добавить вызов метода WebDriver.implicitly_wait (). Метод принимает целочисленный ввод, который определяет, сколько секунд ждать при выполнении любого из методов find_element.
По умолчанию неявное ожидание равно нулю (или нет ожидания), поэтому, если конкретный элемент не найден сразу, Selenium будет вызывать исключение NoSuchElementException. Попробуем найти элемент name с атрибутом «query» на GitHub (его нет):
Этот код вызовет исключение NoSuchElementException после того, как Chrome загрузит домашнюю страницу GitHub.
Теперь давайте проверим код ниже, который устанавливает неявное время ожидания в пять секунд для одной и той же невыполнимой задачи:
Этот код создаст то же самое исключение, но он будет ждать пять секунд, прежде чем это сделать.
Хотя эти примеры рисуют очень простую картину, реальность такова, что различные условия любой тестовой среды или приложения будут влиять на способность Selenium определять, когда страница загружена или существует ли элемент.
Рекомендуется всем тестам установку 10 секундного неявного времени ожидания. Это должно помочь предотвратить прерывистые исключения, вызванные проблемами с такими базовыми элементами, как сетевое подключение или баги веб-серверов.
Ожидаемые условия (явные ожидания)
Когда неявных ожиданий недостаточно, ожидаемые условия чрезвычайно ценны. Класс WebDriverWait предоставляет методы until() и until_not(), которые могут использоваться с ожидаемыми условиями для создания более сложных и нужных условий ожидания.
presence_of_element_located() примет объект, описывающий метод и локатор, и вернет true, если объект существует в DOM. Это можно использовать с WebdriverWait.until () и временем ожидания (в секундах):
Время ожидания
Автоматизация тестирования веб-приложения с использованием Selenium WebDriver, Python, и Behave
Перед началом
Тут я не буду подробно останавливаться на том, как искать элементы, и как взаимодействовать с ними при помощи selenium webdriver, а расскажу только о том, как можно легко и удобно писать и гонять тесты написанные на python с использованием behave.
1. Установка нужностей
Как лаконично подсказывает wiki:
Selenium — это инструмент для тестирования Web-приложений.
Так же про него много писали на Хабре:
тут, и тут даже есть частичный перевод не официальной документации
Теперь установим behave. Можно с использованием pip:
pip install behave
А можно скачать тут: behave на pypi
Что такое behave? Behave — это фрейморк для программирования через поведения в python-стиле(Что такое Behavior-driven development?).
Behave использует тесты написанные на натуральном языке, с логикой на python.
Он обладает несколькими серьезными плюсами:
+ Легкая установка
+ Отчеты в формате junit
+ Тесты может писать любой человек на естественном языке.
+ Есть возможность интеграции с jenkins (с другими CI, наверное, тоже)
Сравнение behave с похожими инструментами.
Когда все необходимое установлено можно приступать к настройке окружения для написания и выполнения тестов.
2. Настройка
Опционально можно добавить в директорию содержащую папку steps файл — environment.py c кодом который надо будет выполнять прежде или после определенных событий в тесте.
Подробное описание этого файла тут.
Наш пример будет максимально простым, поэтому мы не будем включать этот файл.
Итого, как выглядит наша директория в минимальной комплектации:
features/
features/everything.feature
features/steps/
features/steps/steps.py
пример из behave tutorial
Вот и вся настройка, можно писать первый тест!
3. Написание и запуск первого теста
Итак, скопируйте код ниже в файл firs_test.py.
Если лень смотреть код, то логика такая:
1. Открыть ya.ru
2. Клацнуть на кнопку «Найти»
3. Проверить, что на странице выдачи есть текст: «Задан пустой поисковый запрос»
Шаги из теста, по декораторам свяжутся с python функциями. (Декораторы обозначены знаком @)
Теперь запустим наш тест.
Перейдем в папку, где он лежит, и выполним команду:
Если все прошло хорошо, то отчет будет, примерно, таким:
Заключение
Здесь я привел только самое основное.
Фичи selenium неисчислимы, да и behave много чего умеет. В том числе, отчеты в формате junit и интеграцию с jenkis.
Спасибо за внимание, и хороших выходных!
Список использованных материалов
UPD: Если что-то в статье не очень хорошо написано, или чего-то не хватает, то можно высказаться в комментариях, или написать в личку мне, и мы вместе улучшим ее.
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 — это словарь. Вместо того, чтобы использовать словари по умолчанию, вы можете явно прописать значения:



