Разделы портала

Онлайн-тренинги

.
Selenium 2.0: сотня полезных советов - примеры выпусков
04.04.2012 23:44

Как вы уже, наверное, знаете, мы запускаем новую закрытую рассылку “Selenium 2.0: сотня полезных советов“. Чтобы было более понятно, каково будет её содержимое, мы решили рассказать об этом чуть подробнее и привести несколько примеров.

Рассылка начнет выходить в конце мая, сразу после окончания тренинга “Все секреты и тайны Selenium 2.0”. Для участников курса она будет содержать дополнения и повторения и позволит закрепить материал тренинга. Но она будет также доступна и не менее полезна тем, кто не принимал участие в тренинге. Каждый день в течение почти полугода вы будете получать в почтовый ящик небольшой кусочек кода с пояснениями. Прочтение его не займет более двух минут, а если вы захотите попробовать его выполнить, вы потратите на это минут десять. Но через полгода таких ежедневных тренировок вы будете свободно обращаться с этим замечательным инструментом.

Примеры будут касаться самых разных аспектов работы с Selenium 2.0. Одни короче, другие длинее. Одни попроще, другие посложнее. Ниже приведено три примера таких советов (а их будет целая сотня!)

Вот очень простой и короткий совет:

1. Как запустить Firefox с подключенным плагином Firebug?

FirefoxProfile profile = new FirefoxProfile();
profile.addExtension(new File(“firebug-1.8.0.xpi”));
WebDriver driver = new FirefoxDriver(profile);

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

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

2. Что лучше – сложный XPath/CSS запрос или цепочка простых запросов?

Давайте рассмотрим какой-нибудь “сложный” XPath-запрос (то есть состоящий из нескольких частей):

driver.findElement(By.xpath(“//div[@id='container']//a”)).click();

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

driver.findElement(By.id(“container”)).findElement(By.tagName(“a”)).click();

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

1). Выражение, использующее сложный запрос, получается более коротким и поэтому более “ёмким”, его можно охватить одним взглядом. Цепочка – длинная, и чем сложнее запрос, тем длиннее получается цепочка, иногда она вытягивается на несколько строк.

2). Сложный запрос можно предварительно отладить, используя плагины к браузеру, такие как firepath или firefinder. С цепочкой так поступить не получится.

3). Зато если во время выполнения тестов элемент не находится – цепочка более точно сообщает, что именно не нашлось: вот этот элемент в цепочке ещё есть, и вот этот тоже, а вот этого уже нет. То есть диагностика проблем получается более точной и локализованной.

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

А теперь – совет, который связан с предыдущим (да, они часто будут связаны друг с другом):

3. Как найти “родительский элемент”?

Предположим, ваш HTML-документ содержит следующий фрагмент, и вам надо кликнуть на ссылку, находящуюся в этом фрагменте:

<div>
<div id=”inner-block”>some text</div>
<div>some other text</div>
<a href=”http://example.com/”>some link</a>
</div>

Конечно же в документе много других блоков <div> и ссылок <a>, и при этом хочется написать достаточно надёжный локатор.

Возникает естественное желание, “привязаться” к находящемуся рядом элементу, имеющему уникальный идентификатор “inner-block”. Но искомая ссылка находится не внутри этого блока, а внутри его “родительского” или “объемлющего” блока.

Чтобы найти этот объемлющий блок, можно использовать различные стратегии, ниже предложены два варианта решения этой задачи.

1) XPath-запрос “с подзапросом”:

driver.findElement(By.xpath(“//div[div[@id=inner-block]]//a”)).click();

2) Получение родительского элемента:

driver.findElement(By.xpath(“//div[@id=inner-block]/..//a”)).click();

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

1) Подзапросы сложно писать и сложно отлаживать. Длинный XPath-запрос, не содержащий подзапросов, можно отлаживать постепенно, добавляя одну часть за другой, и на каждом этапе проверять, что он находит нужный элемент. Запрос, содержащий вложенные подзапросты, так отлаживать не получается.

2) Подзапрос будет выполняться для всех найденных div, это менее эффективно, чем искать div с заданным идентификатором, то есть второй способ в среднем будет работать быстрее.

3) Запросы с подзапросами не получается “вытягивать в цепочку” (см. предыдущий совет).

Хотите “незаметно” стать профессионалом в использовании Selenium, тратя на это каждый день по десять минут?

Подпишитесь на рассылку прямо сейчас!

А если не хотите ждать полгода – добро пожаловать на тренинг “Все секреты и тайны Selenium 2.0” (и, кстати, рассылку при этом вы тоже получите!)