t.me/atinfo_chat Telegram группа по автоматизации тестирования

Пишем тесты на Selenium IDE


(Mykhailo Poliarush) #1

Selenium IDE – расширение к браузеру FireFox, которое позволяет записывать, редактировать, отлаживать и выполнять тесты. Представляет собой простейший инструмент записи/воспроизведения авто тестов и отлично подходит для внедрения “легкой? автоматизации. Selenium IDE входит в семейство инструментов автоматизации Selenium. В основе Selenium лежит среда Selenium Core, разработанная на языке JavaScript. Данная среда дает возможность производить манипуляции над браузером и вызывать различные (поддерживаемые браузером) команды для выполнения определенных действий и проверок. Иными словами, можно сказать, что команды, полученные от сценариев теста, выполняются непосредственно средствами браузера.

Данный инструмент распространяется бесплатно, скачать его можно отсюда. Устанавливается данное “чудо” как обычное дополнение к браузеру FireFox, никаких проблем при установке возникнуть не должно. После установки открываем в меню браузера “Tools/Selenium IDE”, после чего откроется окно программы. Вот, собственно говоря, и оно:

Меню программы не должно создать особых проблем при его изучении. Круглая красная кнопка в правом верхнем углу отвечает за начало/конец записи теста. После включения записи все ваши действия в браузере будут записываться. Рекомендую потренировать на каком-нибудь простом сайтике и разобраться в работе команд Selenium IDE. Для воспроизведения тестов нужно нажать на кнопку “Run current test case”, остановить тест можно нажав на кнопку “Pause”. Кнопка “Step” позволяет поочередно выполнять все действия теста, очень удобно при отладке теста. Ползунок “Fast/Slow” в левом углу программы позволяет регулировать скорость выполнения теста.

Заходим в меню “Options” программы, на вкладке “General” можно указать следующие настройки:

  • Encoding of test files – формат кодирования тестов;

  • Default timeout value of recorded command – задержка при поиске элементов на странице;

  • Selenium Core extensions / Selenium IDE extinsions – можно указать пользовательские библиотеки, расширяющие возможности стандартных команд Selenium IDE;

  • Remember base Url – запоминать “базовый? адрес страницы при записи тестов;

  • Record assertTitle automation – при записи тестов автоматически добавлять проверку assertTitle для страницы;

  • Record absolute URL – записывать полный адрес станицы при записи теста;

  • Activate developer tools – позволяет перезагрузить пользовательские расширения;

  • Start recoding immediately on open – при активации данной опции Selenium IDE сразу при открытии будет начинать записывать тесты.

Во вкладке “Formats” можно указать формат записи тестов + дополнительные настройки. Вкладка “Plugins” служит для подключения плагинов для расширения возможностей Selenium IDE.

После записи тестов их можно редактировать в окне программы. Также, при написании тестов можно использовать команды из контекстного меню, что значительно ускоряет процесс создания тестов. Например, вы можете выбрать любой элемент страницы, вызвать для него контекстное меню и выбрать доступную команду для данного элемента. Данное действие запишется в тест и затем будет доступно для редактирования.

Selenium IDE позволяет формировать наборы тестовых комплектов (Test Suite) – это группа тестовых скриптов, объединенных по некоторому принципу, и предназначенных для проверки определенной части программы. Для создания Test Suite нужно записать несколько тестов, затем в меню программы выбрать “File/New Test Suite” и добавить существующее тесты в Test Suite с помощью команды “Add Test Case” или записать новые тесты (“New Test Case”).

Selenium IDE, безусловно, хороший инструмент записи/воспроизведения тестов, однако особо гибких и умных тестов с помощью его написать невозможно, так как данный инструмент не поддерживает логические условия, циклы и т.п., что ограничивает его применимость линейными тестами. Для более серьезной автоматизации можно использовать другой инструмент данного семейства – Selenium RC, а IDE будет служить вам хорошим помощником при работе с RC.

Selenium IDE выгодно использовать на небольших или средних проектах, с фиксированным бюджетом, которые не предусматривают комплексную автоматизацию. Selenium IDE позволит автоматизировать рутинные операции по проверке функциональных и/или приемочных требований с минимальными затратами на внедрение и использование. Также Selenium IDE может служить отличным инструментом для обучения основам автоматизации.

Подробный мануал по Selenium IDE от разработчиков инструмента: Selenium IDE

Вспоминаем команды, описанные сдесь. Шаги нашего первого теста

  1. Открыть страницу http://bugscatcher.net;
  2. Проверить страницу на наличие текста “Bugs Catcher”;
  3. Нажать по ссылке “Bugs Catcher”;
  4. Проверить наличие элемента на странице для ввода текста поиска;
  5. Произвести поиск по тексту “Пишем тесты на Selenium IDE”;
  6. Проверить наличие ссылки на станице “Пишем тесты на Selenium IDE”.

Автоматизируем данный тест с помощью IDE:

  1. Открываем Selenium IDE (“FireFox/Tools/Selenium IDE”);
  2. Меняем формат записи на HTML. Для этого открываем в IDE “Options/Format” и активируем опцию HTML;
  3. Собственно начнем автоматизировать тест. Тут у нас есть несколько вариантов:
    1. Активировать запись теста. В данном случае все пользовательские действия в браузере будут записаны, затем их можно будет отредактировать. Для старта теста нужно нажат на кнопку “Record”;
    2. Будем писать тест “руками”, т.е. заносить все команды сами.

      Естественно более удобно использовать первый вариант записи тестов – быстро записать основные действия, а затем только “допилить” тест, добавив проверки и дополнительные шаги. В данном случае будем использовать второй вариант, чтобы лучше разобраться с командами Selenium;
  4. IDE предоставляет два вида отображения написанных команд: Table и Source. Удобнее разрабатывать тесты в виде Table, поэтому активируем данный вид отображения, нажав на вкладку Table, которая находится под зелеными кнопками запуска теста;
  5. Пробуем добавить новую команду. Нужно выбрать в контекстном меню команду Insert new command;
    Выбрать команду в контекстном меню 'Insert New Command'
  6. Выбрать первую строку в таблице для занесения команды;
  7. Добавляем команду open. Для этого в поле Command (под таблицей команд) выбираем из раскрывающего списка данную команду. В поле Target вводим адрес страницы, которую нужно открыть. Привожу код автотеста (данный пример приводится с использованием синтаксиса Java, для удобства отображения кода. Однако, данный код переносится и на HTML):

{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }selenium.open("http://bugscatcher.net"); //открытие страницы selenium.waitForPageToLoad("60000"); //ждем загрузки страницы assertTrue(selenium.isTextPresent("Bugs Catcher")); //проверяем наличие текстового элемента "Bugs Catcher" на странице selenium.click("link=Bugs Catcher"); //нажимаем на ссылку "Bugs Catcher" selenium.waitForPageToLoad("60000"); //ждем загрузки страницы assertTrue(selenium.isElementPresent("s")); //проверяем, присутствует ли на станице элемент ввода текста для поиска selenium.type("s", "Пишем тесты на Selenium IDE"); //вводим в текстовое поле значение "Пишем тесты на Selenium IDE" selenium.click("searchsubmit");</code> //нажимаем на кнопку поиска (лупа) selenium.waitForPageToLoad("30000"); //ждем загрузки страницы assertTrue(selenium.isElementPresent("link=Пишем тесты на Selenium IDE")); //проверяем, есть ли на странице результатов ссылка "Пишем тесты на IDE"{/syntaxhighlighter}

Не забывая про синтаксис команд записываем тест в IDE.

Примечание 1. В поле Command работает фильтр по названию команды, т.е. можно вводить имя команды, и вам будут выводится команды начинающиеся на введенное значение. Это значительно ускоряет поиск команд.

Примечание 2. Справа от поля Target есть кнопка Find – с помощью данной кнопки можно проверять локаторы при написании тестов (находит ли Selenium указанный локатор). При нажатии на нее, если элемент на странице найден, – он будет выделятся зеленым цветом, если не найден – то в логе увидите ошибку. Помните, что данная кнопка ищет только локаторы.

Примечание 3. Для того, что бы узнать работает ли команда, не обязательно запускать тест полностью, достаточно дважды нажать на имя команды в таблице – выполнится только указанная команда.

Примечание 4. При написании тестов можно использовать команды из контекстного меню браузера на проверяемой странице, что значительно ускоряет процесс создания тестов. Например, вы можете выбрать любой элемент страницы, вызвать для него контекстное меню и выбрать доступную команду для данного элемента. Данное действие запишется в тест и затем будет доступно для редактирования.

Команды Selenium в контекстном меню браузера

Примечание 5. В Log хранятся данные о запуске теста (логирование).

Примечание 6. В Reference предоставляется справочная информация о вызываемой команде.

Примечание 7. Можно устанавливать для команд breakpoint. Смотреть в контекстном меню IDE для выбранной команды (см. изображение – Выбрать команду в контекстном меню ‘Insert New Command’).

Примечание 8. При написании тестов не забываем вставлять комментарии. Для этого в IDE вызываем контекстное меню и выбираем Insert New Comment (см. изображение – Выбрать команду в контекстном меню ‘Insert New Command’).

Сверяем полученные результаты с данным экраном:

Selenium IDE

Два самых распростроненных типа ошибок в “Selenium IDE”:

  • [error] Unknown command: ‘Имя команды’ – в данном случае имя команды введено неверно;
  • [error] locator not found: – в данном случае команда используется верно, но требуемый локатор не был найден.

Проверка страниц на Selenium IDE

Обязательные проверки, которые должны использоваться при написании автотеста, – это проверки страниц. Что нужно проверять:

  • проверяем страницу на наличие ошибок (Server error-ы, внутренний обработчик ошибок в приложении и т.д.) – данные проверки дают нам знать, что на проверяемой странице нет серверных ошибок и страница доступна для тестирования. Если ошибки есть, то тест нужно прерывать;
  • проверка свойств страницы (title, address и другие) – сверяем текущие значения свойств страницы с ожидаемыми. Проверяем, что открылась требуемая нам страница. В принципе, достаточно проверять только title страницы;
  • проверка элементов страницы (можно разделить на элементы управления и текстовые элементы) – нужно проверить, что страница загрузилась корректно и содержит все необходимые элементы управления. Ведь, если страница загружается без требуемых для проведения теста элементов – тест нужно прерывать. Рекомендую перед проверкой элемента вставлять команду waitForElementPresent(locator), чтобы гарантировать загрузку элемента.

Отмечу, что проверки необходимо выполнять не только после открытия страницы, но и после функциональных действий на странице. Например, нам нужно написать тест “создание пользователя”. Шаги теста будут примерно такие:

  • открыть страницу создания нового пользователя;
  • проверит страницу на наличие ошибок (все виды проверок);
  • заполнить требуемые поля, нажать кнопку “Сохранить”;
  • после сохранения опять проверить страницу на появление различного рода ошибок;
  • проверить, что пользователь сохранился.

Команды Selenium IDE, которые необходимо использовать для реализации данных проверок:

  • verifyLocation / assertLocation – проверить адрес текущей страницы. Синтаксис команды – verifyLocation(URL);
  • verifyTitle / assertTitle – проверить значение Title страницы. Синтаксис команды – verifyTitle (Title);
  • verifyTextPresent / assertTextPresent – проверить, что страница содержит указанный в команде текст. Синтаксис команды – verifyTextPresent (value);
  • verifyElementPresent / assertElementPresent – проверить, есть ли на странице указанный элемент. Синтаксис команды – verifyElementPresent (locator).

Проверки в автотестах нужно продумывать очень тщательно. Ведь автоматизированный тест должен качественно и в полном объеме проверять функциональность, покрываемую тестом, иначе смысла в таких тестах нет. Нужно стараться оптимизировать проверки (выносить их в отдельные классы, избегать “лишних поверок”), чтобы тесты не были слишком громоздкими.

В качестве примера, усовершенствуем тест, рассмотренный в данной заметке.

Добавим в тест следующие проверки:

  • assertTitle – и после открытия страницы, и после поиска;
  • assertLocation– после открытия страницы
  • проверим, что на странице, после открытия и поиска, присутствуют элементы (ссылки): “Home”, “About”, “Предыдущие записи”, “Наверх”;
  • проверим, что на странице, после открытия и поиска, присутствуют текстовые элементы страницы “Последние сообщения”, “Рубрики”, “Архивы”;
  • перед нажатием на элементы управления и проверкой наличия элемента на странице вставим команду: waitForElementPresent(locator) – “ждалка” появления UI элемента на странице. Есть еще команда waitForTextPresent(pattern) – ждем появления заданного текста на странице, попробуйте сами применить ее в тесте;
  • проверим, что сообщение “К сожалению, по Вашему запросу ничего не найдено.” не появилось на странице, после поиска.

Привожу код обновленного автотеста (данный пример приводится с использованием синтаксиса Java, для удобства отображения кода. Однако, данный код переносится и на HTML):

{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }selenium.open("http://bugscatcher.net"); //открытие страницы selenium.waitForPageToLoad("60000");</code> //ждем загрузки страницы assertEquals("Bugs Catcher", selenium.getTitle()); //проверяем Title страницы assertEquals("http://bugscatcher.net", selenium.getLocation()); //проверяем Location страницы assertTrue(selenium.isTextPresent("Bugs Catcher")); //проверяем наличие текстового элемента "Bugs Catcher" на странице assertTrue(selenium.isTextPresent("Последние сообщения")); assertTrue(selenium.isTextPresent("Рубрики")); assertTrue(selenium.isTextPresent("Архивы")); assertTrue(selenium.isElementPresent("link=Home")); assertTrue(selenium.isElementPresent("link=About")); assertTrue(selenium.isElementPresent("link=Наверх")); // Ждалка элемента for (int second = 0;; second++) { if (second >= 60) fail("timeout"); try { if (selenium.isElementPresent("link=Bugs Catcher")) break; } catch (Exception e) {} Thread.sleep(1000); } selenium.click("link=Bugs Catcher"); //нажимаем на ссылку "Bugs Catcher"selenium.waitForPageToLoad("60000"); //ждем загрузки страницы assertEquals("Bugs Catcher", selenium.getTitle()); //проверяем Title страницы assertEquals("http://bugscatcher.net", selenium.getLocation()); //проверяем Location страницы assertTrue(selenium.isTextPresent("Bugs Catcher")); //проверяем наличие текстового элемента "Bugs Catcher" на странице assertTrue(selenium.isTextPresent("Последние сообщения")); assertTrue(selenium.isTextPresent("Рубрики")); assertTrue(selenium.isTextPresent("Архивы")); assertTrue(selenium.isElementPresent("link=Home")); assertTrue(selenium.isElementPresent("link=About")); assertTrue(selenium.isElementPresent("link=Предыдущие записи »")); assertTrue(selenium.isElementPresent("link=Наверх")); // Ждалка элемента строки-поиска or (int second = 0;; second++) { if (second >= 60) fail("timeout"); try { if (selenium.isElementPresent("s")) break; } catch (Exception e) {} Thread.sleep(1000); } assertTrue(selenium.isElementPresent("s")); //проверяем, присутствует ли на станице элемент ввода текста для поиска selenium.type("s", "Пишем тесты на Selenium IDE"); //вводим в текстовое поле значение "Пишем тесты на Selenium IDE" // Ждалка кнопки "поиск" for (int second = 0;; second++) { if (second >= 60) fail("timeout"); try { if (selenium.isElementPresent("searchsubmit")) break; } catch (Exception e) {} Thread.sleep(1000); } selenium.click("searchsubmit"); //нажимаем на кнопку поиска (лупа) selenium.waitForPageToLoad("30000"); //ждем загрузки страницы assertEquals("Search Results Пишем тесты на Selenium IDE -Bugs Catcher", selenium.getTitle()); assertTrue(selenium.isElementPresent("link=Пишем тесты на Selenium IDE")); //проверяем, есть ли на странице результатов ссылка "Пишем тесты на IDE" assertTrue(selenium.isTextPresent("Bugs Catcher")); //проверяем наличие текстового элемента "Bugs Catcher" на странице assertTrue(selenium.isTextPresent("Последние сообщения")); assertTrue(selenium.isTextPresent("Рубрики")); assertTrue(selenium.isTextPresent("Архивы")); assertTrue(selenium.isElementPresent("link=Home")); assertTrue(selenium.isElementPresent("link=About")); assertTrue(selenium.isElementPresent("link=Предыдущие записи »")); assertTrue(selenium.isElementPresent("link=Наверх")); assertFalse(selenium.isTextPresent("К сожалению, по Вашему запросу ничего не найдено."));{/syntaxhighlighter}

По умолчанию Selenium IDE предоставляет возможность использовать только линейные последовательности команд. Это приводит к ряду не удобств, главное из которых – рост количества строк кода, что в дальнейшем снижает читаемость и сопровождаемость тестов. К счастью, добрыми людьми было разработано специальное расширение к Selenium IDE, которое позволяет использовать в тестах циклы, условия и переходы.

Расширение носит название FlowControl. Данное расширение помогает реализовывать в Selenium IDE практически полноценные тестовые сценарии с использованием циклов, операторов условий и переходов. Команды, доступные в расширении FlowControl значительно помогают при реализации ряда задач, а также способствую снижению количества строк кода, повышают читаемость и сопровождаемость тестовых сценариев. Скачать расширение и получить более детальную информацию о нем можно по этой ссылке.

Список команд, которые будут вам доступны при написании тестов на Selenium IDE, при использовании расширения FlowControl:

  • label – метка;
  • goto – переход;
  • gotoAndWait – переход и ожидание;
  • gotoIf – перейти к метке, если выполняется определенное условие;
  • gotoIfAndWait – перейти к метке, если выполняется определенное условие и ожидать события;
  • gotolabel – переход на метку;
  • gotolabelAndWait – переход на метку и ожидание события;
  • while – цикл while (пока выполняется условие);
  • whileAndWait – цикл while (пока выполняется условие) и ожидание событие;
  • endWhile команда выхода из цикла по достижению требуемого условия;
  • endWhileAndWait – команда выхода из цикла по достижению требуемого условия и ожидание наступления события.

Однозначно, с помощью расширения FlowControl ваши тесты на Selenium IDE станут более мощными и удобными в сопровождении.

     Удачи в освоении Selenium IDE!