Перед командой Смарт Гамма была поставлена задача создать на нашем сайте функционал для сортировки записей методом перетаскивания.
Задача
Но нам нужно не только создать реализацию, но и создать функциональный тест с помощью Behat.
Реализация довольно проста и выглядит так:
поэтому у нас есть 4 элемента, и после того, как последняя строка будет перемещена на 1-ю, мы вызовем запрос AJAX и обновим бэкэнд.
Мы решили использовать плагин jquery Sortable https://jqueryui.com/sortable.
У него есть событие «обновление», которое мы можем использовать для AJAX-вызова бэкенду. Готово!
Проблема
Теперь мы переходим к задаче покрыть нашу реализацию функциональным тестом пользовательского интерфейса. Smart Gamma обычно использует структуру Behat BDD с комбинацией различных веб-драйверов.
«Гугление» дает мало информации о конкретных решениях.
Первое предлагаемое решение — использовать функцию «DragTo» драйвера Selenium.
Нравится:
$this-›getSession()-›getDriver()-›dragTo(‘li:eq(‘.$element.’)’, ‘ul#’.$block);
но в нашем случае мы не смогли поднять его. Функция «DragTo» не смогла найти наш перетаскиваемый элемент и выдала следующую ошибку:
When I drag li "1" in ul block with id "sortQueue" to top # CoreFeatureContext::iDragLiToTop() The given selector li:eq(1) is either invalid or does not result in a WebElement. The following error occurred: InvalidSelectorError: Unable to locate an element with the xpath expression li:eq(1) because of the following error: NamespaceError: An attempt was made to create or change an object in a way which is incorrect with regard to namespaces For documentation on this error, please visit: http://seleniumhq.org/exceptions/invalid_selector_exception.html Build info: version: '2.53.1', revision: 'a36b8b1', time: '2016-06-30 17:37:03' System info: host: 'jekccs-ubuntu', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-55-generic', java.version: '1.7.0_65' Driver info: driver.version: unknown (WebDriver\Exception\InvalidSelector)
Второе предложенное решение было найдено в блоге Джоэри Тиммерманса «Тестирование перетаскивания с помощью Behat and Guzzle»
Идея проста:
1. Вызовите URL-адрес перемещения с правильными данными
2. Отправьте запрос
3. Подтвердите успешность запроса
4. Обновите браузер, так как вы хотите просмотреть свой ход
Как видите, у него есть хитрость: мы фактически пропустили часть пользовательского интерфейса, где выполняется реальное взаимодействие с перетаскиваемым элементом. Но в нашем тесте пользовательского интерфейса мы не хотели пропускать реальные сортируемые действия.
Умное гамма-решение
Итак, мы реализовали выполнение реального кода javascript с помощью функции evaluateScript Behat/Mink как:
/** * @When I drag li :element in ul block with id :block to top */ public function iDragLiToTop($element, $block) { $this->getSession()->evaluateScript('$(document).ready(function(){ $("ul#'.$block.'").prepend($("ul#'.$block.' li:eq('.$element.')")); $("ul#'.$block.'").sortable("option", "update")();})' ); }
1. изменить положение элементов
2. вручную вызвать событие плагина «обновить»
Feature: In order to sort element As user I should be able drag and drop elements @javascript Scenario: I drag list Given I am logged as user with login “[email protected]” and password “[email protected]” Given I go to "/media/list" When I drag element with “http://test.com/torrent-3” to top position Then torrent “http://test.com/torrent-3” should be on position “1”
Первоначально опубликовано на www.smart-gamma.com