А вот else if, тогда я бы…

Поступил вопрос: “Можно ли в Selenium IDE реализовать цикл if? Например, если есть кнопка “Войти”, тогда нажимаем ее, иначе нажимаем на “Регистрация”?

Можно.

Но только в рамках одного файла из тест-сьюта. Возможность произвольного перехода между файлами в контексте тест-сьюта в Selenium IDE я не нашел.

Подобные переходы делаются с помощью ярлыков (labels), и команды gotoIf, а эти штучки появляются только после подключения внешнего js-файла.

Ярлык (label) сам по себе ничего не делает – это просто особым образом именованная строчка, к которой Selenium IDE насильно переходит, после чего начинает выполнять команды, которые следуют далее по коду

.

Адекватное решение

.

Во-первых, слегка изменю условия примера из заданного вопроса:

  1. “Если залогинен:
    • перейти на страницу ‘My Dashboard’.
  2. Если не залогинен:
    • перейти на страницу Login,
    • залогиниться,
    • перейти на страницу ‘My Dashboard'”

Такой алгоритм я использую непосредственно в работе, и мне он кажется более используябельным, нежели “если нет кнопки “Логин”, тогда выбрать кнопку “Регистрация”.

Изменение не существенное, поэтому поехали дальше.

Не приведу линков на тестируемое приложение, ибо вся суть будет видна в коде, а не в его отработке. Просто предлагаю вообразить следующее: тестируем очередной интернет-магазин.

  1. Открыть сайт.
  2. Выяснить, залогинен ли я. Для этого надо поискать на странице элемент ‘link=Account’.
  3. Если элемент ‘link=Account’ присутствует:
    • кликнуть по этому линку
    • перейти на страницу ‘My Dashboard’ (это будет сделано автоматически)
  4. Если элемент ‘link=Account’ отсутствует:
    • перейти на страницу Login
    • залогиниться
    • перейти на страницу ‘My Dashboard’

Если я попытаюсь втиснуть в одну getEval-строку и проверку наличия элемента, и выполнение какого-то кода, я в этой строке запутаюсь при последующем рефакторинге.

Поэтому:

  1. еще раз нужно убедиться в том, что внешний js-файл правильно подключен.
  2. сделаю три ярлыка (labels):
    • openPageDashboard,
    • loginOnTheSite,
    • testingClosed.

    После каждого ярлыка напишу действия, которые следует предпринять, а затем переход к ярлыку testingClosed, который символизирует завершение действий в рамках этого теста.

  3. Открою главную страницу сайта.
  4. Проверю наличие или отсутствие линка ‘Account’ на ней, присутствие которого символизирует то, что я залогинен.
  5. В зависимости от результата, перейду к нужному месту в коде, и сделаю определенные действия.
  6. Перейду к ярлыку testingClosed.

Финиш.

Правильная демонстрация логики IF в Selenium IDE

Указываем используемые в тест-сьютах переменные
storeExpression http://test.com/ mainPage
storeExpression http://test.com/LogIn.aspx loginPage
storeExpression http://test.com/UserAccount.aspx myDashboardPage
storeExpression Customer Login customerLoginPage
Открываем страницу
open ${mainPage}
Ищем элемент ‘link=Account’ и принимаем решение о следующем шаге
storeEval if (selenium.isElementPresent(‘link=Account’) == true) {nextMove = ‘openPageDashboard’} else if (selenium.isElementPresent(‘link=Account’) == false) {nextMove = ‘loginOnTheSite’} nextMove
echo ${nextMove}
двигаемся согласно результату в ‘nextMove’
gotolabel ${nextMove}
Отрабатываем положительный результат теста
label openPageDashboard
Открыть страницу аккаунта
open ${myDashboardPage}
verifyTitle ${customerLoginPage}
Переходим к завершению теста
gotolabel testingClosed
Отрабатываем отрицательный результат теста
label loginOnTheSite
Открыть страницу Login и залогиниться
open ${loginPage}
type username user
type password 12345
clickAndWait sign_in
verifyTitle ${customerLoginPage}
Переходим к завершению теста
gotolabel testingClosed
Полное завершение теста
label testingClosed

.

Важно знать

.

0)

Можно (это модно) сократить код

storeEval if (selenium.isElementPresent(‘link=Account’) == true) {nextMove = ‘openPageDashboard’} else if (selenium.isElementPresent(‘link=Account’) == false) {nextMove = ‘loginOnTheSite’} nextMove

следующим образом:

storeEval if (selenium.isElementPresent(‘link=Account’) == true) {‘openPageDashboard’} else if (selenium.isElementPresent(‘link=Account’) == false) {‘loginOnTheSite’} nextMove

Дело в том, что в буковках {nextMove = ‘openPageDashboard’} имеет значение только то, что сокрыто в ординарных кавычках. Да еще важно  название создаваемой объявляемой созданной и объявленной переменной ‘nextMove’. Все остальное – просто информационный фон.

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

Можно еще проще, если ситуация бинарна, вроде “или true, или false”:

if (selenium.isTextPresent(‘You are logged in’) == true)
{nextMove = ‘alreadyLoggedIn’}

else {nextMove = ‘loginOnSite’}

А можно вообще перечислить все нужные ситуации и указать, куда надо иттить в каждом отдельном случае? В таком случае будут сплошные указатели “true” и ни одного “false”:

if (selenium.isElementPresent(“//input[@value=’Logout‘]”) == true)
{nextMove = ‘logoutThenLogin‘}

else if (selenium.isElementPresent(“//input[@id=’password‘]”) == true)
{nextMove = ‘login‘}

else if (selenium.isElementPresent(“//input[@id=’question‘]”) == true)
{nextMove = ‘askYourQuestion‘}

 else alert(‘Чё те надо, старче?’)

Конечно, не возбраняется писать “{then = ‘openPageDashboard’}”, чтобы код читался прям как третий акт вторая сцена технодрамы “Отелло и Джульетта”.

1)

Если вместо selenium.isElementPresent(“link=Account”) написать только isElementPresent(“link=Account”) – получим [error] Threw an exception: isElementPresent is not defined. Ибо selenium. есть объявление соответствующего класса, а классовую борьбу со времен Маркса ещё никто не отменял.

2)

Если вместо (link=Account) написать (link=Account) – в Selenium IDE это сработает без вопросов, но если в будущем код будет экспортироваться в формат java, то двойные кавычки из (“link=Account”) превратятся в (\”link=Account\”). Та же ситуация, что и в Xpath.

3)

Условий может быть больше двух 🙂

Например:

<td>storeEval</td>

<td>if (selenium.isTextPresent(‘Ошибка 404’) == true) {nextMove = ‘showAlert’} else if (selenium.isTextPresent(‘Exception’) == true) {nextMove = ‘showAlert’} else if (selenium.isTextPresent(‘FreeMarker’) == true) {nextMove = ‘showAlert’} else if {nextMove =’testOk’}</td>

<td>nextMove</td>

Тут Selenium проверит наличие всех трех условий последовательно. Если хотя бы одно слово их указанных будет обнаружено, то в переменную nextMove будет положена инструкция перехода к ‘showAlert’. Если ничего не будет обнаружено – то перейдем к ярлыку ‘testOk’.

В моем основном случае есть только два условия, ведь искомый элемент или есть, или отсутствует. В действительности можно понауказать “else if (условие поиска) {решение вопроса}” столько, сколько нужно было бы богу любой религии, если бы он решил накодить краткий справочник по психологии рядовой жительницы Кишинева XXI века.

Другой вопрос – как потом разобраться во всех этих условиях.

4)

Как выяснить правильное название команды типа selenium.isElementPresent:

  • Резко создать новый кейс, чтобы не запутаться в строках.
  • написать нужную команду. Например, verifyTitle (команды вроде waitFor сгенерируют чуток более сложный код, чем ожидается, поэтому пример простой).
  • Options > Format > Java
  • обнаружить строки вроде
public void testUntitled() throws Exception
   {
verifyEquals("", selenium.getTitle());
   }
  • Скопировать selenium.getTitle, и заюзать в своем контексте.

5) Если скопированный код не работает – рецепт. Вероятнее всего, дело в кавычках.

6) Если нужно проверить наличие элемента по более сложному xpath, нежели просто link=Account, то нужно будет обрамлять элемент в двойные кавычки. Например, проверяем наличие //input[@type=’checkbox’ and @value=’true’ and @name=’RulesEnabled’] следующим образом:

if (selenium.isElementPresent(//input[@type=’checkbox’ and @value=’true’ and @name=’RulesEnabled’])  == true) {nextMove = ‘createNewRule’}

7) Если нужно проверить, есть ли на странице текст, который мы сохранили в переменную (например, в переменную ‘accountName’), то пишем так:

if (selenium.isTextPresent(storedVars[‘accountName’]) == false) {nextMove = ‘listToNextPage’} else if (selenium.isTextPresent(storedVars[‘accountName’]) == true) {nextMove = ‘openUserPage’}

Тут фишка в том, что вместо ${accountName} нужно писать storedVars[‘accountName’] – так предусмотрено в расово правильном для Selenium языке JavaScript.

8) Если знаете javasctipt, можете обойтись без расширений, например:

runScript | javascript{if(document.getElementById(‘p1’).style.display == ‘inline’) document.getElementById(‘p1’).click(); else document.getElementById(‘p2’).click();} | nextMove

Если видим элемент “p1” – делаем клик по нему, иначе делаем клик по “p2”.

Обрамление javascript{…} неоднозначное. Иногда требуется безусловно, иногда можно и без него…

88 thoughts on “А вот else if, тогда я бы…

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

    .

    Возня с Яндексом

    .

    Сперва решил сделать следующее:

    1) Открыть глагне Яндекса.

    2) Кликнуть по линку “Войти в почту”.

    3) Если линк “Войти в почту” отсутствует:
    3.1) кликнуть по линку “Почта”.

    4) Если линк “Почта” отсутствует:
    4.1) показать алерт “Сервис к тестированию не готов”.

    В этом случае подходит следующее решение:

    – выяснить локатор элемента, который содержит линк, по которому мне надо кликать для входа в почту,

    – сохранить содержимое этого элемента в переменную nextMove,

    – проверить содержимое этой переменной методом JavaScript,

    – в зависимости от содержимого проверяемой переменно принять решение о переходе к очередному файлу в тест-сьюте.

    Но расследование показало, что тут придется повозиться.

    Оба линка “Войти в почту” и “Почта” находятся в одной таблице, но в ячейках разных классов:
    - td class="m" -"Войти в почту"
    - td class="u" - "Почта"

    И та и другая ячейка находятся третьими по счету элементами в составе некоей
    table id="head".

    И в случае, если я не залогинен, Selenium может сохранить содержимое третьей ячейки таблицы head в виде обычного текста – “Войти в почту“, который можно будет считать линком, и по которому можно будет кликнуть.

    Но если я уже залогинен, то сохранение текста из того же элемента дает результат “Почта astenix Выход“. А кликать надо только по слову “Почта”.

    Поскольку Яндекс мне не платил за автоматизацию, я на это дело забил, и понял, что есть простейший ход для демонстрации IF:

    – открыть глагне Яндекса

    – кликнуть по линку “Войти в почту”.

    – если линк “Войти в почту” присутствует: кликнуть по нему. Произойдет переход на страницу _http://mail.yandex.ru/

    – если линк “Войти в почту” отсутствует: сразу перейти на страницу _http://mail.yandex.ru/

    Трабла в том, что тут в обоих случаях происходит переход на страницу _http://mail.yandex.ru/. Так почему бы нам просто не заходить туда сразу?

    Ок, так и сделаем.

    Проверять изменения можно по заголовку страницы – он на яндекс-почте динамический. Или можно проверять текст со страницы:

    1) зайти на страницу _http://mail.yandex.ru/

    2) если там будет присутствовать текст “Входящие, писем нет” – показать алерт с текстом “Входящие проверены, писем нет”.

    3) если текст “Входящие, писем нет” не найден (то есть, в ящике есть хотя бы одно письмо), показать алерт с текстом “Входящие открыты, письма есть“.

    Но этот вариант я отклоню, ведь отсутствие текста “Входящие” вообще может означать и то, что я не залогинен в почту.

    Ладно, вот тест попроще:

    1) зайти на страницу http://yandex.ru/

    2) если в Title страницы есть слово “Яндекс” – показать сообщение “Все ок”.

    3) если в Title страницы нет слова “Яндекс” – показать сообщение “Ты не залогинен, тест завершен”.

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

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

    .

    Неадекватное решение

    .

    0) Подключил внешний js-файл.

    1) Cоздал три ярлыка (labels):

    • answerYes,
    • answerNo,
    • testingClosed.

    После каждого ярлыка написал вызов простого алерта, который покажет, в какой ситуации мы находимся.

    Третий ярлык ‘testingClosed’ – подробнее см. пункт 8.

    2) Записал в переменную ‘expectedTitle’ условие, с которым будем сравнивать полученный результат. Эталон заголовка, который ожидаю получить.

    3) Открыл нужную страницу на сайте – прямиком по URL.

    4) Сохранил содержимое тэга Title открытой страницы в переменную ‘storedTitle’.

    5) Сравнил содержимое переменных ‘expectedTitle’ и ‘storedTitle’, и сохранил результат в переменную ‘nextMove’.

    Если сравнение показывает полное совпадение содержимого переменных, значит, я открыл правильную страницу, и переменная ‘nextMove’ должна получить содержимое (текст), идентичное названию ярлыка ‘answerYes’.

    Иначе содержимое переменной ‘nextMove’ должно стать равным названию ярлыка ‘answerNo’.

    6) Командой ‘gotolabel’ совершаем переход к ярлыку, значение которого сейчас сохранено в переменной ‘nextMove’.

    7) Алерт отрабатывает свою маленькую роль “Кушать подано!”

    8) После выполнения нужного действия переходим к завершению теста – к ярлыку ‘testingClosed’.

    Она находится последней во всем кейсе. Создана специально для того, чтобы из любого состояния перейти сразу к последнему шагу тест-кейса, иначе он не остановится и продолжит пошаговое выполнение всего того, что в нем находится ниже места, которое следовало выполнить. Без подобного кунштюка выполнение скрипта выглядит как восстание роботов.

    Если же у нас грамотный тест-сьют, то после перехода к последнему шагу происходит ожидаемый переход к следующему кейсу, и всё отлично.

    Код проделанного теста

    Галимая демонстрация логики If в Selenium IDE
    Сохранить в переменную искомый текст
    storeExpression Яндекс expectedTitle
    echo ${expectedTitle}
    Открываем страницу
    open http://yandex.ru/
    Сохраняем содержимое тэга Title в переменную
    storeTitle storedTitle
    echo ${storedTitle}
    Сравниваем содержимое переменных и сохраняем в переменную ‘nextMove’
    storeEval if (storedVars[‘expectedTitle’] != storedVars[‘storedTitle’]) {nextMove = ‘answerNo’} else if (storedVars[‘expectedTitle’] == storedVars[‘storedTitle’]) {nextMove = ‘answerYes’} nextMove
    echo ${nextMove}
    двигаемся согласно результату в ‘nextMove’
    gotolabel ${nextMove}
    Показываем положительный результат теста
    label answerYes
    getEval alert(‘Путин одобряе. Заголовок страницы правильный.’)
    Переходим к завершению теста
    gotolabel testingClosed
    Показываем отрицательный результат теста
    label answerNo
    getEval alert(‘Онотоле негодуе! Это неправильная страница.’)
    Переходим к завершению теста
    gotolabel testingClosed
    Завершение теста
    label testingClosed

    Чтобы сгенерировать ситуацию с показом варианта “Вы круто ошиблись!”, можно в первых строках скрипта подломать эталон заголовка страницы. Например, написать “Яндекс1”. И всё, и этого достаточно.

    .

    Недостатки моего скрипта

    .

    1) Если эталон заголовка, с которым надо сравнивать заголовок открываемой страницы, мне уже известен и меняться он будет вряд ли, то зачем его выводить в отдельную переменную ‘expectedTitle’? Лучше прописать его явно в шаге, где делается сравнение.

    А если заголовок изменится, то его можно будет подправить руками. Если, конечно, я догадаюсь о причине сбоя.

    2) В последних строках кода выглядит совершенно бессмысленной конструкция
    gotolabel || testingClosed
    label || testingClosed

    Ведь если ярлык testingClosed находится сразу после выполнения какого-то условия, то Selenium к этой строчке в любом случае перейдет. Поэтому предпоследний шаг можно вырезать.

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

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

    Поэтому оставим, как есть.

    3) Я слегка изменил логику. Вместо “убедиться, что в title есть нужное слово” я записал это нужное слово отдельно, и сравнивал получаемый title с эталоном. Это близко, но не то, что ожидалось по условиям задачи. Да и вообще, изначально меня спрашивали о другом.

    4) Сперва я хотел проверить такую логику на основе title страницы Яндекс.Почта, но столкнулся с непонятной траблой – заголовок-эталон выглядит так: “Входящие (0/0) — Яндекс.Почта” (взято из исходников). Получаемый заголовок выглядит точно так же. Но Selenium упорно объявляет о несовпадении предъявленных данных, и искоренить проблему не удалось. Подозреваю, что дело в тире – оно удлиненное, пришедшее из российской типографики.

    5) Эта демонстрация показывает, как можно сравнивать какие-то переменные, но не показывает, как можно напрямую обрабатывать наличие/отсутствие элементов на странице, не помещая их в переменные.

    6) Я так и не ответил на вопрос “если есть кнопка “Войти”, тогда нажимаем ее, иначе нажимаем на “Регистрация”?”

    Ну, если мы ожидаем найти на странице определенный элемент, то можно обойтись тем же приемом:
    – verifyElementPresent
    – положить этот элемент в переменную
    – проверить, если переменная не равна null.

    Логика такая:
    if (variable == null)
    {
    // element is not present; execute some code
    }
    else
    {
    // element is present; execute some code
    };

    Но я хотел бы напрямую сделать проверку ‘verifyElementNotPresent OR verifyElementPresent AND doYourJob’, а не через предварительное объявление переменных. Поэтому решение с прямой проверкой наличия элемента намного лучше.

  2. Опишите проблему с _blank ссылками, не могу никак решить проблему 😦
    ни SelectWindow. ни windowFocus не помогают переключиться на открытый таб в ФФ и сравнить правльность Location и Title. 😦

    1. Подумаем.

      С табами проще всего решить проблему средствами браузера – разрешить открывать все “внешние” линки в новых окнах, а не принуждать браузер открывать всё в табах. Тогда дело двинется.

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

      Понимаете?

  3. Отдельный профиль – это как? закладки пробывали – не помогает 😦

    openAndWait | ${ContentAddress}/default.aspx?Culture=en-US
    clickAt | ctl00_ctl00_MainMenu1_RepeaterMainMenu_ctl08_HyperLink
    SelectWindow | title=’Calendar – Global Economic Events’
    verifyTitle | Calendar – Global Economic Events
    verifyLocation | ${ContentAddress}/Calendar.aspx

    и Title и Location валится. 😦

    А отдельный профиль – это как?

    1. Для начал профили нужно создать в Profile Manager. Для этого закрываем все окна FireFox и запускаем его с ключом “-p”. Создаем новый профиль, если нужно. И выходим.

      Далее нам нужно создать пакетный файл для запуска каждого профиля (назовем их “default” и “develop”).

      Пакетный файл (назовем его default.bat) для профиля “default” должен выглядеть следующим образом:

      set MOZ_NO_REMOTE=1
      start “firefox” “c:\program files\mozilla firefox\firefox.exe” -p “default”
      set MOZ_NO_REMOTE=0

      Не забываем ставить MOZ_NO_REMOTE=0 иначе при попытке открыть ФФ извне будет выскакивать ошибка.

      Тоже самое делаем и для второго профиля. Далее остается прописать ярлычки на эти пакетные файлы (default.bat и develop.bat) туда, где пользоваться будет удобно.

      Тут подробнее: http://support.mozilla.com/ru/kb/%D0%9F%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%20Firefox

  4. Ок, я разрешил ему открывать все ссылки с _blank в окнах, но как теперь переключиться на окно с Calendar – Global Economic Events тайтлом?

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

      Окно идентифицируется не только по Title.

      Вон в справке чего делается:

      Window locators provide different ways of specifying the window object: by title, by internal JavaScript “name,” or by JavaScript variable.

      * title=My Special Window: Finds the window using the text that appears in the title bar. Be careful; two windows can share the same title. If that happens, this locator will just pick one.

      * name=myWindow: Finds the window using its internal JavaScript “name” property. This is the second parameter “windowName” passed to the JavaScript method window.open(url, windowName, windowFeatures, replaceFlag) (which Selenium intercepts).

      * var=variableName: Some pop-up windows are unnamed (anonymous), but are associated with a JavaScript variable name in the current application window, e.g. “window.foo = window.open(url);”. In those cases, you can open the window using “var=foo”.

      If no window locator prefix is provided, we’ll try to guess what you mean like this:

      1.) if windowID is null, (or the string “null”) then it is assumed the user is referring to the original window instantiated by the browser).

      2.) if the value of the “windowID” parameter is a JavaScript variable name in the current application window, then it is assumed that this variable contains the return value from a call to the JavaScript window.open() method.

      3.) Otherwise, selenium looks in a hash it maintains that maps string names to window “names”.

      4.) If that fails, we’ll try looping over all of the known windows to try to find the appropriate “title”. Since “title” is not necessarily unique, this may have unexpected behavior.

      If you’re having trouble figuring out the name of a window that you want to manipulate, look at the Selenium log messages which identify the names of windows created via window.open (and therefore intercepted by Selenium). You will see messages like the following for each window as it is opened:

      debug: window.open call intercepted; window ID (which you can use with selectWindow()) is “myNewWindow”

      In some cases, Selenium will be unable to intercept a call to window.open (if the call occurs during or before the “onLoad” event, for example). (This is bug SEL-339.) In those cases, you can force Selenium to notice the open window’s name by using the Selenium openWindow command, using an empty (blank) url, like this: openWindow(“”, “myFunnyWindow”).

      1. Алексей, большое спасибо за блог и практические разборы.

        Подскажите, пожалуйста, как реализовать такую задачу:
        “Завести на mail.ru почтовый ящик. Автоматизировать (с помощью Selenium IDE) удаление всех входящих писем из этого ящика. (эта часть успешно сделана, а вот следующая вызывает сложности:)
        Тест должен запускаться с пустой страницы браузера и (в случае успешного выполнения) заканчиваться пустой страницей.”

        Т.е. тест при запуске должен принудительно заставить браузер открыть пустую страницу, ввести в адресную строку этой пустой страницы адрес mail.ru, выполнить сам тест, и после этого со страницы mail.ru снова перейти на пустую страницу браузера.
        Как написать команды/код, чтобы это реализовать?
        Есть ли готовые решения, и что конкретно нужно написать в поля Selenium’a IDE?

        1. ыыыы, какая удивительная задача!

          Решение: после всех манипуляций просто переходим на адрес ‘about:blank’ (open | about:blank).

          Вариант “да просто открой новое окно” не сомнителен, но тянет за собой вероятные проблемы вроде “при открытии новой вкладки в ней автоматически отображается какая-нибудь шняга вроде “страница пол-умолчанию”…

    1. Выводит в логе содержимое переменной, которая указана.

      Это иногда полезно, если в ходе теста одна и та же переменная принимает то одно, то другое значение, и мозг не успевает понять или запомнить, что именно она сейчас содержит.

      Например, тест подразумевает, что надо залогиниться под user Vasea, а потом разлогиниться и залогиниться под user Taras. Переменная будет одна и та же, но значения она получит разные (это мы ей легко обеспечим).

      Пример краткий:

      Объявить имя юзера

      <tr>
      <td>storeExpression</td>
      <td>Vasea</td>
      <td>userLogin</td>
      </tr>
      <tr>
      <td>storeExpression</td>
      <td>admin</td>
      <td>userPassword</td>
      </tr>

      Залогиниться на странице

      <tr>
      <td>type</td>
      <td>userNameField</td>
      <td>${userLogin}</td>
      </tr>
      <tr>
      <td>type</td>
      <td>userPasswordField</td>
      <td>${userPassword}</td>
      </tr>
      <tr>
      <td>clickAndWait</td>
      <td>submit</td>
      <td></td>
      </tr>
      <tr>
      <td>assertTitle</td>
      <td>Hello, Vasea!</td>
      <td></td>
      </tr>

      Разлогиниться

      <tr>
      <td>clickAndWait</td>
      <td>logout</td>
      <td></td>
      </tr>
      <tr>
      <td>assertTitle</td>
      <td>Please, login!</td>
      <td></td>
      </tr>

      Объявить новое имя юзера и сохранить его в ту же самую переменную

      <tr>
      <td>storeExpression</td>
      <td>Taras</td>
      <td>userLogin</td>
      </tr>
      <tr>
      <td>storeExpression</td>
      <td>superadmin</td>
      <td>userPassword</td>
      </tr>

      Логинимся по-новому

      <tr>
      <td>type</td>
      <td>userNameField</td>
      <td>${userLogin}</td>
      </tr>
      <tr>
      <td>type</td>
      <td>userPasswordField</td>
      <td>${userPassword}</td>
      </tr>
      <tr>
      <td>clickAndWait</td>
      <td>submit</td>
      <td></td>
      </tr>
      <tr>
      <td>assertTitle</td>
      <td>Hello, Taras!</td>
      <td></td>
      </tr>

      Выводим в логе содержимое переменной userLogin

      <tr>
      <td>eco</td>
      <td>${userLogin}</td>
      <td></td>
      </tr>

      Повторяющиеся места (ввод данных в поля и нажатие на кнопку submit) можно вынести в отдельный файл, и включать его в тест-сьют при необходимости. Главное – не забывать вовремя объявлять содержимое переменных, которые в нем используются.

      А под самый конец в логе выведется текущее содержимое переменной userLogin.

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

  5. Допоможіть знайти помилку. На фірмі я єдиний тестер. Запитатися поради чи підказки нема в кого. Програмісти допомогти не можуть бо не знають.

    Селеніум в лог пише: “Threw an exception: illegal character “.
    команду перевірки намагаюся організувати так:
    storeEval
    if (selenium.isTextPresent(‘Авторубрика_2’) == true) {nextMove = ‘vydalennya’} else if (selenium.isTextPresent(‘Авторубрика_2’) == false) {nextMove = ‘Nemae’}
    nextMove
    тут:
    Авторубрика_2 – назва рубрики, виводиться в гріді
    vydalennya і Nemae – лейбели

    1. Команда перевірки правильная.

      Если Селеніум в лог пише: “Threw an exception: illegal character “, то предполагаю, что какой-то символ из указанных для проверки является ошибочным.

      Например, в слове ‘Авторубрика_2’ какая-то буква может быть английской, а выглядит как русская.

      Вот я напишу: ‘Aвтopубpикa_2’ – сейчас это слово выглядит как кириллический текст, хотя я написал буквы ‘a’, ‘o’ и ‘p’ в латинской раскладке.

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

      Посмотрите на эту картинку. Я там показал, как один и тот же, вроде бы, текст, по-разному пишется и по-разному воспринимается Selenium.

      Иногда ошибку “illegal character” генерирует наличие незамеченного пробела в проверяемом слове. Например, вместо действительного пробела в исходном коде присутствует неразрывный пробел – mdash. Зрительно разницы нет, но с точки зрения кода и читающего его браузера разница существенная.

      Вам нужно попробовать разные варианты вписывания нужного вам текста в Selenium – если руками ничего не получится, можно попробовать “захватить” текст со страницы посредством команды storeText, если это действительно текст, или storeTitle, если это заголовок, и в дальнейшем использовать его без каких-либо изменений.

  6. Здравствуйте, я проделал те же действия, что и описано в вашей таблице, у меня возникла ошибка тут : gotolabel ${nextMove}, ошибка-

    [error] Unexpected Exception: message -> Specified label ‘myDashboardPage’ is not found., fileName -> chrome://selenium-ide/content/tools.js -> file:///C:/Documents%20and%20Settings/usr/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/goto_sel_ide.js, lineNumber -> 81, stack -> Error(“Specified label ‘myDashboardPage’ is not found.”)@:0 (“myDashboardPage”,””)@chrome://selenium-ide/content/tools.js -> file:///C:/Documents%20and%20Settings/usr/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/goto_sel_ide.js:81 (“myDashboardPage”,””)@chrome://selenium-ide/content/selenium/scripts/htmlutils.js:60 ([object Object],[object Object])@chrome://selenium-ide/content/selenium/scripts/selenium-commandhandlers.js:310 ()@chrome://selenium-ide/content/selenium/scripts/selenium-executionloop.js:112 (-10)@chrome://selenium-ide/content/selenium/scripts/selenium-executionloop.js:78 (-10)@chrome://selenium-ide/content/selenium/scripts/htmlutils.js:60 , name -> Error

    можете разъяснить пожалуйста, если это не трудно, что за ошибка, я начинающий тестер.

    1. Судя по “Specified label ‘myDashboardPage’ is not found.” – у вас в коде указано обращение к ярлыку с названием ‘myDashboardPage’, который отсутствует по непонятным причинам.

      Проверьте свой код полностью – там есть объявление упомянутого ярлыка?

      Если вы сделали ровно то, что указано в моей таблице “Правильная демонстрация логики IF в Selenium IDE“, то обратите внимание: там нет ярлыка ‘myDashboardPage’ – это просто название переменной. Там есть label “openPageDashboard”.

  7. Доброго времени суток. Пытаюсь сделать if, никак не выходит.
    Ругается на лэйблы [error] Unknown command: ‘lable’ и на storeEval

    if (selenium.isTextPresent(‘Регистрация’) == true) {nextMove =’openRegPage’} else if (selenium.isTextPresent(‘Регистрация’) == false) {nextMove = ‘clikExit’}

    [error] Threw an exception: illegal character

    Помогите, пожалуйста, одинокому “чайнику”. Заранее большое вам спасибо.

    1. 1
      Unknown command: ‘lable’” означает, что вам следует переписать эту команду с ‘lable’ на ‘label’, как оно и должно было быть.

      2
      Threw an exception: illegal character” в вашем случае означает вот это.

  8. Здравствуйте, господа! Проблема следующая:
    Использую Selenium IDE и File Logging 1.7
    —————————————–
    в теле кейса (например в echo) использую кириллицу (“Превед медвед”),
    в файле лога вместо кириллицы получаю абракадабру, игрался с кодировками, но так и не нашел рецепта. А хочется увидеть в логе нормальный русский язык! Помогите плиз!

  9. Здравствуйте! Не могу понять, почему [error] Threw an exception: syntax error при выполнении этой строки:
    if((${allSubscriptionsText}).length==0) {allSubscriptionsEval=0} else {allSubscriptionsEval=${allSubscriptionsText}}

    Спасибо!

  10. Снимаю вопрос. Обошла этот случай другой функцией if(${presentSubscriptionNum}==false) {allSubscriptionsEval=0} else if (${presentSubscriptionNum}==true) {allSubscriptionsEval=allSubscriptionsText}

    Спасибо.

  11. Алексей здравствуйте, есть такой код
    [info] Executing: |timerStart | TimeTaken | |
    [info] Executing: |open | http://localhost/ | |
    [info] Executing: |timerStop | TimeTaken | |

    Используются расширения
    timer Extension.js
    goto_sel_ide.js

    Как мне здесь задать условие чтобы тест прекращал работу если TimeTaken больше 1500 мс?

  12. Добрый день. Может быть кто-то сталкивался и решил такую проблему: При попытке запустить тест с Flow Control элементами и используя строку токого вида java -jar selen.jar -userExtensions D:\selenium\user-extensions.js
    -htmlSuite “*firefox c:/firefox/firefox.exe” “http://google.com”
    “D:\stay\sh.html” “D:\stay\sd_results.html” -port 4450
    pause
    – запускается тест раннер в нем показаны шаги(все как всегда), но дальше исполнение не идет. Само расширение взято с https://github.com/darrenderidder/sideflow

      1. Нет не спрашивал, я пробовал 3 разных расширения в которых реализованна функциональность label\gotolabel и ни с одним из них тест на начался. Каких-либо ошибок в командной строке или в логе селениума(уровень debug) нет. Таким образом я не думаю, что проблема в расширении от Дарена и друзей. Может я что-то упускаю?

  13. Задача – определить, случился ли переход по клику на баннер на одну из двух заданных страниц. Мой код:

    storeEval
    if (selenium.getLocation(‘location=http://www.perm.ural.rt.ru/*’) == true) {nextMove = ‘fast_internet’} else if (selenium.getLocation(‘location=http://www.perm.ural.rt.ru/*http://www.perm.ural.rt.ru/*’) == false) {nextMove = ‘zabava’}
    nextMove

    echo
    ${nextMove}

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

    1. Прошу прощения, в условии false дублировался адрес, эту ошибку я уже исправила, не помогло.
      Также убирала location=из кавычек, тоже не спасает.

  14. Нет. перед ней просто загружается окно.
    Я для себя сделала вывод, что проверить таким образом страницу по url нельзя, т.к. нет команды, возвращающей при проверке url true или false. Увы, с автоматизацией только знакомлюсь и многих вещей просто не знаю.

  15. Возможно ли условие для ветвления задать через xpath? Есть xpath элемента, нужно проверить его наличие/отсутствие на странице и в зависимости от этого выбрать путь в ветвлении. Однако как попытка напрямую вписать его в условие, так и добавить переменную и проверять через переменную дает ошибку:
    [info] Executing: |storeExpression | xpath=//div [@class=’account_block service_card’]//div[@class=’accountBalance’]/span[@class=’minusbalance’] | balance |
    [info] Executing: |storeEval | if (selenium.isElementPresent(‘${balance}’) == true) {nextMove=’minus’} else if (selenium.isElementPresent(‘${balance}’) == false) {nextMove=’plus} | nextMove |
    [info] script is: if (selenium.isElementPresent(‘xpath=//div [@class=’account_block service_card’]//div[@class=’accountBalance’]/span[@class=’minusbalance’]’) == true) {nextMove=’minus’} else if (selenium.isElementPresent(‘xpath=//div [@class=’account_block service_card’]//div[@class=’accountBalance’]/span[@class=’minusbalance’]’) == false) {nextMove=’plus}
    [error] Threw an exception: missing ) after argument list

    1. А если первую строку написать вот так:

      storeExpression | //div[@class=’account_block service_card’]/div[@class=’accountBalance’]/span[@class=’minusbalance’] | balance

      Внимание, ординарные кавычки перепишите руками, а блог-движок принудительно делает их фигурными.

      Так сработает?

  16. Попробовала.
    Получается как-то так:
    [info] Executing: |storeExpression | xpath=//div[@class=’account_block service_card’]/div[@class=’accountBalance’]/span[@class=’minusbalance’] | balance |
    [info] Executing: |storeExpression | | plus |
    [info] Executing: |storeExpression | | minus |
    [info] Executing: |storeEval | if (selenium.isElementPresent(‘{$balance}’) == true) {nextMove=’minus’} else if (selenium.isElementPresent(‘{$balance}’) == false) {nextMove=’plus’} | |
    [info] script is: if (selenium.isElementPresent(‘{$balance}’) == true) {nextMove=’minus’} else if (selenium.isElementPresent(‘{$balance}’) == false) {nextMove=’plus’}
    [error] Threw an exception: illegal character

    Спасибо за подсказки 🙂

  17. И еще, вдогонку

    storeExpression
    id=report_email_tune_monthly
    yes

    storeExpression
    link=Установить адрес электронной почты
    No

    storeEval
    if (selenium.isElementPresent(‘id=report_email_tune_monthly’) == true) {nextMove = ‘Yes’} else if (selenium.isElementPresent(‘id=report_email_tune_monthly’) == false) {nextMove = ‘No’}
    nextMove

    echo

    ${nextMove}

    gotolabel

    ${nextMove}

    label

    Yes

    label

    No

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

    Может быть, я не совсем верно поняла сам принцип? Что задавать в переменные, если для продолжения работы надо остаться на той же странице, но проверить наличие разных элементов?

  18. Здравствуйте. Никак не пойму почему при выполнении этого:
    storeEval | if (javascript{storedVars[‘Count’]} >1) {nextMove = ‘checkboxClick’} else {nextMove = ‘Continue’} | nextMove
    выдает ошибку
    [error] Threw an exception: missing ) after condition.
    Может вы подскажите что нет так?

      1. если не тру, то по любому фолс. я сделал типа так:
        if (selenium.isElementPresent(‘link=Account’) == true) {nextMove = ‘openPageDashboard’} else {nextMove = ‘loginOnTheSite’}

  19. Добрый день! На странице такой код:

    841 |

    101

    Можно ли командой storeText или storeTextValue вытащить только значение “101”?

  20. Я заменил “” на “{ }”
    {div class=”head center” onclick=”location.href=”/””}{img alt=”1″ src=”/images/icon/1.png”}{/img}
    1151 |
    {img alt=”2″ src=”/images/icon/2.png”}{/img}
    44
    {/div}

  21. Ксения :
    Попробовала.
    Получается как-то так:
    [info] Executing: |storeExpression | xpath=//div[@class=’account_block service_card’]/div[@class=’accountBalance’]/span[@class=’minusbalance’] | balance |
    [info] Executing: |storeExpression | | plus |
    [info] Executing: |storeExpression | | minus |
    [info] Executing: |storeEval | if (selenium.isElementPresent(‘{$balance}’) == true) {nextMove=’minus’} else if (selenium.isElementPresent(‘{$balance}’) == false) {nextMove=’plus’} | |
    [info] script is: if (selenium.isElementPresent(‘{$balance}’) == true) {nextMove=’minus’} else if (selenium.isElementPresent(‘{$balance}’) == false) {nextMove=’plus’}
    [error] Threw an exception: illegal character
    Спасибо за подсказки

    Вся проблема в синтаксисе 🙂
    у меня так работает
    if (selenium.isElementPresent(“xpath=${link4}”) == true) {‘click’} else {‘final’}

  22. Добрый день, Алексей!
    У меня вопрос: как объяснить селениуму что я с помощью ifelse ищу нужный баннер/картинку на странице?
    Вбила в переменную таким образом:
    storeExpression
    <img style="border: 0;" border="0" width="728" height="90" src="http://d26fls6fvwbl6y.cloudfront.net/471/ee0d5b35-24cd-4bc8-9896-1303c3a282f1.gif&quot; alt="">
    ExpectedBar
    условие прописала так:
    storeEval
    if (selenium.isElementPresent(‘expectedBar’) == false) {nextMovie = ‘waitForBar’} else if (selenium.isElementPresent(‘expectedBar’)== true) {nextMovie = ‘showAlert’}
    nextMovie
    может как то по другому надо к баннеру/картинке обращаться

        1. Да.

          Можете сделать проще: assertElementPresent | //img[@src=’http://d26fls6fvwbl6y.cloudfront.net/471/ee0d5b35-24cd-4bc8-9896-1303c3a282f1.gif’]

          Если элемента (картинка в данном случае) на странице не будет, то прохождение теста остановится.

  23. да но если ее нет, то мне надо рефрешетнуть страницу и посмотреть опять, вдруг появилась

  24. вот мой код, логика вроде верна, а вот при появлении нужного баннера/картинки, он считает как false

    storeExpression
    //img[@src=’http://d26fls6fvwbl6y.cloudfront.net/471/ee0d5b35-24cd-4bc8-9896-1303c3a282f1.gif’]
    ExpectedBar

    storeEval
    if (selenium.isElementPresent(‘expectedBar’)== true) {nextMovie = ‘showAlert’} else if (selenium.isElementPresent(‘expectedBar’)== false) {nextMovie = ‘waitForBar’}
    nextMovie

    echo
    ${nextMovie}

    gotolabel
    ${nextMovie}

    label
    waitForBar

    pause
    1000

    refresh

    waitForPageToLoad
    30000

    storeEval
    if (selenium.isElementPresent(‘expectedBar’) == false) {nextMovie = ‘waitForBar’} else if (selenium.isElementPresent(‘expectedBar’)== true) {nextMovie = ‘showAlert’}
    nextMovie

    echo
    ${nextMovie}

    gotolabel
    ${nextMovie}

    label
    ShowAlert

    getEval
    alert(‘Нашелся баннер!’)

    1. Почему “nextMovie”, а не “nextMove”? У вас кино показывают? 🙂

      Ну давайте последовательно.

      // в переменную ExpectedBar положили идентификатор элемента (картинки), из-за которой столько страданий

      storeExpression
      //img[@src=’http://d26fls6fvwbl6y.cloudfront.net/471/ee0d5b35-24cd-4bc8-9896-1303c3a282f1.gif’]
      ExpectedBar

      // Открываем страницу (точнее, она уже открыта) и проверяем наличие элемента на странице. И:
      // – если картинка на странице ЕСТЬ, тогда ПОКАЗАТЬ АЛЕРТ.
      // – если картинки на странице НЕТ, тогда ЖДАТЬ ПРИГЛАШЕНИЕ В БАР

      // пометим это место особым, магическим словом

      label
      controlYourImage

      storeEval
      if (selenium.isElementPresent(‘expectedBar’)== true) {nextMovie = ‘showAlert’}
      else if (selenium.isElementPresent(‘expectedBar’)== false) {nextMovie = ‘waitForBar’}
      nextMovie

      // смотрим в логе, как стильно мелькает вывод содержимого переменной nextMovie

      echo
      ${nextMovie}

      // двигаемся далее, согласно содержимому переменной ${nextMovie}

      gotolabel
      ${nextMovie}

      // ЖДАТЬБАР = заморозиться на секунду, потом обновить страницу

      label
      waitForBar

      pause
      1000

      refresh
      waitForPageToLoad
      30000

      // отсюда нужно сделать новый прыжок к методу, который проверял наличие элемента на странице, а не вписывать новую проверку… Внимание, таким образом выполнение всего скрипта будет зацикленно, и пока элемент на странице не появится (или страница не перестанет загружаться за waitForPageToLoad = 30000), скрипт будет выполняться вечно. Ваши потомки будут смотреть на этот выполняющийся с 2013 года скрипт и понимать, как мудро и проникновенно программировали древние люди.

      gotolabel
      controlYourImage

      // ПОКАЗАТЬ АЛЕРТ – здесь мы оказываемся, если после проверки наличия элемента на странце выяснится, что элемент таки есть

      label
      ShowAlert

      getEval
      alert(‘Аааааа, нашелся баннер, запускайте ракеты!’)

      PS Будьте внимательны при копировании текста с этой страницы – ординарные кавычки WordPress превратил в фигурные, а фигурные в Selenium вообще не котируются.

  25. Добрый день, Алексей. Стоит задача проверить что определенная таблица имеет значения, т.е. не пуста. Не знаю за что хвататься.

  26. Добрый день, Алексей. Есть готовый сценарий (sel. ide). сценарий просто бегает по страницам. Как задать условие: если не нашел слово, то выполняй сценарий дальше, если нашел, то остановись??? Заранее спасибо

        1. Вы с этим примером можете разобраться?

          storeEval

          if (selenium.isElementPresent(‘link=Account’) == true) {nextMove = ‘openPageDashboard’} else if (selenium.isElementPresent(‘link=Account’) == false) {nextMove = ‘loginOnTheSite’}

          nextMove

  27. добрый день )) у меня возникла такая проблема,если поможете,буду очень благодарна ….
    Запускаю написанные в IDE тесты с ‘gotolabel’ через Selenium RC и пишет, что :
    Unknown command: ‘gotolabel’

    Может, знаете, как это исправить / обойти? заранее спасибо))

      1. У меня тесты работают , если запустить через Selenium IDE напрямую…addon ‘flow-control’ у меня активен, все ОК. Но если сделать из этих тестов test suit и запускать через Selenium RC – то выдает в Selenium RC error ‘ Unknown command: ‘gotolabel’’ и тест failed.

        может ‘gotolabel’ вообше не работает в Selenium RC?
        еще раз заранее спасибо ))

          1. Спасибо большое за ответ ))
            Сами тесты я пишу через Selenium IDE и запускаю чаще всего через Selenium IDE, хотела потом сделать test suit на основе этих тестов и запускать через комманднуу строку RC. Пока буду и дальше IDE пользовать ))

  28. В зависимости от css элемента надо кликнуть по ссылке. Мучаюсь.
    if (selenium.isElementPresent(‘css=opt_fl sm’) == true) {‘click’}

  29. Можно ли вычисленные значения записывать в какой-нибудь текстовый файл?) Заранее спасибо.

    1. Нет, в Selenium IDE это просто невозможно. Его не для того придумывали.

      Есть возможность заранее какие-то переменные прописать в файлах самого Selenium IDE, и вроде бы отличная идея, но это чревато проблемами, которые ни за что не решить, если не знать об этих скрытых переменных…

  30. Привет
    нужна помощь)
    нужно в зависимости от выбран ли чекбокс делать дальше действия
    если не выбран то нажать
    если выбран то перейти дальше
    не выходит достаться до чекбокса
    [info] Executing: |storeEval | javascript{if (selenium.getElementsByName(“selected_tests[celf-4]”)[0].checked==true) {nextMove = ‘openPageDashboard’}} | nextMove |
    [error] Unexpected Exception: TypeError: selenium.getElementsByName is not a function.
    доступ только по name
    заранее спасибо

  31. спасибо, что быстро ответили.
    поправте, пожалуйста, я с js еще не дружу.
    делаю так: [info] Executing: |storeEval | javascript{document.getElementsByName(“selected_tests[celf-4]”)[0]} | tet |
    [error] Unexpected Exception: TypeError: document.getElementsByName is not a function.
    как верно вызвать и какую функцию, что б вернуло мне нужный елемент по имени?

    1. Так.

      Всё, что вы можете сделать с Selenium, ограничивается только теми функциями, которые у Selenium есть.

      Еще раз — тут речь идет о том, чтобы взаимодействовать непосредственно с selenium и его функциональными возможностями, а не о том, чтобы вызывать функции javaScript и с ними что-то творить.

      Поэтому, их надо просто знать (это приходит или с опытом, или открываете source Selenium и последовательно их исследуете), а во-вторых, вызывать их надо посредством указания класса, из которого они к нам приходят. Поэтому, чтобы в жаваскрипт-сниппете вызвать стандартную команду ‘verifyElementPresent’, надо написать ‘selenium.isElementPresent’. Бо это одно и то же.

      То есть, если в Selenium нет команды assertElementsByName, то команда ‘document.getElementsByName ‘ вообще не имеет смысла для Selenium. О чем он и сообщает — document.getElementsByName is not a function. Читай иначе: нет такой функции.

      Кстати, по ‘ByName’ нашел команду ‘assertCookieByName’. Больше ничего 🙂

      На странице https://siderulezzz.wordpress.com/2010/08/28/7/ есть инструкция на эту тему, Ctrl+F “Как выяснить правильное название команды типа selenium.isElementPresent”

      Вам нужно по-другому подойти к решению этой задачи.

      Надо в принципе определить обращение к нужному чекбоксу (я привык через xpath). Поскольку я не вижу приложение, можно только гадать.

      Например,
      assertElementPresent | //*[@name=’celf-4′] – это обращение к чекбоксу в принципе. Если он “чекнут”, и его свойства изменились, то это следует отобразить в запросе.

      Давайте дальше информацию, бо нужна точность.

  32. >> 8) Если знаете javasctipt, можете обойтись без расширений, например:
    >>
    >> runScript | javascript{if(document.getElementById(‘p1’).style.display == ‘inline’)
    >> document.getElementById(‘p1’).click(); else document.getElementById(‘p2’).click();} | >> nextMove

    А можно так же кликать, используя xpath?

  33. Алексей
    Скажите как мне сделать условие – если поле id=label_1 = = true press “Submit” если id=label_1 == false “Введите данные”
    Я написал по примерам вот
    [info] Executing: |getEval | if (selenium.isVerifyText(‘id=input_22’) ==true) {nextMove ‘submit’} else (selenium.isVerifyText(‘id=input_22’) ==false) {nextMove ‘typeValidWord’} | |
    [info] script is: if (selenium.isVerifyText(‘id=input_22’) ==true) {nextMove ‘submit’} else (selenium.isVerifyText(‘id=input_22’) ==false) {nextMove ‘typeValidWord’}
    [error] Threw an exception: missing ; before statement
    [info] Test case failed

      1. verifyNotVisible
        id=input_7

        storeExpression
        javascript{‘word_’+ Math.floor(Math.random()*10) + Math.floor(Math.random()*10)}
        spamValidator

        echo
        ${spamValidator}

        type
        id=input_22
        ${spamValidator}

        getEval
        if (selenium.isVerifyText(‘id=input_22’) ==true) {nextMove click = ‘submit’} else (selenium.isVerifyText(‘id=input_22′) ==false) {nextMove type =’typeValidWord’}

        Может я в прошлый раз не правильно обяснил смысл.
        мне нужно чтобы скрипт проверял что в поле после ввода невалидных данных кнопка не появилась и ввести валидное значение

  34. Подскажите пожалуйста, если у меня есть строка поиска, в которую если вводишь слово, она через GET запрос возвращает предложенные варианты в выпадающем списке. Пробовала просто type использовать, но запрос в таком случае не уходит.

      1. Уже разобралась, оказывается в моем случае поможет комманда keyDown. Спасибо в любом случае!

  35. Добрый день, подскажите пожалуйста, хочу зациклить данный код но не получается:

    1. do
    2. wait for element present | xpath=//button[contains(.,’Выполнить’)]
    3. click | css=.btn-outline-success
    4. pause | 35000
    5. click | css=.btn-success
    6. repeat if | xpath=//button[contains(.,’Выполнить’)]
    7. click | css=.btn-primary
    8. и т.д.
    Требуется после 5 хода проверка наличия кнопки “Выполнить” на странице и если она есть, то вернуться к ходу 2, если нет, то продолжить выполнять сценарий дальше

Leave a reply to Алексей Лупан Cancel reply