Archive

Archive for the ‘JavaScript’ Category

goBack()

Чтобы сделать в браузере “шаг назад”, надо написать команду:

execute script
window.history.back()

Это кажется раздражающе неочевидным, но это же обычный JavaScript. А там есть много всякого, если знать, что искать. Например:

  • window.history.back()
  • window.history.forward()

и много еще чего.

Categories: Мелочи, JavaScript

Мелочи JavaScript жизни

12 June 2012 10 comments

Как выводить в алерте текст в двух уровнях?

<tr>
 <td>getEval</td>
 <td>alert(unescape('Первый ряд %0AВторой ряд'))</td>
 <td></td>
</tr>

Как сравнить между собой содержимое двух переменных?

Положить текст в две переменные (name1 & name2 в моем случае).
<td>assertEval</td>
<td>'${name1}'=='${name2}'</td>
<td>false</td>
</tr>

В переменную KTO_ZDES пришло какое-то буквенно-числовое значение (предположим, что туда может прийти или слово “Фирма”, или слово “Частное лицо”. Если пришло слово “Фирма”, тогда нужно выкинуть алерт со словом “Фирма”, иначе выкинуть алерт со словом “Частное лицо”.

<tr>
<td>storeEval</td>
<td>if (storedVars [‘KTO_ZDES’] == ‘Фирма’) {‘alertFirma’} else {‘alert4astnoeLitso’}</td>
<td>nextMove</td>
</tr>

Categories: Мелочи, JavaScript

Вырезаем доллары

19 December 2011 15 comments

В корзине отображается цена товара следующим образом: $ 123.

Посредством storeText я сохраняю это значение в переменную productPrice, и хочу проверить, правильно ли отображается цена товара ($ 123) + цена упаковки ($ 5).

Проблема: если в переменной помимо цифр находится что-то “лишнее” (буквы, философские вопросы, предложения об увеличении your pencil), то операции плюсования, а равно и минусования и всего такого прочего с подобными переменными невозможны.

Решение: удалить из текста переменной ненужные символы.

// сохраняю со страницы сайта цену товара 
 в переменную productPrice в виде 'as is': '$ 123'.
storeText | //div[@class='product_price'] | productPrice
echo | ${productPrice} | 
// превращаю ненужные мне символы '$ ' в пустоту.
storeEval | storedVars['productPrice'].replace("$ ", "") | productPrice
echo | ${productPrice} |

Теперь в переменной productPrice находится обычное число ‘123’, с которым можно математически делать всё, что нужно.

Чтобы в итоге проверить, что в нужном месте страницы отображается определенный текст (цена товара + цена упаковки = $ 128), предварительно потребуется вернуть циферке предваряющие её символы:

storeEval | '$ '+${productPrice} | productPrice
echo | ${productPrice} |

PS Напоминаю сам себе, что storedVars[‘productPrice‘] и ${productPrice} являются идентичными сущностями, просто первая пишется в нотации JavaScript, а вторая – в нотации Selenium IDE.

Также прошу сам себя оценить силу и возможности автозамены…

Как заменить часть текста в строке

25 August 2011 8 comments
storeExpression http://site.ru/forumtopics/51.html n1
echo ${n1}
storeEval
javascript:{storedVars['n1'].replace("forum", "")}
n1
echo ${n1}

В общем, с помощью javascript:{storedVars[‘n1’].replace(“forum”, “”)} заменяем определенное буквосочетание на другое.

Если параметр “на что изменить” будет пустым, то произойдет не замена, а удаление текста.

PS Внимательно следим за правильностью отображения кавычек.

Пролистать страницы и найти нужное слово

12 August 2011 7 comments

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

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

Запускаем в Selenium IDE labels (подключаем внешний js-файл).

Логика теста:

  1. кладем искомый userName в переменную.
  2. открываем первую страницу таблицы.
  3. ищем на этой странице нужное слово (конечно, предполагаем, что имя юзера непременно будет найдено)
  4. если нашли – кликаем по нему.
  5. если не нашли – кликаем по линку Next для перехода на следующую страницу таблицы
  6. снова ищем на этой странице нужное слово.
  7. если нашли – кликаем по нему.
  8. если не нашли – кликаем по линку Next для перехода на следующую страницу таблицы
  9. продолжаем до окончания страниц, которые можно пролистывать.
listPagesInTableForSearchExpectedWord
storeExpression Иван Столяров userName
label checkUserName
storeEval if (selenium.isTextPresent(storedVars[‘userName’]) == false) {nextMove = ‘listToNextPage‘} else if (selenium.isTextPresent(storedVars[‘userName’]) == true) {nextMove = ‘openUserPage‘} nextMove
gotolabel ${nextMove}
label listToNextPage
click link=Next
waitForPageToLoad 90000
gotolabel checkUserName
label openUserPage
clickAndWait //*[contains(text(), ‘${userName}’)]

Готово.

На всякий случай: есть большая разница между //*[contains(text(), ‘${userName}’)] и //*[text()=’${userName}’]. Второе условие жесткое и однозначное.

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

28 August 2010 88 comments

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

Можно.

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

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

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

.

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

.

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

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

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

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

Read more…

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

15 June 2010 113 comments

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

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

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

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

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

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

Read more…

Освободить линки!

25 May 2010 1 comment

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

Это было что-то с чем-то для чего-то без чего-то. Something and a half, wow!

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

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

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

Толку нет только от правой кнопки – если через правую сказать “Открыть линк в новой вкладке/новом окне”, то в новой вкладке будет открыта точно та же страница, на которой мы уже были.

Selenium воспринял это чудо-юдо как настоящий джедай: по линкам он кликает, но без толку – после клика страница перегружается, и мы видим то же, от чего плясали.

Стали выяснять.

Read more…

Генерируем случайные буквосочетания

Юзер может создать несколько магазинов в системе.

Каждый магазин должен иметь уникальное имя из букв, а не только из цифр.

На тебе уникальное имя!

1) Создать переменную userName:

  1. storeExpression
  2. имя юзера – это существующий в системе логин, в ходе теста не меняется
  3. userName

2) Создать переменную uniqueStoreName, которая содержит пятизначное слово, созданное в случайном порядке из букв английского алфавита:

  1. storeExpression
  2. javascript{var text = ""; var possible = "abcdefghijklmnopqrstuvwxyz"; for( var i=0; i < 5; i++ ) text += possible.charAt(Math.floor(Math.random() *possible.length));}
  3. uniqueStoreName

Принципиально обрамление скрипта в javascript{…} не является обязательным.

3) Полученный результат объединить с заготовкой Personal Store by ${userName}:

  1. storeExpression
  2. ${uniqueStoreName} Personal Store by ${userName}
  3. userPersonalStoreName

4) В нужном месте вставить содержимое переменной userPersonalStoreName:

  1. type
  2. id поля, в которое надо вставить данные
  3. ${userPersonalStoreName}

Получилось: “wcwta Personal Store by логинЮзера”.

Если указать количество символов равным 15, то получим: “utxzfaioapfzlbh Personal Store by логинЮзера”.

Если вместо букв указать цифры, то будет цифровая абракадабра.

Во всех проверках вроде verifyTitle повсюду используется переменная ${userPersonalStoreName}.

Важный вопрос: а как сгенерировать “случайную” циферку?

storeEval | Math.floor(Math.random() * (1 + 2000)) | aleatoryNumber

echo | ${aleatoryNumber}

На выходе получаем число между единицой и 2000. Может быть одна цифра, или две, или три (не больше 2000 в данном случае).