Home > JavaScript > Давай зациклимся!

Давай зациклимся!

В рамках одного тест-кейса Selenium IDE можно безостановочно повторять ряд шагов до достижения определенного результата:

Добавить в форум десять реплик.

Добавить в корзину двадцать пять товаров.

Удалять из каталога товары до тех пор, пока их не останется сто восемьдесят два.

Код сокращается, а это уже хорошо.

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

Ситуация вкратце описана на wiki.openqa.org (прокрутить до заголовка “Selenium IDE FlowControl”).

.

Не паримся

.

https://addons.mozilla.org/en-US/firefox/addon/flow-control/

  1. Установить.
  2. Юзаем.

.

Делаем “своими руками” – Добавить в Selenium IDE расширение .js

.

Файл с расширением функциональности называется goto_sel_ide.js. Его нужно скачать на жесткий диск, да.

Этот же файл, но переименованный, лежит и у меня – function-while.js (если скачал отсюда – смени расширение на ‘js’).

Открыть Selenium IDE > Options > General > Selenium Core extensions (user-extensions.js) > Browse – и указать местоположение файла на диске. ОК.

selenium IDE core extentions

Для справки: если еще раз нажать Browse и выбрать новый файл, то старый никуда из строки не исчезнет, и будет загружаться при всех последующих запусках.

Если добавить еще один файл, то в указанной строке эти два файла будут разделены запятой с пробелом. Можно добавлять еще много файлов.

А можно и редактировать только один.

.

Перезагрузить Selenium IDE

.

Полностью – выключить и запустить заново.

Под Ubuntu проблем не возникло.

Траблы случились в Windows XP: файл то не подхватывался (сразу при загрузке Selenium выдавал сообщение о том, что первые строки файла содержат ошибку), то всё молча открывалось, но при работе скрипта Selenium выпадал в астрал…

Проблему решал всякими неочевидными способами (слепо и злобно тыкаясь), но в итоге нашел такое решение: переименовал файл из goto_sel_ide.js в goto-sel-ide.js. И все, почему-то, решилось 😦

.

Найти в общем списке новые команды

.

Появляются команды while, whileAndWait, endWhile, endWhileAndWait, label, labelAndWait. Справочной информацией они не снабжены, бо тру-программисты в ней не нуждаются.

Будем использовать while и endWhile.

.

Заюзать в контексте тестирования

.

whileExampleAtForum

Открываем страницу на форуме
open http://test2.url.com/forum/health/allergies/
storeExpression Allergies – The Forum forumTitle
Сохраняем в переменную количество постов на странице (сейчас их у меня два)
storeText //div[@class=’total_posts’]/strong totalPosts
echo ${totalPosts}
Указываем условие для запуска цикла – повторять до тех пор, пока на странице не появится не меньше семнадцати записей
while storedVars[‘totalPosts’] <= 17
Нажимаем на первую попавшуюся кнопку Reply
click //span[@class=’reply_btn ul_comm_button’] Reply
waitForElementPresent //input[@type=’image’ and @src=’/Images/Discussions/green_post_btn.png’ and @name=’btnPost’]
Увеличиваем цифру в переменной на одну единицу
storeEval ${totalPosts}+1 totalPosts
заполняем поле обычным текстом плюс добавим указание номера записи (для ориентировки)
type //textarea[@name=’Post’ and @class=’message-box’] Inserted reply #${totalPosts}
clickAndWait btnPost
assertTitle ${forumTitle}
проверяем обновленное количество постов на странице
assertText //div[@class=’total_posts’] Total posts: ${totalPosts}
выход из цикла по достижению условия
endWhile
Выводим сообщение о том, что кейс завершен
getEval alert(‘Done = 18 replies’)

Вот и все дела.

Хитрая хитрость

Убийственно простой, бесконечный цикл можно организовать и так: перед цепочкой команд, которые должны выполняться циклично, следует указать особенный ярлык

Вписываем ярлык начала действия
label startHere

А после всех хитрых телодвижений, в конце выполнения всех шагов, следует указать команду перехода к ярлыку ‘startHere’.

gotolabel startHere

И Selenium послушно перейдет в начало, и начнёт заново выполнять все то, что он только что сделал, и остановить его сможет только насильственная смерть или ошибки при исполнении основных шагов. Например, приложение сдохло, или какой-то локатор показывает не то, что должен был.

Добавляем определенное количество релизов в проекте в Mantis

Надо пояснить:

  • у нас в названии каждого релиза есть слово “Update”. Так уже повелось.
  • сперва указываю номер релиза, который я хочу создать. Например, №151.
  • затем увеличиваю эту цифру на единицу до тех пор, пока цифра не достигнет определенного значения.
  • в итоге я хочу увидеть список из релизов до релиза №170. Поэтому в качестве условия завершения цикла я укажу цифру “169”. На последнем рывке Selenium создаст запись про релиз №170.
  • поскольку я проигрываю этот скрипт на высокой скорости, клик по линку “Proceed” является обоснованным (это понятно каждому, кто работал с Mantis).
Укажи исходную версию релиза
storeExpression 151 updateNumber
storeExpression MantisBT mantisMainTitle
storeExpression STSm – MantisBT projectTitle
добавляем версию с номером из переменной
type version Update ${updateNumber}
clickAndWait add_version
verifyTitle ${mantisMainTitle}
clickAndWait link=Proceed
verifyTitle ${projectTitle}
Указываем условие окончания цикла
while storedVars[‘updateNumber’] <= 169
плюсуем цифру версии из переменной
storeEval javascript:{parseInt(storedVars[‘updateNumber’]) + 1} updateNumber
type version Update ${updateNumber}
clickAndWait add_version
verifyTitle ${mantisMainTitle}
clickAndWait link=Proceed
verifyTitle ${projectTitle}
endWhile
Выводим сообщение о готовности
getEval alert(‘Done!’)
  1. 14 July 2014 at 14:36

    Так и не пересеклись мы. И всё же, буду очень признательна, если сможете дать пару советов, как можно с этим справиться, потому как я в полной расстерянности!

  2. Filosf333
    5 December 2015 at 13:37

    Я насчет “хитрой хитрости” в статье.
    У меня есть код:

    typeKeys ui=MainPage::Familia() a
    gotolabel StartHere
    typeKeys ui=MainPage::Imia() b
    gotolabel StartHere
    typeKeys ui=MainPage::Otchestvo() c
    gotolabel StartHere
    label StartHere
    verifyElementNotPresent css=b
    clickAndWait ui=MainPage::Registracia()

    После того, как в коде 1 раз встречается переход по метке, выполнение переходит на 3 последние строчки и остальная часть кода не выполняется. Т. е осуществляется проверка только для (ui=MainPage::Familia() a) и на этом все заканчивается. Как исправить проблему?

    • 6 December 2015 at 15:05

      Команда gotolabel > StartHere означает “С этого места перескочи туда, где написано label > StartHere. Что робот послушно и делает…

  3. 23 April 2016 at 19:14

    Алексей подскажите пожалуйста решение моей задачи. Мне необходимо “собрать” логины и пароли (сейчас я сохраняю текст в переменные и формирую два массива) а затем на другом url осуществлять поочередно вход в аккаунты и собирая определенную информацию – “дописывать” ее к парам логин-пароль (сейчас это еще один массив). Моя проблема заключается в том , что я хотела бы иметь многомерный массив, возможно ли это реализовать?

  4. Lykonya
    3 February 2017 at 11:32

    Доброго времени суток. Столкнулась с такой проблемой: при запуске тест-сьюта (который без ошибок работает в selenium IDE) через командную строку используя браузер IE (с помощью selenium-server-standalone-2.50.1) никак не удается подключить внешний .js файл. В отчете появляется ошибка “error: Unknown command: ‘while’ “. Пробовала прописать скрипт непосредственно в выполняемый файл, но все безрезультатно. Может быть Вы сможете помочь?

  5. 3 October 2017 at 16:56

    Подскажите(желательно примером) в такой ситуации: Есть таблица, с каждым запуском кейса в эту таблицу добавляется запись. Как можно определять последнюю добавленную запись в таблицу? (таблица без сортировок и т.п)

    • 3 October 2017 at 18:11

      Что вы уже попробовали сделать?

      • 4 October 2017 at 08:25

        Пока ничего. Я не знаю как это сделать.
        Что нужно: Необходимо авторизоваться перейти на страницу с функционалом поиска, где увидим алерт “подписку срочнА купи!”, жмакаем на ссылку -> переход в ЛК -> Мои подписки -> Оплатить(проводим оплату) -> рефрешим страницу -> появится таблица с записью(или добавится еще запись в таблицу, если уже есть подписка) (нужно вот и сделать ей верифай)

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

        Вот скрин таблицы: http://joxi.ru/DmBygMLINjBKdr

      • 4 October 2017 at 08:30

        Остановился на таком варианте: буду лезть в админку и удалять подписку, таким образом при последующем прогоне в таблице всегда будет одна запись.

        Может не совсем правильно? Но пока так.

      • 4 October 2017 at 09:38

        Или можно как-то так к примеру:
        | storeTable | css=table.lk__table.0.0 (+ 1) | variable |
        | verifyTable | css=table.lk__table.0.0 (+ 1) | ${variable} |

        Вот то что в скобках, имею ввиду прибавлять 1 с каждым прогоном, чтобы в переменную сохранялась ячейка 1.0(следующий прогон 2.0, и т.д.)

        Так можно? но как реализовать, вот тут тупик)

        • 4 October 2017 at 19:26

          Не экспериментируя с приложением невозможно сказать, какой код для него следует написать. Сорри.

          Если можно было бы вставлять уникальные значения в строки в таблице, то можно было бы привязываться к этим уникальным значениям.

          Можно всегда проверять в списке строк таблицы только последнюю. Примерный пример https://siderulezzz.wordpress.com/2011/03/17/12/

          Форум для вас http://software-testing.ru/forum/index.php?/forum/129-selenium-functional-testing/

          • 5 October 2017 at 10:01

            Спасибо. Пример помог в решении проблемы. Все просто, если уметь локатор “правильный подобрать” )

  6. 4 October 2017 at 08:31

    Алексей, что можете сказать о katalon studio? Стоит ли “переключится” на него с селениума? (извините за вопрос не по теме)

Comment pages

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

<span>%d</span> bloggers like this: