Selenium 2.0: сотня полезных советов - примеры выпусков |
04.04.2012 23:44 |
Как вы уже, наверное, знаете, мы запускаем новую закрытую рассылку “Selenium 2.0: сотня полезных советов“. Чтобы было более понятно, каково будет её содержимое, мы решили рассказать об этом чуть подробнее и привести несколько примеров. Рассылка начнет выходить в конце мая, сразу после окончания тренинга “Все секреты и тайны Selenium 2.0”. Для участников курса она будет содержать дополнения и повторения и позволит закрепить материал тренинга. Но она будет также доступна и не менее полезна тем, кто не принимал участие в тренинге. Каждый день в течение почти полугода вы будете получать в почтовый ящик небольшой кусочек кода с пояснениями. Прочтение его не займет более двух минут, а если вы захотите попробовать его выполнить, вы потратите на это минут десять. Но через полгода таких ежедневных тренировок вы будете свободно обращаться с этим замечательным инструментом. Примеры будут касаться самых разных аспектов работы с Selenium 2.0. Одни короче, другие длинее. Одни попроще, другие посложнее. Ниже приведено три примера таких советов (а их будет целая сотня!) Вот очень простой и короткий совет: 1. Как запустить Firefox с подключенным плагином Firebug? FirefoxProfile profile = new FirefoxProfile(); Аналогичным образом вы можете подключить и другие плагины. Но помните о том, что чем больше плагинов, тем дольше будет стартовать браузер, тем больше памяти он будет потреблять. Не подключайте лишние плагины без необходимости. А вот совет подлиннее, и с неоднозначными рекомендациями – вам придется самим подумать, какой из двух предложенных вариантов работы с 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> и ссылок <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” (и, кстати, рассылку при этом вы тоже получите!) |