Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Использование локаторов (locators) в Selenium. Часть 1


(Mykhailo Poliarush) #1

Что такое локаторы элементов и для чего они нужны? 

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

  • Команда (Command)
  • Цель (Target)
  • Значение (Value)
Например, открытие сайта http://google.com.ua. 
{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; } <tr> <td>open</td> <td>http://google.com.ua/</td> <td></td> </tr>{/syntaxhighlighter}
Для большинства команд требуется наличие локатора элемента, который указывается в target.

Какие локаторы используются в Selenium?

  • identifier
  • id
  • name, и уточняющие фильтры
  • link
  • dom    
  • xpath  
  • link  
  • css
  • ui 
В данной статье будут описанны: identifier, id, name, link, фильтры. Остальные локаторы будут описаны во второй части.

Общая форма локатора

locatorType=argumentгде locatorType – это тип локатора, argument – это выражение

Как использовать локаторы?

Заметка: Все примеры будут проиллюстрированны на странице http://google.com.ua с использованием Selenium Core. Если вы не знакомы с Selenium Core, то вам будет полезно узнать, как писать простые тесты с нуля. Что нам нужно, это HTML страницы, которая будет тестироваться настроенный инструментарий с которым уже можно попрактиковаться.

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

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Empty Test</title> </head> <body> <table cellpadding="1" cellspacing="1" border="1"> <tr> <td>open</td> <td>http://google.com.ua/</td> <td></td> </tr> </table> </body> </html>{/syntaxhighlighter}

identifier

Выбирает элемент, атрибут @id которого соответствует, какому-то идентификатору. Если элемента с таким атрибутом нет, то будет выбран первый элемент, у которого значение атрибута @name будет соответствовать искомому. Думаю, тут все просто. Алгоритм таков, ищем нужный элемент и смотрим, что бы у него был атрибут @id. Например, что ищем: 

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<div id="gbar">{/syntaxhighlighter}

Код для тестирования: 

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; } <tr> <td>highlight</td> <td>identifier=gbar</td> <td></td> </tr>{/syntaxhighlighter}

id

Все тоже самое, что и для локатора identifier, только в данном случае выбирается строго по атрибуту @id без всяких условий. Например, что ищем: 

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<div id="guser" width="100%">{/syntaxhighlighter}

Код для тестирования: 

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; } <tr> <td>highlight</td> <td>id=guser</td> <td></td> </tr>{/syntaxhighlighter}

name

Выбирает элемент, атрибут @name которого соответствует, какому-то значению. Например, что ищем: 

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<form name="f" action="/search">{/syntaxhighlighter}

Код для тестирования:

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; } <tr> <td>highlight</td> <td>name=f</td> <td></td> </tr>{/syntaxhighlighter}

Фильтры 

Также, для локатора типа name можно использовать фильтры по значению элемента и по индексу, для того, что бы уточнить поиск. Например, по атрибуту @name выбирается несколько элементов, а нужно выбрать всего лишь один, то можно добраться до нужного элемента по индексу index=some_index (порядковый номер элемента, нумерация ведется сверху вниз по HTML документу) или по значению элемента value=some_value. Формат фильтра подобный формату локатора filterType=argument. Фильтр указуется сразу же после определелния name локатора. Также, есть возможность указания фильтра по умолчанию (по значению элемента), т.е. можно не указывать выражение value=, а сразу писать его значение. Например, что ищем:

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<input id="all" type="radio" checked="" value="" name="meta"/> <label for="all"> Інтернет </label> <input id="lgr" type="radio" value="lr=lang_uk" name="meta"/> <label for="lgr"> сторінки українською мовою </label> <input id="cty" type="radio" value="cr=countryUA" name="meta"/> <label for="cty"> сторінки з України </label>{/syntaxhighlighter}

Код для тестирования:

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<!--Фильтр по индексу--> <tr> <td>highlight</td> <td>name=meta index=2</td> <td></td> </tr> <!--Фильтр по значению элемента--> <tr> <td>highlight</td> <td>name=meta value=cr=countryUA</td> <td></td> </tr> <!--Фильтр по умолчанию--> <tr> <td>highlight</td> <td>name=aq f</td> <td></td> </tr>{/syntaxhighlighter}

link

Выбирает элемент, название ссылки, которой соответствуюет искомому тексту. Например, что ищем:

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<a href="/url?sa=p&pref=ig&pval=3&q=http://www.google.com.ua/ig%3Fhl%3Duk%26source%3Diglk&usg=AFQjCNFP4lumd9xRSofuiLLkCCiUnMXZ2g">iGoogle</a>{/syntaxhighlighter}

Код для тестирования:

{syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; } <tr> <td>highlight</td> <td>link=iGoogle</td> <td></td> </tr>{/syntaxhighlighter}

Сборник полезных ссылок по локаторам