Archive

Archive for the ‘Элегантные решения’ Category

Firefox 54, а там посмотрим

19 September 2017 Leave a comment

Ну…

Firefox 55 and Selenium IDE

The bad news: from Firefox 55 onwards, Selenium IDE will no longer work.

The reasons for this are complex, but boil down to two main causes:

Browsers are complicated pieces of software that are constantly evolving. Mozilla has been working hard to make Firefox faster and more stable, while still retaining the flexibility and ease of extension that we’ve come to know and love. As part of that process, Firefox is switching extensions from the original “XPI” format, to a newer, more widely adopted “Web Extension” mechanism.

The Selenium project lacks someone with the time and energy to move the IDE forwards to take advantage of the new technologies.

Ну, ок, я пока притормозил обновления Firefox, №54 работает норм.

Внезапно вываливающийся список

1 September 2014 24 comments

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

И чтобы вообще огорчить тестировщиков — список этот появляется под полем адреса только при наборе текста, а Selenium IDE такие мансы очень не любит.

Но ведь тестировщики сами могут кого угодно огорчить.

Итак, у нас есть поле ввода с id=billing_full_address, при наборе текста туда должен подтянуться целый список адресов, а затем в выпадающем списке с адресами надо будет кликнуть по тестовому адресу ‘1 Darling Mills Road, ALBION PARK  NSW  2527‘.

01-09-2014 - 17-32-18

Алгоритм:

  • впишем в этом поле начало адреса, который нужно будет получить в списке всех адресов,
  • эмулируем нажатие клавиш (можно даже передавать нажатие определенных клавиш, есть в сети полная таблица кодов),
  • дожидаемся появления ссылки с нужным адресом,
  • кликнем по ссылке с нужным адресом.
type id=billing_full_address 1 Darling island
keyDown id=billing_full_address w
keyPress id=billing_full_address w
keyUp id=billing_full_address w
waitForElementPresent //a[contains(text(),’1 Darling Mills Road, ALBION PARK  NSW  2527′)]  
click //a[contains(text(),’1 Darling Mills Road, ALBION PARK  NSW  2527′)]  

Делов-то…

И давай всех эндорсить

24 December 2012 4 comments

На LinkedIn есть прекрасная возможность тупо эндорсить (слово легко переводимое в приличном обществе, но блин!) всех в своем круге знакомств не глядя, нажатием на кнопку.

А после того, как заэндорсил знакомого, появляется предложение эндорсить (вот ведь слово блядское) сразу четверых знакомых, нажатием на кнопку ‘Endorse all 4″.

endorseThem

Кнопка эта хитрая: обычная команда click по ней не срабатывает.

Срабатывает следующий трюк:

listPagesInTableForSearchExpectedWord
label start
mouseDownAt css=button.btn-action.endorse-all-btn
click css=button.btn-action.endorse-all-btn
pause 1000
gotolabel start

Готово.

Можно эндорсить ВСЕХ своих знакомых, не глядя.

По завершению эндорсирования кнопка исчезнет ВНЕЗАПНО, поэтому стоит озаботиться тем, чтобы скрипт посредством постоянной проверки наличия кнопки завершил свою работу достойно.

О, хитрая дрянь! Клик по кнопке JQuery

21 May 2012 6 comments

В мире все ещё много дряни. Вот, например, кнопки, реализованные с помощью jQuery: курсором по ней кликать можно, а через Selenium – увы.

Кнопка, расположенная под текстовым полем, представляет из себя нечто вот такое:

<div  class=”judge”>
<button class=”win-button disabled“>
……….<span class=”out”><span class=”button”>Поделиться</span></span>
</button>

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

<div  class=”judge”>
<button class=”win-button“>
……….<span><span>Поделиться</span></span>
</button>

В момент нажатия на кнопку локатор снова меняется:

<div  class=”judge”>
<button class=”win-button pushed“>
……….<span><span>Поделиться</span></span>
</button>

А когда кнопка будет “освобождена”, локатор вообще невообразимо превращается в

<div  class=”judge disabled“></div>

То есть, кнопка вообще исчезает. Коммент сделан, Рубикон брошен на игральный стол (все же знают, что такое кубик Рубикона, не так ли?!)

В общем, не в локаторах проблема. Проблема в том, что Selenium IDE для клика на такие нестандартные кнопки требуется нестандартный подход.

Секрет Дело в том, что эта кнопка реагирует на событие mouseUp и mouseDown.

Рассмотрим работу подобных неурядиц на живом примере: сегодня DOU.ua будет нашей подопытной крыской.

Read more…

Код с 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.

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

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

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

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

17 March 2011 17 comments

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

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

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

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

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

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

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

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’]