Автоматизация тестирования функций с помощью Selenium WebDriver
Опубликовано: 2022-03-10Эта статья предназначена для веб-разработчиков, которые хотят тратить меньше времени на тестирование внешнего интерфейса своих веб-приложений, но при этом хотят быть уверены, что каждая функция работает нормально. Это сэкономит ваше время, автоматизируя повторяющиеся онлайн-задачи с помощью Selenium WebDriver. Вы найдете пошаговый пример для автоматизации и тестирования функции входа в WordPress, но вы также можете адаптировать пример для любой другой формы входа.
Что такое селен и как он может вам помочь?
Selenium — это фреймворк для автоматизированного тестирования веб-приложений. Используя Selenium, вы можете автоматизировать каждую задачу в своем браузере, как если бы ее выполнял реальный человек. Интерфейс, используемый для отправки команд в разные браузеры, называется Selenium WebDriver. Реализации этого интерфейса доступны для всех основных браузеров, включая Mozilla Firefox, Google Chrome и Internet Explorer.
Автоматизация тестирования функций с помощью Selenium WebDriver
Какой тип веб-разработчика вы? Вы дисциплинированный тип, который тестирует все ключевые функции вашего веб-приложения после каждого развертывания. Если это так, вас, вероятно, раздражает, сколько времени занимает это повторяющееся тестирование. Или вы из тех, кто просто не беспокоится о тестировании ключевых функций и всегда думает: «Я должен тестировать больше, но лучше разрабатывать новые вещи». Если это так, вы, вероятно, обнаруживаете ошибки случайно или когда ваш клиент или начальник жалуются на них.
Я уже давно работаю в известном немецком онлайн-ритейлере и всегда относился ко второй категории: мне было так интересно придумывать новые функции для интернет-магазина, и мне совсем не нравилось по всем предыдущим функциям снова после каждого нового развертывания программного обеспечения. Таким образом, стратегия заключалась в том, чтобы надеяться, что все ключевые функции будут работать.
Однажды у нас произошло серьезное падение коэффициента конверсии, и мы начали копаться в наших инструментах веб-аналитики, чтобы найти источник этого падения. Прошло довольно много времени, прежде чем мы обнаружили, что наша касса не работает должным образом с момента предыдущего развертывания программного обеспечения.
Это был день, когда я начал проводить исследования по автоматизации процесса тестирования веб-приложений и наткнулся на Selenium и его WebDriver. Selenium — это, по сути, фреймворк, который позволяет автоматизировать веб-браузеры. WebDriver — это ключевой интерфейс, который позволяет отправлять команды во все основные браузеры (мобильные и десктопные) и работать с ними так, как это сделал бы настоящий пользователь.
Подготовка первого теста с Selenium WebDriver
Во-первых, я немного скептически отнесся к тому, подойдет ли Selenium для моих нужд, потому что этот фреймворк чаще всего используется в Java, а я, конечно, не являюсь экспертом по Java. Позже я узнал, что не обязательно быть экспертом по Java, чтобы воспользоваться преимуществами фреймворка Selenium.
В качестве простого первого теста я протестировал вход в один из моих проектов WordPress. Почему WordPress? Просто потому, что использование формы входа в WordPress — это пример, которому каждый может следовать легче, чем если бы я ссылался на какое-то пользовательское веб-приложение.
Что вам нужно, чтобы начать использовать Selenium WebDriver? Поскольку я решил использовать наиболее распространенную реализацию Selenium в Java, мне нужно было настроить свою маленькую среду Java.
Если вы хотите последовать моему примеру, вы можете использовать среду Java по вашему выбору. Если вы еще не настроили его, я предлагаю установить Eclipse и убедиться, что вы можете запустить простой скрипт «Hello world» на Java.
Поскольку я хотел проверить вход в Chrome, я убедился, что браузер Chrome уже установлен на моем компьютере. Это все, что я сделал при подготовке.
Загрузка ChromeDriver
Все основные браузеры предоставляют собственную реализацию интерфейса WebDriver. Поскольку я хотел протестировать вход в WordPress в Chrome, мне нужно было получить реализацию Chrome в WebDriver: ChromeDriver.
 Я распаковал ZIP-архив и сохранил исполняемый файл chromedriver.exe в месте, которое я мог запомнить на потом.
Настройка нашего проекта Selenium в Eclipse
Шаги, которые я предпринял в Eclipse, вероятно, будут довольно простыми для тех, кто много работает с Java и Eclipse. Но для таких, как я, кто не так знаком с этим, я пройдусь по отдельным шагам:
- Откройте затмение.
-  Щелкните значок «Новый».  Создание нового проекта в Eclipse 
-  Выберите мастер, чтобы создать новый «Проект Java», и нажмите «Далее».  Выберите мастер java-проекта. 
-  Дайте вашему проекту имя и нажмите «Готово».  Мастер проектов затмения 
-  Теперь вы должны увидеть свой новый Java-проект в левой части экрана.  Мы успешно создали проект для запуска Selenium WebDriver. 
Добавление библиотеки Selenium в наш проект
Теперь у нас есть Java-проект, но Selenium по-прежнему отсутствует. Итак, далее нам нужно добавить фреймворк Selenium в наш Java-проект. Вот шаги, которые я предпринял:
-  Загрузите последнюю версию библиотеки Java Selenium.  Загрузите библиотеку Selenium. 
- Распакуйте архив и сохраните папку в легко запоминающемся месте.
-  Вернитесь в Eclipse и перейдите в «Проект» → «Свойства».  Перейдите к свойствам, чтобы интегрировать Selenium WebDriver в свой проект. 
- В диалоговом окне перейдите к «Путь сборки Java», а затем к регистрации «Библиотеки».
-  Нажмите «Добавить внешние JAR».  Добавьте библиотеку Selenium в путь сборки Java. 
-  Перейдите в только что загруженную папку с библиотекой Selenium. Выделите все файлы .jarи нажмите «Открыть». Выберите все файлы библиотеки для добавления в ваш проект. 
-  Повторите это для всех файлов .jarв подпапкеlibs.
-  В итоге вы должны увидеть все файлы .jarв библиотеках вашего проекта: Фреймворк Selenium WebDriver теперь успешно интегрирован в ваш проект! 
Вот и все! Все, что мы сделали до сих пор, является одноразовой задачей. Теперь вы можете использовать этот проект для всех ваших различных тестов, и вам не нужно будет снова выполнять весь процесс настройки для каждого тестового примера. Вроде аккуратно, не правда ли?
Создание нашего тестового класса и открытие браузера Chrome
Теперь у нас есть проект Selenium, но что дальше? Чтобы увидеть, работает ли это вообще, я хотел попробовать что-то действительно простое, например, просто открыть браузер Chrome.
Для этого мне нужно было создать новый класс Java, из которого я мог бы выполнить свой первый тестовый пример. В этот исполняемый класс я скопировал несколько строк кода Java, и, хотите верьте, хотите нет, это сработало! Волшебным образом браузер Chrome открылся и через несколько секунд закрылся сам по себе.
Попробуй сам:
-  Нажмите кнопку «Создать» еще раз (пока вы находитесь в папке вашего нового проекта).  Создайте новый класс для запуска Selenium WebDriver. 
-  Выберите мастер «Класс» и нажмите «Далее».  Выберите мастер классов Java, чтобы создать новый класс. 
-  Назовите свой класс (например, «RunTest») и нажмите «Готово».  Мастер Java-класса eclipse. 
-  Замените весь код в новом классе следующим кодом. Единственное, что вам нужно изменить, это путь к chromedriver.exeна вашем компьютере:import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; /** * @author Nils Schuette via frontendtest.org */ public class RunTest { static WebDriver webDriver; /** * @param args * @throws InterruptedException */ public static void main(final String[] args) throws InterruptedException { // Telling the system where to find the chrome driver System.setProperty( "webdriver.chrome.driver", "C:/PATH/TO/chromedriver.exe"); // Open the Chrome browser webDriver = new ChromeDriver(); // Waiting a bit before closing Thread.sleep(7000); // Closing the browser and WebDriver webDriver.close(); webDriver.quit(); } }
-  Сохраните файл и нажмите кнопку воспроизведения, чтобы запустить код.  Запуск вашего первого проекта Selenium WebDriver. 
-  Если вы все сделали правильно, код должен открыть новый экземпляр браузера Chrome и вскоре после этого закрыть его.  Браузер Chrome открывается волшебным образом. (Большой превью) 
Тестирование входа администратора WordPress
Теперь я надеялся, что смогу автоматизировать свой первый небольшой тест функций. Я хотел, чтобы браузер перешел к одному из моих проектов WordPress, вошел в административную область и убедился, что вход прошел успешно. Итак, какие команды мне нужно было искать?

- Перейдите к форме входа,
- Найдите поля ввода,
- Введите имя пользователя и пароль в поля ввода,
- Нажмите кнопку входа,
- Сравните заголовок текущей страницы, чтобы увидеть, был ли вход успешным.
Опять же, после того, как я сделал все необходимые обновления своего кода и нажал кнопку запуска в Eclipse, мой браузер начал волшебным образом работать через вход в WordPress. Я успешно провел свой первый автоматизированный тест сайта!
Если вы хотите попробовать это сами, замените весь код вашего класса Java следующим. Позже я подробно рассмотрю код. Перед выполнением кода необходимо заменить четыре значения на свои:
- Расположение вашего файла - chromedriver.exe(как указано выше),
- URL-адрес учетной записи администратора WordPress, которую вы хотите протестировать, 
- Имя пользователя WordPress, 
- Пароль WordPress. 
 Затем сохраните и дайте ему запуститься снова. Он откроет Chrome, перейдет к логину вашего веб-сайта WordPress, войдет в систему и проверит, является ли заголовок h1 текущей страницы «Dashboard».
 import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; /** * @author Nils Schuette via frontendtest.org */ public class RunTest { static WebDriver webDriver; /** * @param args * @throws InterruptedException */ public static void main(final String[] args) throws InterruptedException { // Telling the system where to find the chrome driver System.setProperty( "webdriver.chrome.driver", "C:/PATH/TO/chromedriver.exe"); // Open the Chrome browser webDriver = new ChromeDriver(); // Maximize the browser window webDriver.manage().window().maximize(); if (testWordpresslogin()) { System.out.println("Test Wordpress Login: Passed"); } else { System.out.println("Test Wordpress Login: Failed"); } // Close the browser and WebDriver webDriver.close(); webDriver.quit(); } private static boolean testWordpresslogin() { try { // Open google.com webDriver.navigate().to("https://www.YOUR-SITE.org/wp-admin/"); // Type in the username webDriver.findElement(By.id("user_login")).sendKeys("YOUR_USERNAME"); // Type in the password webDriver.findElement(By.id("user_pass")).sendKeys("YOUR_PASSWORD"); // Click the Submit button webDriver.findElement(By.id("wp-submit")).click(); // Wait a little bit (7000 milliseconds) Thread.sleep(7000); // Check whether the h1 equals “Dashboard” if (webDriver.findElement(By.tagName("h1")).getText() .equals("Dashboard")) { return true; } else { return false; } // If anything goes wrong, return false. } catch (final Exception e) { System.out.println(e.getClass().toString()); return false; } } }Если вы все сделали правильно, ваш вывод в консоли Eclipse должен выглядеть примерно так:

Понимание кода
 Поскольку вы, вероятно, являетесь веб-разработчиком и имеете хотя бы базовое представление о других языках программирования, я уверен, что вы уже уловили основную идею кода: мы создали отдельный метод testWordpressLogin для конкретного тестового примера, который вызывается из наш основной метод.
В зависимости от того, возвращает ли метод значение true или false, вы получите вывод в консоли, сообщающий, прошел ли этот конкретный тест или нет.
Это не обязательно, но таким образом вы можете легко добавить еще много тестовых случаев в этот класс и по-прежнему иметь читаемый код.
Теперь, шаг за шагом, вот что происходит в нашей маленькой программе:
-  Во-первых, мы сообщаем нашей программе, где она может найти конкретный WebDriver для Chrome.System.setProperty("webdriver.chrome.driver","C:/PATH/TO/chromedriver.exe");
-  Открываем браузер Chrome и разворачиваем окно браузера.webDriver = new ChromeDriver(); webDriver.manage().window().maximize();
-  Здесь мы переходим к нашему подметоду и проверяем, возвращает ли он true или false.if (testWordpresslogin()) …
-  Следующая часть нашего подметода может быть не интуитивно понятной:
 Блокиtry{…}catch{…}. Если все пойдет так, как ожидалось, будет выполнен только код вtry{…}, но если что-то пойдет не так во время выполненияtry{…}, тогда выполнение продолжится вcatch{}. Всякий раз, когда вы пытаетесь найти элемент с помощьюfindElementа браузер не может найти этот элемент, он генерирует исключение и выполняет код вcatch{…}. В моем примере тест будет помечен как «проваленный» всякий раз, когда что-то пойдет не так и будет выполненcatch{}.
-  В подметоде мы начинаем с перехода в нашу административную область WordPress и поиска полей для имени пользователя и пароля, ища их идентификаторы. Кроме того, мы вводим данные значения в эти поля.webDriver.navigate().to("https://www.YOUR-SITE.org/wp-admin/"); webDriver.findElement(By.id("user_login")).sendKeys("YOUR_USERNAME"); webDriver.findElement(By.id("user_pass")).sendKeys("YOUR_PASSWORD"); Selenium заполняет нашу форму входа 
-  После заполнения формы входа мы находим кнопку отправки по ее идентификатору и нажимаем ее.webDriver.findElement(By.id("wp-submit")).click();
-  Чтобы визуально следить за тестом, я включаю здесь 7-секундную паузу (7000 миллисекунд = 7 секунд).Thread.sleep(7000);
-  Если вход в систему выполнен успешно, заголовок h1текущей страницы теперь должен быть «Панель инструментов», ссылаясь на область администрирования WordPress. Поскольку заголовокh1должен существовать только один раз на каждой странице, я использовал здесь имя тега, чтобы найти элемент. В большинстве других случаев имя тега не является хорошим локатором, потому что имя тега HTML редко бывает уникальным на веб-странице. Найдяh1, мы извлекаем текст элемента с помощьюgetText()и проверяем, равен ли он строке «Dashboard». Если вход не будет успешным, мы не найдем «Dashboard» в качестве текущегоh1. Поэтому я решил использоватьh1, чтобы проверить, успешен ли вход в систему.if (webDriver.findElement(By.tagName("h1")).getText().equals("Dashboard")) { return true; } else { return false; } Пусть WebDriver проверит, прибыли ли мы на Dashboard: тест пройден! (Большой превью) 
-  Если бы что-то пошло не так в предыдущей части подметода, программа сразу бы перешла к следующей части. Блок catchнапечатает тип исключения, которое произошло с консолью, а затем вернетfalseосновному методу.catch (final Exception e) { System.out.println(e.getClass().toString()); return false; }
Адаптация тестового примера
 Здесь становится интересно, если вы хотите адаптировать и добавить свои собственные тестовые случаи. Как видите, мы всегда вызываем методы объекта webDriver , чтобы что-то сделать с браузером Chrome.
Во-первых, мы максимизируем окно:
 webDriver.manage().window().maximize();Затем в отдельном методе мы переходим в нашу административную область WordPress:
 webDriver.navigate().to("https://www.YOUR-SITE.org/wp-admin/"); Есть и другие методы объекта webDriver , которые мы можем использовать. Помимо двух вышеперечисленных, вы, вероятно, будете часто использовать этот:
 webDriver.findElement(By. …) Метод findElement помогает нам находить различные элементы в DOM. Существуют различные варианты поиска элементов:
-  By.id
-  By.cssSelector
-  By.className
-  By.linkText
-  By.name
-  By.xpath
 Если возможно, я рекомендую использовать By.id потому что идентификатор элемента всегда должен быть уникальным (в отличие, например, от className ), и обычно он не зависит от изменения структуры вашего DOM (в отличие, скажем, от xPath ). .
Примечание . Подробнее о различных вариантах поиска элементов с помощью WebDriver можно прочитать здесь.
 Как только вы получаете элемент с помощью метода findElement , вы можете вызывать различные доступные методы элемента. Наиболее распространенными являются sendKeys , click и getText .
 Мы используем sendKeys для заполнения формы входа:
 webDriver.findElement(By.id("user_login")).sendKeys("YOUR_USERNAME"); Мы использовали click для отправки формы входа, нажав кнопку отправки:
 webDriver.findElement(By.id("wp-submit")).click(); И getText использовался для проверки того, какой текст находится в h1 после нажатия кнопки отправки:
 webDriver.findElement(By.tagName("h1")).getText()Примечание . Обязательно ознакомьтесь со всеми доступными методами, которые можно использовать с элементом.
Заключение
С тех пор, как я открыл для себя возможности Selenium WebDriver, моя жизнь как веб-разработчика изменилась. Я просто люблю это. Чем глубже я погружаюсь в фреймворк, тем больше возможностей открываю — запускаю один тест одновременно в Chrome, Internet Explorer и Firefox или даже на смартфоне, или автоматически делаю скриншоты разных страниц и сравниваю их. Сегодня я использую Selenium WebDriver не только для целей тестирования, но и для автоматизации повторяющихся задач в Интернете. Всякий раз, когда я вижу возможность автоматизировать свою работу в Интернете, я просто копирую свой первоначальный проект WebDriver и адаптирую его к следующей задаче.
Если вы считаете, что Selenium WebDriver для вас, я рекомендую ознакомиться с документацией по Selenium, чтобы узнать обо всех возможностях Selenium (таких как одновременный запуск задач на нескольких (мобильных) устройствах с помощью Selenium Grid).
Я с нетерпением жду ответа, найдете ли вы WebDriver столь же полезным, как и я!
