Selenium: знакомимся с локаторами и выбираем правильный


(Mykhailo Poliarush) #1

При работе с Селениумом практически первое, с чем придется столкнуться - это локаторы. Что это такое? Локатор - это строка, уникально идентифицирующая UI-элемент. Когда вы делаете клик мышкой, ввод текста и прочие действия, вы эти действия выполняете над вполне конкретным объектом. Селениум поступает так же. Но поскольку он не умеет читать ваши мысли, то ему надо четко указать объект, для которого надо применить то или иное действие.

Где локаторы используются? Посмотрите на методы, отвечающие за ввод/извлечение данных из элементов управления (это методы click, type, select, isElementPresent, keyPress и т.п.). Первым параметром подобных методов всегда идет локатор.

Итак, какие виды локаторов бывают:

  • id=<element_id> - соответствует элементу, у которого атрибут id равен значению element_id. Например, у нас есть элемент, который в HTML записывается так:
    <input type=text id='some_input_id' name='some_input_name' value='' /> В этом случае локатор будет иметь вид: id=some_input_id.
    Также следует отметить, что данный вид локаторов является одним из самых быстрых в нахождении и одним из самых уникальных. Это связано с тем, что в DOM-структуре ссылки на элементы, у которых задан ID, хранятся в отдельной таблице и через JScript (собственно именно через него осуществляется доступ к элементам на конечном уровне) обращение к элементам по ID идет достаточно короткой инструкцией, наподобие some_input_id.
  • name=<element_name> - соответствует элементу, у которого атрибут name равен значению element_name. Эффективно применяется при работе с полями ввода формы (кнопки, текстовые поля, выпадающие списки). Как правило, значения элементов формы используются в запросах, которые идут на сервер и как раз атрибут name в этих запросах ставит в соответствие поле и его значение. Если брать предыдущий пример:
    <input type=text id='some_input_id' name='some_input_name' value='' /> то данный элемент может быть также идентифицирован локатором вида name=some_input_name.
    Данный тип локаторов тоже является достаточно быстрым в нахождении, но менее уникальным, так как на странице может быть несколько форм, у которых могут быть элементы с одинаковым именем.
  • dom=<dom_object> - данный тип локатора позволяет обращаться к элементу так же, как и в DHTML используя DOM-структуру. Данный тип локатора используется нечасто, так как обычно находятся более удобные аналоги, но тем не менее данная возможность есть.
  • link=<link_text> - специально для ссылок используется отдельно зарезервированный тип локаторов, который находит нужную ссылку по ее тексту. Это сделано отчасти потому, что ссылки как правило не имеют таких атрибутов как ID или name. Соответственно, ссылка, которая в HTML записывается так:
    <a href='http://some_url'>Link Text 2345</a>
    в Селениуме идентифицируется локатором link=Link Text 2345.

    И небольшой частный случай: у ссылки есть фиксированная часть и есть часть, которая может варьироваться. Допустим, в предыдущем примере у нас число может варьироваться. В этом случае мы можем использовать wildcards, в частности '*'. В этом случае, мы можем идентифицировать ссылку локатором вида: link=Link Text* и данный локатор будет соответствовать первой ссылке, текст которой будет начинаться с 'Link Text'.
  • xpath=<xpath_locator> - наиболее универсальный тип локаторов. Как XPath формируется. HTML, как и его более обобщенная форма - XML, представляет собой различное сочетание тегов, которые могут содержать вложенные теги, а те в свою очередь тоже могут содержать теги и т.д. То есть ,выстраивается определенная иерархия, наподобие структуры каталогов в файловой системе. И задача XPath - отразить подобный путь к нужному элементу, с учетом иерархии. Например, XPath вида:
    A/B/C/D указывает на некоторый элемент с тегом D, который находится внутри тега C, а тот в свою очередь - внутри тега B, который находится внутри тега A, который находится на самом верхнем уровне иерархии.

    Если брать использование XPath в Селениуме, то там зачастую полный путь указывать не нужно, более того, вредно, особенно, если вложенность тега нужного елемента достаточно высока. Как правило, удобно указывать путь, начиная с некоторого промежуточного элемента, пропуская теги более высокого порядка. Например, такой XPath: //table/tbody/tr/td/a ссылается на первую ссылку в первой строке тела первой таблицы. Обратите внимание на начало данной записи. Строка '//' означает, что поиск элемента начинается с некоторого произвольного места.

    У XPath есть много удобств, но есть и основной недостаток - низкая скорость нахождения объекта. В частности, с подобной проблемой можно столкнуться при работе с IE, так как при работе с XPath под IE используются JScript-библиотеки, которые не отличаются высокой скоростью выполнения. В таких случаях рекомендуется воспользоваться CSS-локаторами (см. ниже), но в некоторых случаях от XPath уйти не получится.

    Более подробно про синтаксис XPath можно почитать, например, здесь.
  • css=<css_path> - данный тип локаторов основан на описаниях таблиц стилей (CSS), соответственно и синтаксис такой же. В отличие от локаторов по ID, по имени или по тексту ссылки, данный тип локаторов может учитывать иерархию объектов, а также значения атрибутов, что делает его ближайшим аналогом XPath. А в силу того, что объект находится по данному локатору быстрее, чем XPath, рекомендуется прибегать к помощи CSS вместо XPath.

    Более подробно о синтаксисе CSS можно узнать здесь.

Это основные типы локаторов. Если этого недостаточно, то можно добавить свою стратегию идетнификации элементов, но это отдельная тема. Единственное, что осталось отметить - это тип локаторов, который определяется по умолчанию. В частности, если мы используем локатор, в котором явно не указан тип локатора (отсутствует префикс id=, name=, link=, xpath=, css= и т.п.), то по умолчанию подбирается локатор по следующим правилам:

  1. Если локатор начинается с '//', то используется XPath.
  2. Если нет какого-либо префикса, то элемент ищется по ID
  3. Если элемент с заданным ID отсутствует, то элемент ищется по атрибуту name.

Вот та база, которую желательно знать при работе с локаторами в Selenium.


Сборник полезных ссылок по локаторам
(Mike) #2

В "про синтаксис XPath можно почитать, например, здесь." и "о синтаксисе CSS можно узнать здесь." ссылки ЗДЕСЬ не работают.


(Mykhailo Poliarush) #3

Спасибо, что сообщили. Да ссылки были битыми, уже все работает.


(Vadim Kovrizhkin) #4

На данный момент ссылки опять не работают.


(Mykhailo Poliarush) #5

Поправили