Немного(или много) будем говорить о локаторах.
Итак, давайте начнем с основ. Для автоматизированного тестирования мы используем Selenium WebDriver - драйвер, позволяющий писать программы для управления действиями web браузера (Firefox, Chrome и т.д.) Взаимодействие с web драйвером выполняется путём обращения к нему некоторыми методами, определяющими его действие. Например:
findElement - (поиск элемента на странице)
Так вот, Selenium WebDriver не умеет читать наши мысли, ему надо четко указать объект, для которого необходимо применить то или иное действие.
Теперь о видах локаторов:
1) 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.
2) name=<element_name> - соответствует элементу, у которого атрибут name равен
значению element_name. Эффективно применяется при работе с полями ввода формы
(кнопки, текстовые поля, выпадающие списки). Как правило, значения элементов формы
используются в запросах, которые идут на сервер и как раз атрибут name в этих
запросах ставит в соответствие поле и его значение. Если брать предыдущий пример:
<input type=text id='some_input_id' name='some_input_name' value='' />
Данный элемент может быть также идентифицирован локатором вида name=some_input_name.
Этот тип локаторов тоже является достаточно быстрым в нахождении, но менее
уникальным, так как на странице может быть несколько форм, у которых могут быть
элементы с одинаковым именем.
3) link=<link_text> - специально для ссылок используется отдельно зарезервированный
тип локаторов, который находит нужную ссылку по ее тексту. Это сделано отчасти
потому, что ссылки как правило не имеют таких атрибутов как ID или name.
Соответственно, ссылка, которая в HTML записывается так:
<a href='http://some_url'>Link Text 2345</a>
В Selenium идентифицируется локатором link=Link Text 2345.
И небольшой частный случай:
У ссылки есть фиксированная часть и есть часть, которая может варьироваться.
Допустим, в предыдущем примере у нас число может варьироваться. В этом случае мы
можем использовать wildcards, в частности '*'. Мы можем идентифицировать ссылку
локатором вида: link=Link Text*
и данный локатор будет соответствовать первой ссылке, текст которой будет
начинаться с 'Link Text'.
4) xpath=<xpath_locator> - наиболее универсальный тип локаторов.
Как XPath формируется - HTML, как и его более обобщенная форма - XML, представляет
собой различное сочетание тегов, которые могут содержать вложенные теги, а те в
свою очередь тоже могут содержать теги и т.д. То есть ,выстраивается определенная
иерархия, наподобие структуры каталогов в файловой системе. И задача XPath -
отразить подобный путь к нужному элементу, с учетом иерархии. Например, XPath вида:
A/B/C/D указывает на некоторый элемент с тегом D, который находится внутри тега C,
а тот в свою очередь - внутри тега B, который находится внутри тега A, который
находится на самом верхнем уровне иерархии.
5) css=<css_path> - данный тип локаторов основан на описаниях таблиц стилей
(CSS), соответственно и синтаксис такой же. В отличие от локаторов по ID, по
имени или по тексту ссылки, данный тип локаторов может учитывать иерархию
объектов, а также значения атрибутов, что делает его ближайшим аналогом XPath.
А в силу того, что объект находится по данному локатору быстрее, чем XPath,
рекомендуется прибегать к помощи CSS вместо XPath.
Выглядит все это примерно вот так:
Java
WebElement form1 = driver.findElement(By.id("login-form"));
WebElement form2 = driver.findElement(By.tagName("form"));
WebElement form3 = driver.findElement(By.className("login"));
WebElement form4 = driver.findElement(By.cssSelector("form.login"));
WebElement form5 = driver.findElement(By.cssSelector("#login-form"));
WebElement field1 = driver.findElement(By.name("username"));
WebElement field2 = driver.findElement(By.xpath("//input[@name='username']"));
WebElement link = driver.findElement(By.linkText("Logout"));
List<WebElement> links = driver.findElements(By.tagName("a"));
Для CSS и XPath есть отличные, такие подсказки как выбрать тот или иной локатор.
Но это была теория которую тоже надо знать а теперь немного практики.
Локатор можно выбрать с помощю SeleniumIDE в FireFox-e если совсем туго вначале. Просто запускаем селениум и кликаем на элемент локатор которого хотим выбрать и в СеленуимИДЕ можно посмотреть разного рода локаторы того по чему мы кликнули. Вот так например выглядят локаторы кнопки “Поиск в Google”
Ну, а что бы правильно и безошибочно начать их выбирать. Это как говорится только через “Опыт - сын ошибок трудных” )) Ну удачи мне в этом деле ;)