Skip to content

WebDriver – Поиск элементов на странице

ВВЕДЕНИЕ

Во время написания любого автотеста мы в большей степени будем работать с веб элементами на наших страницах. Для понимая как их находить сначала нужно вкратце разобраться что такое DOM.

DOM (от англ. Document Object Model — “объектная модель документа”) — это независящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому HTML, XHTML и XML документов.

Если провести аналогию с веб сайтами, то любая его страница это HTML документ, который имеет древовидную структуру, а программой является наш браузер, который умеет приводить наши документы к тому виду, что мы привыкли.

Чтобы увидеть HTML документ любой страницы нужно в браузере нажать на клавишу F12, для вызова консоли и выбрать вкладку Elements:

ЛОКАТОРЫ

Далее для работы с DOM объектами или в нашем случае веб элементами нам необходимо их точным образом определить (найти на странице). В этом нам помогут локаторы, которые являются командой в виде пути по нашему дереву к конкретному элементу (тегу в нашем HTML документе).

IWebElement elementName = driver.FindElement(By.LocatorStrategy("LocatorValue"));

LocatorStrategy – может быть любым из следующих значений:

  • Id
  • Name
  • ClassName
  • TagName
  • LinkText
  • PartialLinkText
  • XPath
  • CssSelector

Первые 3 (Id, Name, ClassName) являются значением соответствующих атрибутов внутри наших тегов:

TagName – как видно с названия мы можем искать один или несколько элементов по названию конкретного тега. Например чтобы найти все ссылки на нашей странице мы можем использовать другой webdriver метод FindElements, который возвращает нам в виде списка не один элемент, а все:

ReadOnlyCollection links = driver.FindElements(By.TagName("a"));

Остались 2 более сложных типа локаторов XPath и CssSelector, с помощью которых мы можем указывать полный или относительный путь по тегам, чтобы была возможность более точно определить элемент. Использовать эти типы нужно, когда у наших элементов нету уникальных значений атрибутов (id, class…) или текста.

Какой из них лучше использовать? По некоторым замерам CssSelectors имеют более высокую производительностью.

Также важным различием между CSS и XPath локаторами является то, что используя XPath, мы можем производить перемещение как в глубину DOM иерархии, так и возвращаться назад. Что же касается CSS, то тут мы можем двигаться только в глубину. Это значит, что с XPath можем найти родительский элемент, по дочернему.

КАК ПОСТРОИТЬ XPATH И CSSSELECTOR?

Поскольку наш автотест мы запускаем в Google Chrome, то и для поиска элементов будем использовать именно его.

Загружаем нужную нам страницу: https://www.wikipedia.org/

Нажимаем правой клавишей мыши на нужный нам элемент и вызываем контекстное меню Inspect. У нас в браузере откроется дополнительное окно (которое также можно вызвать нажатием клавиши F12) с подсвеченным в HTML документе элементом. Далее вызываем контекстное меню у нашего элемента -> Copy -> Copy XPath (или Copy selector):

Теперь нам нужно проверить наш локатор и при необходимости сократить его или отредактировать. Для этого в дополнительном окне переходим во вкладку Console и для Xpath вставляем скопированный путь в команду $x(“value”), а для CssSelector $(“value”):

Важно понимать, что в данном случае у нас указан не полный путь в дереве (от тега body и до нашего элемента), а относительный (сокращенный или без звеньев, которые не влияют на сам поиск), что позволяет быть менее зависимыми в случаях, когда HTML документ изменяется в процессе разработки.

Приведу несколько самых распространенных примеров построения локаторов:

CSS локаторы

Абсолютный путь:"html body div div form input"

Относительный путь: "input"

Поиск непосредственного дочернего элемента: "div > a"

Поиск дочернего элемента любого уровня: "div a"

Поиск по ID элемента: "#username"

Поиск по классу: ".classname"

Поиск по значениям атрибутов html тегов: "img[alt='Previous']"

Поиск по названию атрибутов: "img[alt]"

Поиск по началу строки:  "header[id^='page-']"

Поиск по окончанию строки: "header[id$='page-']"

Поиск по частичному совпадению строки: "header[id*='page-']"

XPath локаторы

Абсолютный путь: "html/body/div/div/form/input"

Относительный путь: "//input"

Поиск непосредственного дочернего элемента: "//div/a"

Поиск дочернего элемента любого уровня: "//div//a"

Поиск элемента по тексту: ".//*[text()='Первая ссылка']/.."

Поиск по значениям атрибутов: "//input[@id='username']"

Поиск по названию атрибутов: "img[@alt]"

Поиск родительского элемента: "//input[@id='username']/.."

С построением разнообразного пути и разницей между типа локаторов можно ознакомиться в сравнительной таблице по ссылке или в сгруппированной схеме.

Попрактиковаться в поиске элементов можно по ссылке: CONTROLS PAGE

Leave a Reply

Your email address will not be published. Required fields are marked *