Код с SeleniumCamp

26 February 2012 8 comments

Джентльмены.

На SeleniumCamp было отлично!

Есть видео моего выступления.

Мой рэп доклад прошел успешно, вовремя, нестандартно.

Докладывание доклада на SeleniumCamp

Докладывание доклада на SeleniumCamp

Принес домой футболку от SysIQ и презерватив от mail.ru (они на своем стенде их вместе с леденцами раздавали).

Леденец я своевременно сжевал…

В ходе доклада я продемонстрировал работоспособный пример того, как обычный тестировщик может зациклиться с прекрасным баг-трекером Mantis.

Код из этого примера – да вот же он.

Код обновлен – удаление текста вокруг цифры теперь делается через RegExp одним движением.

Спасибо Vera Berko!

Получил среди отзывов одно “дякувание за видповiдь”.

Алексей Баранцев прочитал эту “видповiдь” как “проповедь”. Ибо “программировать в таблицах в Selenium IDE – это явно сектантство 🙂

Не стал оправдываться, бо мэтр в чем-то прав.

Вступайте в нашу секту, от нас ближе к грамотной автоматизации веб-приложений!

Cравнение целого и не совсем целого числа

16 January 2012 6 comments

На странице цена товара: ‘8 млн руб‘.

Задача: сравнить цену товара с эталоном ’10’. Если цена выше 10 – сообщать о проблеме. Если цена ниже 10 – спокойно продолжаем проверки.

Решение: в несколько шагов.

Понятно, что сперва надо сохранить текст в переменную.

| storeText | css=span[name=”price”] | maxprice

Теперь в переменной надо оставить от текста ‘8,8 млн руб’ только цифру. Это мы сделаем посредством replace. Затем надо будет сравнить итоговую цифру с эталоном.

Эти два шага можно сделать одним элегантным движением:

| storeEval | if (storedVars[‘maxprice’].replace(” млн руб.”, “”) <= 10 ) {} else {alert(“Price is higer than 10”)}

Читаем: если значение переменной ‘maxprice’ меньше или равно 10, то ничего не делать.

Если значение переменной ‘maxprice’ выше  10, то выдаем alert (“Ахтунг, Покрышкин в воздухе!”).

Вероятная проблема: разделителем циферок будет запятая. Если на странице будет текст: ‘8.5 млн руб’, то скрипт все правильно сравнит. Если же текст будет ‘8,5 млн руб’, то скрипт забьется в истерике, потому что значение ему предлагают априори несравниваемое.

Вероятное решение: если допустимо, следует сделать замену не только букв, но и запятых на точки – еще одна строка кода. Некрасиво, но работает.

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

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}’]. Второе условие жесткое и однозначное.

To decompile Java class in Eclipse

Разобрался, как в Eclipse смотреть код методов, закрытых в jar-файлах.
Нужен Java Decompiler Plugin For Eclipse IDE.

  1. Закрыть Eclipse.
  2. Скачать исполняемый файл jad.exe
    Источники:

  3. Файл положить в определенное место на вечное хранение.
  4. Скачать Jabclipse – плагин для Eclipse, представлен в виде jar-файла.  Положить этот jar-файл в каталог eclipse\plugins.
  5. Запустить Eclipse.
  6. Открыть ‘Window –> Preference –> Java –> Jadclipse’.
  7. В текстовом поле ‘Path to Decompiler’ руками вписать прямой путь на жестком диске к ранее скачанному ‘jad.exe’. Сохранить.
  8. Открыть на просмотр любой java class. Рулез!
Categories: Мелочи Tags:

Клик по не самому последнему элементу (оси в xpath)

17 March 2011 17 comments

На странице таблица с несколькими колонками. В таблице представлен список категорий сайта.

Первая колонка – чекбоксы.

Вторая – линки на страницы настроек каждой категории.

Другие колонки – сейчас не важны.

Внизу есть кнопка действия над выбранными категориями.

Что-то вроде этого:

Задача: средствами Selenium выбрать чекбокс напротив категории, которую нужно обработать. И нажать на кнопку, что уже мелочь. Read more…

Записи с Selenium Camp в Киеве

26 February 2011 Leave a comment

Записи с конференции Selenium Camp, которая прошла 26 февраля 2011 в Киеве.

Categories: Мелочи Tags:

Selenium 2 для тестирования на мобильных девайсах

24 February 2011 Leave a comment

Была тут одна презентация того, что можно сделать с Selenium 2 в области тестирования с использованием мобильных приложений.

Below are some additional resources, including the recorded presentation, slides, and sample code. Feel free to pass these along to all your friends and colleagues who might be interested in mobile testing and Selenium 2.

XPath – cоединить два невложенных элемента

14 January 2011 3 comments

Есть код:

<div>
<label>Message:</label>
<span><textarea name="ContactUsForm_Comment"></textarea></span>
</div>

Я хочу записать assertElementPresent содержимого всего div одним движением.

Если проверяю только //label[contains(text(),’Message:’)] – то все ок.

Если проверяю только //textarea[@name=’ContactUsForm_Comment’] – тоже все ок.

Вопрос: как соединить проверку этих элементов в одно?

Проблема в том, что элементы label и textarea не вложены, а  находятся на одном уровне.

Решение: после первого элемента указываем “поднимись на один уровень и обратись ко второму элементу по порядку расположения“:

//div/label[contains(text(),’Message:’)]/../span/textarea[@name=’ContactUsForm_Comment’]