Archive

Archive for May, 2010

Драгэндропим!

Selenium IDE обновился до 1.0.7

Основное, очень мощное новшество: можно перетаскивать строки в таблице кейсов, и сами кейсы в таблице сьюта.

Categories: Мелочи Tags:

Легкий прицел по целям

Бывает такая проблема:

на странице несколько одинаково идентифицируемых элементов, а надо прицелиться во второй (или пятый).

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

Уточню ситуацию в моем приложении: кнопка “Купить” оформлена в виде обычного линка. Но по-умолчанию на каждой продуктовой странице есть блок с “похожими товарами”, которые тоже снабжены точно такими же линками “Купить”…

Read more…

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

25 May 2010 1 comment

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

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

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

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

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

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

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

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

Read more…

Сокращение XPath – клик по тексту

Бывает так, что некоторые линки на странице настолько закрыты жаваскриптами, что Selenium IDE или записывает клики по ним в виде //html[@id=’js’]/body/table[2]/tbody/tr/td[2]/div[4]/div[1]/div/table[1]/tbody/tr/td/a/i, или вообще не может записать клик.

Ситуация:

1) на странице есть линк “details”, который открывает страницу или слой на странице с дополнительными данными, которые по-AJAX подсасываются с сервера, не открывая для этого отдельное окно браузера.

2) этот линк на странице уникален.

3) но конструкция у этого линка хитрая. Класс у него указан такой: class=”carticon item_addtocart”, и меняется в зависимости от некоторых условий (с какой страницы пришел, например). То есть, в эту минуту класс именно такой, какой был указан, а через некоторое время он же будет выглядеть как class=”carticon item_addtocart search_engine_guest”, или как-то еще. Записывать все эти состояния нет нужды, цель в том, чтобы клик по линку срабатывал правильно.

4) конструкция | click | link=details | в силу некоторых технологических причин (гребанный AJAX) невозможна.

Шо делать?

Read more…

Categories: XPath

Нулевая скорость при полном разгоне

18 May 2010 4 comments

К приложению, к тестированию которого сейчас прилагаются мои усилия, бесплатно прилагается ядрённый батон функционал в виде AJAX.

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

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

Уж мы и clickAndWait используем, и жесткие паузы, и мягкие waitForTextPresent – но трабла имеет место быть.

Позавчера методом злобного от бессилия тыка обнаружилось, что если перед прогоном некоторых тест-сьютов выставлять скорость выполнения кликов в режиме середины между Fast и Slow, то дела с тестированием посредством браузера слегка налаживаются.

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

Сегодня выяснилось, что в Selenium IDE есть команда, которая самостоятельно насильно устанавливает определенную скорость выполнения скриптов – setSpeed:

setSpeed | 500 |

Живьем выглядит вот так:

Допустимые значения находятся в диапазоне миллисекунд: 0-1000.

  1. При нуле Selenium IDE самостоятельно передвигает свой регулятор скорости на Fast и максимально ускоряется.
  2. При 500 Selenium IDE передвигает регулятор скорости на половину и уверенно пашет.
  3. При 1000 (можно, но ненужно указывать и более значение) Selenium IDE передвигает регулятор скорости на четкий Slow и медленно, но уверенно пашет.
Categories: Мелочи Tags:

Selenium IDE как артефакт пикника на обочине

Обычные, адекватные люди (it crowd programmers) при необходимости создать ряд автоматизированных тестов в рамках OpenSource инструментов используют для записи и прогона автоматизированных тестов нечто вроде Selenium IDE + JAVA + Selenium RC + Eclipse.

Алгоритм:

  1. Запускаем Selenium IDE и кликаем по приложению.
  2. Полученный код конвертируем на язык программирования, которым владеем.
  3. Переносим этот код в среду разработки.
  4. Превращаем куски этого кода в отдельные методы и разруливаем ситуацию по своему усмотрению.
  5. Запускаем тест-сьюты и отстраненно наблюдаем за ходом работы Selenium RC.

Я использую только первые два хода, затем не совсем стандартно разруливаю ситуацию непосредственно в Selenium IDE:

  1. Запускаю Selenium IDE и кликаю по приложению.
  2. Полученный код подправляю, снабжая его комментариями и дополнительными проверками.
  3. Полученный итоговый код разбиваю на логические сущности, которые можно выносить в отдельные файлы (по-ситуации).
  4. Выносимые файлы располагаются в разных каталогах, собранных в упорядоченную логическую структуру. Во всех подобных файлах используются переменные. Все подобные файлы используются и в других тест-сьютах.
  5. Собираю отдельный тест-сьют для проверки отдельного сценария.
  6. Выношу содержимое нужных мне переменных в отдельный html файл, который содержит команды StoreExpression и StoreEval (по ситуации).
  7. Запускаю отельные тест-сьюты при необходимости, а не все сразу один за другим, как это обычно делается.

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

Изначально именно это я и хотел сделать , но бизнес у меня это дело не заказывал. Заказ был на ручное, функциональное тестирование, которое я ускорил за счет применения Selenium IDE.

Поднимать и в дальнейшем поддерживать отдельный тестовый фреймворк, слава Баранцеву, можно. Но в моем случае – не нужно. У меня относительно малые тесты то и дело все еще падают от столкновений с особенностями Ajax, и ковыряться в большом спагетти-приложении мне совсем не хочется, да и не просят.

Нужен помощник, а не тиран.

Selenium IDE отлично работает в качестве помощника, но он снабжен одной странностью, которую я не могу объяснить.

Эта странность уже дала мне ощутимое конкурентное преимущество перед моим предыдущим уровнем тестирования, но побороть ее пока не представляется возможным.

Странность в том, что совершенно адекватное поведение тула проявляется только в связке Selenium IDE + Ubuntu, и совершенно не работает в связке Selenium IDE + Windows.

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 в данном случае).