Как запустить автотест selenium chrome
В этой статье вы узнаете как пользоваться связкой PyCharm + Python + unittest + Selenium + JavaScript.
Для лучшего понимания пригодятся начальные знания Python и JavaScript
Основные методы работы в Selenium не зависят от языка, на котором вы пишете тест. Они разобраны в статье «Основы Selenium»
Я для работы использую PyCharm . Как добавить в PyCharm Selenium читайте здесь
Можете взять другой IDE или запускать из-под Linux ,но не советую пытаться запускать тесты Selenium из Подсистемы Windows для Linux так как в bash для Windows нет поддержки графики по умолчанию. Можно заморочиться и поставить что-то вроде Xming, но я не стал пробовать.
В этой статье я постараюсь показать развитие тестировщика на Python + Selenium.
Сначала попробуем запускать Selenium Webdriver и выполнять разные задачи, как средствами, встроенными в Webdriver, так и включая различные JavaScript манипуляции с DOM.
Установка
Первым делом нужно убедиться что установлен Python
Затем нужно убедиться что установлен pip
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
Если всё в порядке, то selenium можно установить через pip как обычный пакет
pip3 install selenium
Collecting selenium Downloading selenium-3.141.0-py2.py3-none-any.whl (904 kB) |████████████████████████████████| 904 kB 8.7 MB/s Requirement already satisfied: urllib3 in /usr/lib/python3/dist-packages (from selenium) (1.25.8) Installing collected packages: selenium Successfully installed selenium-3.141.0
Выбор драйвера
После установки Selenium нужно скачать драйверы для нужных браузеров.
Это действие не зависит от того на каком языке программирования вы планируете писать тест.
Подробную инструкцию можете прочитать в статье Selenium
Когда путь до драйвера добавлен в PATH можно подключать нужный браузер в ваш Python код.
Firefox драйвер называется Gecko Driver и подключается так
from selenium import webdriver driver = webdriver.Firefox()
Chrome аналогично. Вместо слова driver вы можете придумать свои называния. Например chdriver и ffdriver.
Поиск элеменотов
Есть много способов искать элементы, но их объединяет необходимость импортировать By
Простой тест
Зайдём на сайт и проверим, что в названии есть фраза «О Финляндии и путешествиях» найдём изображение по имени класса, найдём изображение по имени селектора
headless
Для «невидимого» запуска Selenium Webdriver нужно использовать опцию headless
Чтобы пользоваться этим режимом нужно импортировать Options
Можно добавить логику на основе переданного аргумента. Я обычно добавляю лог.
Как нажать на кнопку
Чтобы нажать на кнопку нужно найти элемент и использовать функцию click()
Например, найдём элемент button с классом new-button и нажмём на него.
Можно искать по id
Также допустимо сперва присвоить переменной результат поиска и потом вызвать click()
Поиск по тексту
Задача: кликнуть на кнопку с текстом LOGIN
Известно: div с текстом LOGIN имеет класс title, но элементов этого класса несколько и какой по счёту нам нужен неизвестно
Находим все элементы класса title
title_class = driver.find_elements_by_class_name("title") for el in title_class: if el.text == "LOGIN": login_button = el login_button.click()
Дождаться загрузки элемента
Допустим, вам нужно дождаться загрузки элементов с классом Buttons
Вы готовы ждать максимум десять секунд.
driver.implicitly_wait(10) buttons = driver.find_elements_by_class_name("Buttons")
Если элементы появятся быстрее, специально ждать десять секунд драйвер не будет.
Таким образом implicit wait это либо пока элемент не нашёлся, либо пока лимит времени не истёк. Лимит вы устанавливаете сами для каждого случая отдельно.
Автозаполнение формы
Пример автозаполнения формы на сайте. Может пригодиться, если вы сделали форму и хотите время от времени проверять всё ли на ней работает.
Сперва убедимся, что в названии страницы присутствует «Коста-дель-Соль» затем автоматически заполним форму.
Пример реального теста на создание пользователя
Запускаем Chrome и заходим на сайт.
Логинимся, находим нужный пункт в верхнем меню - Tools открываем его.
Выпадает список - находим там нужный - User Profiles.
Заходим туда, заполняем все формы, сохраняем и проверяем - не получили ли мы предупреждение о том, что пользователь с таким именем уже существует. Проверяем не выдал ли фреймворк, на котором сделан сайт, необработанную ошибку.
В этом примере поиск элементов по классу сделан средствами JavaScript, затем найденным элементам присвоены определённые id и уже по этим id из находит Selenium Webdriver
Не копируйте этот тест себе пока не прочитаете всю статью. Очень много чего ещё можно оптимизировать
Импорт файлов
Если вам нужно загрузить файл с помощью Selenium - нажимать на кнопку загрузки не нужно.
Найдите элемент input (скорее всего) в котором триггерится загрузка. Выделите его и используйте .send_keys с указанием пути до файла
Допустим, что вы нашли этот элемент и его Или у него не было никакого id вообще, но вы присвоили ему этот id самостоятельно с помощью JavaScript
Пример теста без использования специальных библиотек
Основное отличие от предыдущего примера - кликов на верхнее меню теперь несколько, поэтому скрипт клика на элемент верхнего меню оформлен как функция, которая принимает в качесте параметра название элемента меню, например Tools, и затем использует это название как ключ для внутреннего словаря - получает порядковый номер элемента и кликает на него.
Также в этом тесте будет загрузка файла. Пока что я не пользуюсь никакими библиотеками для тестирования, поэтому вся надежда на текстовый вывод.
Selenium + unittest
Как вы уже скорее всего знаете, в Selenium Webdriver нет никаких средств для написания тестов. Обычно вместе с Webdriver используют библиотеку того языка программирования, на котором работает программист-тестировщик.
В этой статье я пользуюсь Python 3 поэтому в качестве библитеки для тестирования могу выбрать unittest, nose или pytest.
В этой статье рассматривается создание достаточного простого автотеста. Статья будет полезна начинающим автоматизаторам.
Материал изложен максимально доступно, однако, будет значительно проще понять о чем здесь идет речь, если Вы будете иметь хотя бы минимальные представления о языке Java: классы, методы, etc.
- установленная среда разработки Intellij IDEA (является самой популярной IDE, для большинства случаев достаточно бесплатной версии Community Edition);
- установленные Java (jdk/openjdk) и Maven, прописанные в системные окружения ОС;
- браузер Chrome и chromedriver — программа для передачи команд браузеру.
Создание проекта
Запустим Intellij IDEA, пройдем первые несколько пунктов, касающихся отправки статистики, импорта проектов, выбора цветовой схемы и т.д. — просто выберем параметры по умолчанию.
В появившемся в конце окне выберем пункт «Create New Project», а в нем тип проекта Maven. Окно будет иметь вид:
- Maven — это инструмент сборки Java проектов;
- Project SDK — версия Java, которая установлена на компьютере;
- Create from archetype — это возможность создавать проект с определенным архетипом (на данном этапе данный чекбокс отмечать не нужно).
Нажмем «Next». Откроется следующее окно:
Groupid и Artifactid — идентификаторы проекта в Maven. Существуют определенные правила заполнения этих пунктов:
- Groupid — название организации или подразделения занимающихся разработкой проекта. В этом пункте действует тоже правило как и в именовании пакетов Java: доменное имя организации записанное задом наперед. Если у Вас нет своего доменного имени, то можно использовать свой э-мейл, например com.email.email;
- Artifactid — название проекта;
- Version — версия проекта.
Нажмем «Finish»: IDE автоматически откроет файл pom.xml:
В нем уже появилась информация о проекте, внесенная на предыдущем шаге: Groupid, Artefiactid, Version. Pom.xml — это файл который описывает проект. Pom-файл хранит список всех библиотек (зависимостей), которые используются в проекте.
Выберем нужную версию (в примере будет использована версия 3.14.0). Откроется страница:
Копируем содержимое блока «Maven» и вставим в файл pom.xml в блок
Таким образом библиотека будет включена в проект и ее можно будет использовать. Аналогично сделаем с библиотекой Junit (будем использовать версию 4.12).
Создание пакета и класса
Раскроем структуру проекта. Директория src содержит в себе две директории: «main» и «test». Для тестов используется, соответственно, директория «test». Откроем директорию «test», кликом правой клавиши мыши по директории «java» выберем пункт «New», а затем пункт «Package». В открывшемся диалоговом окне необходимо ввести название пакета. Имя базового пакета должно носить тоже имя, что и Groupid — «org.example».
Следующий шаг — создание класса Java, в котором пишется код автотеста. Кликом правой клавиши мыши по названию пакета выберем пункт «New», а затем пункт «Java Class».
В открывшемся диалоговом окне необходимо ввести имя Java класса, например, LoginTest (название класса в Java всегда должно начинаться с большой буквы). В IDE откроется окно тестового класса:
Настройка IDE
Прежде чем начать, необходимо настроить IDE. Кликом правой клавиши мыши по названию проекта выберем пункт «Open Module Settings». В открывшемся окне во вкладке «Sources» поле «Language level» по умолчанию имеет значение 5. Необходимо изменить значение поля на 8 (для использования всех возможностей, присутствующих в этой версии Java) и сохранить изменения:
Далее необходимо изменить версию компилятора Java: нажмем меню «File», а затем выберем пункт Settings.
В открывшемся перейдем «Build, Execution, Deployment» -> «Compiler» -> «Java Compiler». По умолчанию установлена версия 1.5. Изменим версию на 8 и сохраним изменения:
Test Suite
- Пользователь открывает страницу аутентификации;
- Пользователь производит ввод валидных логина и пароля;
- Пользователь удостоверяется в успешной аутентификации — об этом свидетельствует имя пользователя в верхнем правом углу окна;
- Пользователь осуществляет выход из аккаунта путем нажатия на имя пользователя в верхнем правом углу окна с последующим нажатием на кнопку «Выйти…».
Тест считается успешно пройденным в случае, когда пользователю удалось выполнить все вышеперечисленные пункты.
Для примера будет использоваться аккаунт Яндекс (учетная запись заранее создана вручную).
Первый метод
В классе LoginTest будет описана логика теста. Создадим в этом классе метод «setup()», в котором будут описаны предварительные настройки. Итак, для запуска браузера необходимо создать объект драйвера:
Перед созданием объекта WebDriver следует установить зависимость, определяющую путь к chomedriver (в ОС семейства Windows дополнительно необходимо указывать расширение .exe):
Чтобы ход теста отображался в полностью открытом окне, необходимо сказать об этом драйверу:
Случается, что элементы на страницах доступны не сразу, и необходимо дождаться появления элемента. Для этого существуют ожидания. Они бывают двух видов: явные и неявные. В примере будет использовано неявное ожидание Implicitly Wait, которое задается вначале теста и будет работать при каждом вызове метода поиска элемента:
Таким образом, если элемент не найден, то драйвер будет ждать его появления в течении заданного времени (10 секунд) и шагом в 500 мс. Как только элемент будет найден, драйвер продолжит работу, однако, в противном случае тест упадем по истечению времени.
Для передачи драйверу адреса страницы используется команда:
Выносим настройки
Для удобства вынесем название страницы в отдельный файл (а чуть позже и некоторые другие параметры).
Создадим в каталоге «test» еще один каталог с названием «resources», а в нем обычный файл «conf.properties», в который поместим переменную:
а также внесем сюда путь до драйвера
В пакете «org.example» создадим еще один класс «ConfProperties», который будет читать записанные в файл «conf.properties» значения:
Обзор первого метода
Метод «setup()» пометим аннотацией Junit «@BeforeClass», которая указывает на то, что метод будет выполняться один раз до выполнения всех тестов в классе. Тестовые методы в Junit помечаются аннотацией Test.
Page Object
При использовании Page Object элементы страниц, а также методы непосредственного взаимодействия с ними, выносятся в отдельный класс.
Создадим в пакете «org.example» класс LoginPage, который будет содержать локацию элементов страницы логина и методы для взаимодействия с этими элементами.
В результате мы увидим этот элемент среди множества других. Теперь мы можем скопировать его локацию. Для этого кликаем правой кнопкой мыши по выделенному в панели разработчика элементу, выбираем меню «Copy» -> «Copy XPath».
Для локации элементов в Page Object используется аннотация @FindBy.
Напишем следующий код:
Таким образом мы нашли элемент на страницу и назвали его loginField (элемент доступен только внутри класса LoginPage, т.к. является приватным).
Однако, такой длинный и страшный xpath использовать не рекомендуется (рекомендую к прочтению статью «Не так страшен xpath как его незнание». Если присмотреться, то можно увидеть, что поле ввода логина имеет уникальный id:
Воспользуемся этим и изменим поиск элемента по xpath:
Теперь вероятность того, что поле ввода пароля будет определено верно даже в случае изменения местоположения элемента на странице, возросла.
Аналогично изучим следующие элементы и получим их локаторы.
Поле ввода пароля:
А теперь напишем методы для взаимодействия с элементами.
Метод ввода логина:
Метод ввода пароля:
Метод нажатия кнопки входа:
Для того, чтобы аннотация @FindBy заработала, необходимо использовать класс PageFactory. Для этого создадим конструктор и передадим ему в качестве параметра объект Webdriver:
После авторизации мы попадаем на страницу пользователя. Т.к. это уже другая страница, в соответствии с идеологией Page Object нам понадобится отдельный класс для ее описания. Создадим класс ProfilePage, в котором определим локаторы для имени пользователя (как показателя успешного входа в учетную запись), а также кнопки выхода из аккаунта. Помимо этого, напишем методы, которые будут получать имя пользователя и нажимать на кнопку выхода.
Итого, страница будет иметь следующий вид:
Интересный момент: в метод getUserName() пришлось добавить еще одно ожидание, т.к. страница «тяжелая» и загружалась довольно медленно. В итоге тест падал, потому что метод не мог получить имя пользователя. Метод getUserName() с ожиданием:
Вернемся к классу LoginTest и добавим в него созданные ранее классы-страницы путем объявления статических переменных с соответствующими именами:
Сюда же вынесем переменную для драйвера
В аннотации @BeforeClass создаем экземпляры классов созданных ранее страниц и присвоим ссылки на них. Создание экземпляра происходит с помощью оператора new. В качестве параметра указываем созданный перед этим объект driver, который передается конструкторам класса, созданным ранее:
А создание экземпляра драйвера приведем к следующему виду (т.к. он объявлен в качестве переменной):
Теперь можно перейти непосредственно к написанию логики теста. Создадим метод loginTest() и пометим его соответствующей аннотацией:
Осталось лишь корректно все завершить. Создадим финальный метод и пометим его аннотацией @AfterClass (методы помеченные этой аннотацией выполняются один раз, после завершения всех тестовых методов класса).
В этом методе осуществляется вход в меню пользователя и нажатие кнопки «Выйти», чтобы разлогиниться.
Последняя строка нужна для закрытия окна браузера.
Обзор теста
Запуск автотеста
Для запуска автотестов в Intellij Idea имеется несколько способов:
- Alt+Shift+F10;
- Клик правой клавишей мышки по имени тестового класса, после чего в открывшемся меню выбрать Run;
В результате выполнения автотеста, в консоли Idea я вижу, что тестовый метод loginTest() пройден успешно:
Как я могу сделать Chrome протестируйте тестовые случаи Selenium-WebDriver?
скачать обновление версии драйвера chrome от здесь
вы также можете увидеть ответ после нажатия здесь
вы должны загрузить chromeDriver в папку и добавить эту папку в переменную PATH. Вам придется перезагрузить консоль, чтобы она работала.
найти последнюю версию chromedriver здесь. После загрузки распакуйте его в корне вашей установки python, например C:/Program Files/Python-3.5 , вот и все. Вам даже не нужно указывать путь в любом месте и/или добавить chromedriver в свой путь, или тому подобное. Я просто сделал это на чистой установке Python, и это работает.
Если вы используете homebrew на MacOS, вы можете использовать команду:
он должен работать нормально после этого без какой-либо другой конфигурации.
вам нужно установить драйвер chrome. Вы можете установить этот пакет с помощью nugget, как показано ниже
вы можете использовать приведенный ниже код для запуска тестовых случаев в Chrome с помощью веб-драйвера Selenium:
загрузите последнюю версию драйвера chrome и используйте этот код:
все ответы выше верны, ниже немного глубокое погружение в проблему и решение.
конструктор драйвера в selenium например
поиск исполняемого файла драйвера, в этом случае драйвер chrome ищет исполняемый файл драйвера chrome, если служба не может найти исполняемый файл, выдается исключение
вот откуда происходит исключение (обратите внимание на состояние проверки метод)
Ниже приведен метод состояния проверки, который вызывает исключение
решение: установите системное свойство перед созданием объекта драйвера следующим образом
ниже приведен фрагмент кода (для chrome и firefox), где служба драйверов ищет исполняемый файл драйвера:
Chrome:
FireFox:
где CHROME_DRIVER_EXE_PROPERTY = " webdriver.хром.водитель" и GECKO_DRIVER_EXE_PROPERTY = " webdriver.геккон.водитель"
аналогичный случай для других браузеров, ниже приведен снимок списка доступных реализаций браузера
Несколько инструментов могут управлять веб-браузером так, как это сделал бы реальный пользователь, например, переходя на разные страницы, взаимодействуя с элементами страницы и захватывая некоторые данные. Этот процесс называется Автоматизация веб-браузера . То, что вы можете сделать с автоматизацией веб-браузера, полностью зависит от вашего воображения и потребностей.
Некоторые из распространенных случаев использования автоматизации веб-браузера могут быть:
- Автоматизация ручных тестов в веб-приложении
- Автоматизация повторяющихся задач, таких как удаление информации с веб-сайтов
- Заполнение HTML-форм, выполнение некоторых административных заданий и т. Д
Что такое Селен?
Selenium IDE-это чисто инструмент для воспроизведения записей, который поставляется в качестве плагина Firefox и расширения Chrome. Selenium RC был устаревшим инструментом, который сейчас обесценился. Selenium WebDriver-это новейший и широко используемый инструмент.
Примечание : Термины Selenium , Selenium WebDriver или просто WebDriver используются взаимозаменяемо для обозначения Selenium WebDriver.
Здесь важно отметить, что Selenium создан только для взаимодействия с веб-компонентами. Поэтому, если вы столкнетесь с какими-либо настольными компонентами, такими как диалоговое окно Windows, Selenium сам по себе не сможет взаимодействовать с ними. Существуют и другие типы инструментов, такие как AutoIt или Automa, которые могут быть интегрированы с Selenium для этих целей.
Зачем использовать Селен?
В этом уроке мы узнаем, как использовать привязки Java Selenium WebDriver . Мы также рассмотрим API WebDriver .
Успех Selenium также можно объяснить тем фактом, что спецификации WebDriver стали рекомендацией W3C для браузеров.
Предпосылки:
- Среда Java и ваша любимая среда разработки Java
WebDriver обеспечивает привязку для всех популярных языков, как описано в предыдущем разделе. Поскольку мы используем среду Java, нам необходимо загрузить и включить привязки Java в путь сборки. Кроме того, почти каждый популярный браузер предоставляет драйвер, который можно использовать с Selenium для управления этим браузером.
В этом уроке мы будем управлять Google Chrome.
Веб-драйвер
Прежде чем двигаться дальше, полезно понять несколько концепций, которые приводят в замешательство новичков. WebDriver не является классом , это интерфейс .
Все зависящие от браузера драйверы, такие как ChromeDriver , FirefoxDriver , InternetExplorerDriver , являются Java классами , которые реализуют интерфейс WebDriver|/. Эта информация важна, потому что, если вы хотите запустить свою программу в другом браузере, вам не нужно менять кучу кода, чтобы он работал, вам просто нужно поменять WebDriver для любого браузера, который вы хотите.
Как мы видим, драйвер содержит ссылку на ChromeDriver и, следовательно, может использоваться для управления браузером. Когда будет выполнено приведенное выше утверждение, вы должны увидеть, как в вашей системе откроется новое окно браузера. Но браузер еще не открыл ни одного веб-сайта. Нам нужно дать указание браузеру сделать это.
Примечание : Для использования другого WebDriver вам необходимо указать путь к драйверу в файловой системе, а затем создать его экземпляр. Например, если вы хотите использовать IE, то вот что вам нужно сделать:
Переход на Веб-сайт
Как упоминалось выше, сначала нам нужно перейти на ваш целевой веб-сайт. Для этого мы просто отправляем запрос GET на URL-адрес веб-сайта:
ВебЭлемент
Первым шагом в автоматизации веб-браузера является поиск элементов на веб-странице, с которыми мы хотим взаимодействовать, таких как кнопка, ввод, выпадающий список и т.д.
Селеновым представлением таких HTML-элементов является Веб-элемент . Как и WebDriver , WebElement также является интерфейсом Java. Как только мы получим WebElement , Мы сможем выполнить с ними любую операцию, которую может выполнить конечный пользователь, например, щелкнуть, ввести, выбрать и т. Д.
Очевидно, что попытка выполнить недопустимые операции, например, ввести текст в элемент кнопки, приведет к исключению.
Мы можем использовать HTML-атрибуты элемента, такие как идентификатор , класс и имя , чтобы найти элемент. Если таких атрибутов нет, мы можем использовать некоторые продвинутые методы определения местоположения, такие как CSS-селекторы и XPath .
Как мы видим, элемент имеет <вход> тег и несколько атрибутов, таких как идентификатор , класс и т.д.
WebDriver поддерживает 8 различных локаторов для поиска элементов:
- идентификатор
- Имя класса
- имя
- тагНаме
- Текст ссылки
- Частичная ссылка на текст
- cssSelector*
- xpath
Давайте рассмотрим их все по очереди, автоматизировав различные элементы на нашем целевом веб-сайте.
Определение местоположения элементов с помощью идентификатора
Если мы проверим поле ввода информационного бюллетеня на нашем целевом веб-сайте, мы сможем обнаружить, что у него есть атрибут id :
Мы можем найти этот элемент с помощью идентификатора локатора:
Поиск элементов по имени класса
Если мы проверим то же поле ввода, мы увидим, что оно также имеет атрибут class .
Мы можем найти этот элемент, используя имя класса локатор:
Определение местоположения элементов по имени
Для этого примера давайте представим выпадающий список, в котором пользователь должен выбрать свой возрастной диапазон. В раскрывающемся списке есть атрибут name , который мы можем найти:
Мы можем найти этот элемент, используя имя локатор:
Определение местоположения элементов с помощью xpath
Однако иногда эти подходы устаревают, так как существует несколько элементов с одним и тем же атрибутом:
В этих случаях мы можем использовать Локаторы XPath . XPath-это очень мощные локаторы, и они сами по себе являются полной темой. Следующий пример может дать вам представление о том, как создать XPath для приведенных выше фрагментов HTML:
Поиск элементов с помощью селектора css
Опять же, давайте представим список флажков, в которых пользователь выбирает предпочитаемый язык программирования:
Технически, для этого фрагмента HTML мы можем легко использовать имя локатор, поскольку они имеют разные значения. Однако в этом примере мы будем использовать селекторы css для поиска этого элемента, который широко используется во интерфейсе с такими библиотеками, как jQuery.
Следующий пример может дать вам представление о том, как создавать селекторы CSS для предыдущего фрагмента HTML:
Очевидно, это очень похоже на подход XPath.
Поиск элементов с помощью linkText
Мы можем найти ссылку по ее тексту:
Поиск элементов с помощью partialLinkText
В этих случаях мы можем использовать partialLinkText локатор:
Определение местоположения элементов с помощью tagName
Мы также можем найти элемент, используя его имя тега, например , , <ввод> , <выбор> и т. Д. Вы должны использовать этот локатор с осторожностью. Поскольку может быть несколько элементов с одинаковым именем тега, и команда всегда возвращает первый соответствующий элемент на странице:
Этот способ поиска элемента обычно более полезен, когда вы вызываете метод findElement для другого элемента, а не для всего HTML-документа. Это сужает ваш поиск и позволяет находить элементы с помощью простых локаторов.
Взаимодействие с элементами
Щелчок по элементам
Мы выполняем операцию щелчка с помощью метода click () . Мы можем использовать это на любом веб-элементе , если он доступен для кликабельности. Если нет, это вызовет исключение.
В этом случае давайте перейдем по ссылке домашняя страница :
Поскольку это фактически выполняет щелчок по странице, ваш веб-браузер затем перейдет по ссылке, которая была нажата программным способом.
Ввод Текста
Давайте введем некоторый текст в поле ввода Электронная почта :
Выбор Переключателей
Поскольку переключатели просто нажимаются, мы используем метод click() для выбора одной из них:
Установка Флажков
То же самое касается выбора флажков, хотя в этом случае мы можем выбрать несколько флажков. Если мы выберем другой переключатель, будет выбран предыдущий:
Выбор элементов из выпадающего списка
Чтобы выбрать элемент из выпадающего списка, нам нужно будет сделать две вещи:
Во-первых, нам нужно создать экземпляр Выбрать и передать ему элемент со страницы:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Затем мы можем выбрать элемент, используя его:
Отображаемый текст :
Значение (атрибут значение ):
Индекс (начинается с 0):
Если приложение поддерживает множественный выбор, мы можем вызвать один или несколько из этих методов несколько раз, чтобы выбрать различные элементы.
Чтобы проверить, позволяет ли приложение выполнять несколько вариантов выбора, мы можем запустить:
Есть много других полезных операций, которые мы можем выполнить в раскрывающемся списке:
Мы также можем сделать это с помощью Select :
Получение Значений Атрибутов
Чтобы получить значение определенного атрибута в элементе:
Установка Значений Атрибутов
Мы также можем задать значение определенного атрибута в элементе. Это может быть полезно там, где мы хотим включить или отключить какой-либо элемент:
Взаимодействие с мышью и клавиатурой
API WebDriver предоставил класс Действия для взаимодействия с мышью и клавиатурой.
Во-первых, нам нужно создать экземпляр Действия и передать ему экземпляр WebDriver :
Перемещение мыши
Иногда нам может потребоваться навести курсор на пункт меню, в котором отображается пункт подменю:
Перетаскивание
Перетаскивание элемента поверх другого элемента:
Перетаскивание элемента на несколько пикселей (например, 200 пикселей по горизонтали и 0 пикселей по вертикали):
Нажатие Клавиш
Удерживайте определенную клавишу при вводе некоторого текста, например, клавиши Shift :
Выполните такие операции, как Ctrl+a , Ctrl+c , Ctrl+v и ВКЛАДКА :
Взаимодействие с браузером
Получение источника страницы
Скорее всего, вы будете использовать это для очистки веб-страниц:
Получение заголовка страницы
Максимизация браузера
Увольнение водителя
Важно выйти из драйвера в конце программы:
Примечание : API WebDriver также предоставляет метод close () , и иногда это сбивает с толку новичков. Метод close() просто закрывает браузер и может быть снова открыт в любое время. Это не уничтожает объект WebDriver . Метод quit() более подходит, когда вам больше не нужен браузер.
Делать Скриншоты
Во-первых, нам нужно привести WebDriver к TakesScreenshot типу, который является интерфейсом . Далее мы можем вызвать getScreenshotAs() и передать OutputType.ФАЙЛ .
Наконец, мы можем скопировать файл в локальную файловую систему с соответствующими расширениями, такими как *.jpg,*. png и т.д.
Выполнение JavaScript
Мы также можем ввести или выполнить любой допустимый фрагмент JavaScript через Selenium WebDriver. Это очень полезно, так как позволяет вам делать многие вещи, которые не встроены непосредственно в Селен.
Во-первых, нам нужно привести WebDriver к типу JavascriptExecutor :
Может быть несколько вариантов использования, связанных с JavascriptExecutor :
Мы также можем сначала найти элемент с помощью локаторов WebDriver и передать этот элемент в execute Script() в качестве второго аргумента. Это более естественный способ использования JavascriptExecutor :
Чтобы задать значение поля ввода:
- Прокрутка элемента, чтобы перенести его в окно просмотра :
- Изменение страницы (добавление или удаление некоторых атрибутов элемента):
Доступ к файлам Cookie
Поскольку многие веб-сайты используют файлы cookie для хранения состояния пользователя или других данных, вам может быть полезно получить к ним программный доступ с помощью Selenium. Некоторые распространенные операции с файлами cookie описаны ниже.
Получить все файлы cookie:
Получите конкретный файл cookie:
Добавьте файл cookie:
Удалите файл cookie:
Вывод
Мы рассмотрели все основные функции Selenium WebDriver, которые могут потребоваться при автоматизации веб-браузера. Selenium WebDriver имеет очень обширный API и охватывает все, что выходит за рамки этого руководства.
Что пишут в блогах
Онлайн-тренинги
Что пишут в блогах (EN)
Разделы портала
Про инструменты
Автор: Энди Найт (Andy Knight)
Оригинал статьи
Перевод : Ольга Алифанова
Теперь WebDriver готов к работе – давайте напишем наш первый web-тест! Это будет простой поиск DuckDuckGo. DuckDuckGo – это поисковик, который не отслеживает пользовательские данные. Пользователи могут вводить запросы и получать ссылки на соответствующие сайты, как и в любой другой поисковой системе.
Прежде чем писать код автоматизации, всегда стоит записать тест-процедуру обычным языком. Такое создание процедуры заставляет нас в первую и главную очередь думать о тестируемом поведении. Вот наша тест-процедура:
- Перейти на домашнюю страницу DuckDuckGo.
- Ввести поисковый запрос.
- Убедиться, что
- Результаты появились на странице результатов.
- Поисковый запрос появился в строке поиска.
- Как минимум один результат поиска содержит поисковый запрос.
Это простенький тест, однако он полностью покрывает типичное поисковое поведение.
Код
Добавьте тест-функции в tests/test_web.py:
Функция test_basic_duckduckgo_search внедряет нашу тест-процедуру согласно паттерну "Подготовка-Действие-Проверка". Заметьте, что тест-функция объявляет параметр browser, имеющий имя, аналогичное фикстуре для настройки и очистки ChromeDriver. Pytest автоматически вызовет фикстуру и внедрит отсылку к WebDriver при каждом запуске этого теста. Затем тест-функция использует переменную browser для осуществления ряда вызовов WebDriver. Давайте посмотрим, как они работают.
Подготовка
Тест объявляет URL для домашней страницы DuckDuckGo как переменную для читабельности и поддерживаемости.
Это поисковый запрос, который будет использоваться в тесте. Так как тест покрывает "базовый" поиск, запрос не особенно важен. Тесты, проверяющие более сложное поведение, должны использовать более сложные запросы. Тест снова объявляет ее в начале тест-функции для читабельности и поддерживаемости.
Начальная точка для теста – это домашняя страница DuckDuckGo. Этот вызов открывает заданный URL в браузере. Имейте, однако, в виду – этот вызов не ждет загрузки страницы. Он просто инициирует взаимодействие загрузки.
Действие
Первый шаг в автоматизации веб-взаимодействий – это поиск целевого элемента (или элементов). Элементы могут как появляться на странице, так и не появляться. Автоматизация должна использовать локатор для поиска элемента, если он существует, а затем сконструировать объект, представляющий этот элемент. Существует множество типов локаторов – ID, имена классов, CSS-селекторы, XPath… Локаторы найдут все совпадающие элементы на странице – их может быть больше одного. Попробуйте использовать наиболее простой локатор, уникально идентифицирующий целевой элемент.
Для создания локаторов нужно увидеть HTML-структуру страницы. Chrome DevTools упрощает исследование разметки любых страниц. Просто кликните на странице правой кнопкой и выберите "Inspect". Вы увидите все элементы на вкладке "Elements". Для нашего теста нам нужно поле ввода поискового запроса на домашней странице DuckDuckGo. Этот элемент имеет атрибут id со значением “search_form_input_homepage”, как показано ниже:
Мы можем получить этот элемент, используя метод WebDriver find_element_by_id. Переменная search_input присваивается объекту, представляющему строку ввода запроса на странице. Помните, что так как ожидания у копии WebDriver неявные, он будет ожидать появления элемента ввода поискового запроса вплоть до десяти секунд.
Когда элемент у нас на руках, мы можем инициировать взаимодействия с ним. Метод send_keys отправляет последовательность нажатий клавиш элементу search input – как сделал бы реальный пользователь при помощи клавиатуры. Вызов выше посылает поисковый запрос. Ключ RETURN в конце запускает поиск.
Проверка (1)
assert len(link_divs) > 0
Тест должен убедиться, что результаты для поискового запроса действительно появились. Это утверждение проверяет, что на странице найдена хотя бы одна результирующая ссылка.
Проверка (2)
Мы проверили, что какие-то результаты появились, но надо еще и убедиться, что результаты соответствуют нашему поисковому запросу. Для выявления ссылок, содержащих в тексте наш запрос, можно использовать XPath. XPath сложнее имен и CSS-селекторов, но и мощность у них повыше. Наш XPath ищет любой div с ID "links", а затем – его потомков, содержащих поисковый запрос.
("f" в начале строки для вас в новинку? Это f-строка, она упрощает форматирование!)
Этот вызов находит все элементы, используя предварительно связанный XPath. Мы могли совместить эти две строки в одну, но разделение строк делает код более читабельным, и более "пайтоновским".
assert len(phrase_results) > 0
Как и предыдущее утверждение, это убеждается, что найден как минимум один элемент. Это простая проверка работоспособности. Ее можно сделать более надежной – например, убедиться, что все результаты на странице содержат поисковый запрос – но это будет сложным делом. Не каждый результат может содержать поисковый запрос в точности. К примеру, некоторые могут отличаться регистром. Локаторы и логика продвинутой верификации должны быть куда сложнее. Так как это базовый тест поиска, достаточно более простой проверки.
Проверка (3)
assert search_input.get_attribute('value') == PHRASE
Текст, введенный в элемент поля ввода, доступен как его атрибут “value”. Эта строчка убеждается, что атрибут “value” равен поисковому запросу. Она проверяет, что запрос не испарился.
Проверка и запуск веб-теста
Полный код for tests/test_web.py теперь должен выглядеть так (с комментариями для ясности):
Давайте запустим тест, чтобы убедиться, что он работает:
- $ pipenv run python -m pytest
- ============================= test session starts ==============================
- platform darwin -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.12.0
- rootdir: /Users/andylpk247/Programming/automation-panda/python-webui-testing
- collected 9 items
- tests/test_math.py . [ 88%]
- tests/test_web.py . [100%]
- =========================== 9 passed in 6.10 seconds ===========================
При запуске веб-теста откроется Google Chrome. Вы увидите, как он автоматически введет поисковый запрос, дождется страницы результатов, а затем закроет браузер. Легко и просто!
Если тест не запустился, проверьте:
- Есть ли на тест-машине установленный Chrome
- Есть ли ChromeDriver в системном пути
- Соответствует ли версия ChromeDriver версии Chrome
- Нет ли проблем с разрешениями доступа к файлам
- Не блокируются ли порты файерволом
- Верен ли код теста.
Как насчет улучшений?
Поздравляю с созданием вашего первого Web UI-теста! Это, безусловно, занимает больше времени, нежели юнит-тесты.
Несмотря на то, что тест успешно запускается, мы можем сделать кое-что еще, дабы улучшить код. В следующий раз мы проведем рефакторинг этого теста, используя паттерн Page Object.
Читайте также: