пятница, 23 октября 2009 г.

Selenium. Используем мощность jQuery

Использовать замечательные возможности библиотеки jQuery в рабте с Selenium можно как мининмум двумя способами: либо расширяя возможность нахождения элемента (Location Strategy), либо просто используя выражения jQuery для ветвления или модификации страницы. Оба из них просты и действительно полезны. Рассмотрим каждый с пристрастием.

Однако, прежде чем приступить, обеспечим, чтобы jQuery был доступен для Selenium RC. Для этого добавим загрузку скрипта библиотеки в файл RemoteRunner.html, который можно отыскать открыв selenium-server.jar (папка /core). Выглядеть это может так:

<script language="JavaScript" type="text/javascript" src="xpath/javascript-xpath-0.1.11.js"></script>
<script language="JavaScript" type="text/javascript" src="scripts/user-extensions.js"></script>
<script language="JavaScript" type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script>


Либо можно скачать нужную версию библиотеки и разместить ее локально:

<script language="JavaScript" type="text/javascript" src="xpath/javascript-xpath-0.1.11.js"></script>
<script language="JavaScript" type="text/javascript" src="scripts/user-extensions.js"></script>
<script language="JavaScript" type="text/javascript" src="scripts/jquery.js"></script>


После редактирования JAR архив следует запаковать обратно. Подготовка окончена.

1. Расширение Location Strategy

Сия манипуляция проводится с помощью строчки:

selenium.addLocationStrategy("jquery", "return $(locator,inDocument).get(0);");


Ее нужно поместить заранее перед применением Location Strategy.
Теперь подробнее. "jquery" - это название новой Location Strategy, то есть теперь можно будет находить элемент, используя jQuery синтаксис, например, вот так:

selenium.click("jquery=#parent #child:contains('soul')");


Selenium произведет клик по элементу с id="child", который унаследован от элемента c id="parent" и к тому же содержит текст "soul". То есть, как уже становится понятно, насколько причудливо и изящно можно обращаться к элементам страницы.

Реализация стратегии здесь самая простая "return $(locator,inDocument).get(0);". locator - это та часть строки, которая после "jquery=" в нашем обращении. inDocument ссылается на текущий активный документ. get(0) - возвращает обычный DOM объект, с которым и работает Selenium. При желании, эта часть может быть расширена, хотя у меня такой необходимости не возникало.

2. Использования jQuery выражений

Предположим, что нам нужно переместить фокус на некое поле "name":

selenium.getEval("$('#name', window.document).focus();");


Такой простой функции в Selenium нет, поэтму пример может быть актуален. Что мы делаем? Функция getEval() выполняет JavaScript выражение, где и находтится наш jQuery. Важно только обратить внимание, что в функцию $ передается второй аргумент window.document - он необходим, поскольку по умолчанию Selenium будет выполнять JavaScript не для тестируемого окна, а для самого окошка RemoteRunner.