XPath локаторы в Selenium WebDriver

Preview:

DESCRIPTION

XPath locators in Selenium WebDriver

Citation preview

XPath локаторы в Selenium

WebDriver

Докладчик

Кожухов Илья, Специалист по качеству

k.i.a88@mail.ru

Skype: ra_007

1. Вводная часть• термины, определения• XPath в браузере

2. Язык XPath3. Построение локаторов в Selenium

1

0%

• XPath – язык запросов к элементам XML-документа

• Selenium WebDriver –  инструмент для автоматизированного управления браузерами

• Локатор – строка, уникально идентифицирующая элемент веб-страницы

Терминология

Инженер по тестированию задает в Selenium последовательность действий

• Открыть страницу• Произвести действие • Проверить результат

Локаторы в Selenium

С помощью локаторов Selenium «понимает» с каким веб-элементом производить действие

Локаторid

name

CSS

XPath

className

tagName linkText

partialLinkText

Локаторы в Selenium

• XML – расширяемый язык разметки• XPath – путь к элементу xml• HTML – язык разметки Web-документа• DOM – объектная модель документа, в

частности HTML • XPath – осуществляет навигацию по DOM

XPath

<div id="create" > Создать </div>

Элемент

Атрибут Текст

Артефакты DOM

в

Инструменты разработчика

Elements

Ctrl + F

Вызвать Инструменты разработчика:• F12• Ctrl+Shift+I• Настройки – Инструменты –

Инструменты разработчика

XPath в Chrome

• $x(path) – принимает ХPath в качеств параметра и возвращает массив элементов

• $0 … $4 – доступ к последним вызванным DOM - элементам

XPath в консоли браузера

1. Вводная часть2. Язык XPath• абсолютный путь• относительный путь• условия• оси• функции• операторы

3. Построение локаторов в Selenium

2

15%

<A> <B> <C/> </B></A>

A/B/C

XPath. Абсолютный путь

Путь от корневого элемента

XPath

XML

Если использовать только абсолютный путь

<A> <B> <C/> </B></A>

//C

Относительный путь не учитывает промежуточные элементы

XPath. Относительный путь

<A> <B> <C> </C> <C> </C> </B></A>

//C

XPath. Относительный путь

Может быть несколько элементов

<A> <B> <C> </C> <C> </C> </B></A>

//C[1]

В скобках [] заключены условия выборки

XPath. Условия

<A> <B> <C id> </C> <C> </C> </B></A>

//C[@id]

XPath. @ - атрибут

Будут выбраны все элементы, имеющие атрибут "id"

<A> <B> <C id="one"> </C> <C id="two"> </C> </B></A>

//C[@id="one"]

XPath. @ - атрибут

Значение атрибута можно сравнивать

<A> <B id> <C id> </C> <C> </C> </B></A>

//*[@id]

XPath. * - любой

Любой элемент

<A> <B> <C id> </C> <C name> </C> <C></C> </B></A>

//C[@*]

XPath. * - любой

Любой атрибут

Как быть в этом случае?

<div id="name">Имя: </div><input type="text"><div id="second_name">Фамилия: </div><input type="text">

???

Каким XPath найти input для ввода имени?

//div[@id="name"]/following-sibling::input[1]

<div id="name">Имя: </div><input type="text"><div id="second_name">Фамилия: </div><input type="text">

XPath. Оси

С помощью осей осуществляется навигация по узлам XML документа

• attribute:: — можно заменить на «@»• child:: — часто просто опускают • descendant:: — можно заменить на «.//»• parent:: — можно заменить на «..»• self:: — можно заменить на «.»

XPath. Оси. Сокращения

Функции позволяют использовать результат операций с множеством нод, строками, числами и логическими операторами в XPath выражених

XPath. Функции

<A> <B> <C>Доброе утро!</C> <C>Злое утро!</C> </B></A>

//C[text()="Доброе утро!"]

XPath. Функции. text()

Функция text() возвращает набор текстовых нод

//C[contains(text(), "утро")]<A> <B> <C>Доброе утро!</C> <C>Злое утро!</C> </B></A>

XPath. Функции. contains()

Строковая функция contains() возвращает истину, если первая строка содержит вторую

//C[contains(@id, "name")]

<A> <B> <C id="name"></C> <C id="second_name"></C> </B></A>

XPath. Функции. contains()

В качестве первого значения может быть подана любая строка

//C[normalize-space(@id)="name"]

<A> <B> <C id="name"></C> <C id=" name "></C> </B></A>

XPath. Функции. normalize-space()

Строковая функция normalize-space() убирает лишние и пробелы

//*[not(@*)]

<A> <B> <C id="name"></C> <C id="second_name"></C> </B></A>

XPath. Функции. not()

Функция not() – логическое отрицание.Будут выбраны любые элементы, не имеющие атрибутов

//*[count(C)=2]

<A> <B> <C></C> <C></C> </B></A>

Функция count() возвращает количество элементов.Будут выбраны элементы, имеющие два дочерних элемента "C"

XPath. Функции. count()

//C[last()]

<A> <B> <C></C> <C></C> <C></C> </B></A>

Функция last() возвращает номер последнего элемента в множестве

XPath. Функции. last()

//C[last()-1]

<A> <B> <C></C> <C></C> <C></C> </B></A>

XPath. Функции. last()

Будет выбран предпоследний элемент

XPath. Операторы

//C[position() mod 2=0]

<A> <B> <C></C> <C></C> <C></C> <C></C> </B></A>

XPath. Позиции элементов

Функция position() возвращает позицию элемента.Оператор mod возвращает остаток от деления.

Будут выбраны все элементы, имеющие четную позицию

1. Вводная часть2. Язык XPath3. Построение локаторов в Selenium• принципы составления • приемы• примеры

3

65%

• Использовать, когда не хватает возможности простых локаторов

• Читабельный• Универсальный – не содержит элементов,

которые не влияют на нахождение элемента

• Хранить локаторы в одном месте

XPath-локаторы. Принципы составления

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

Используйте приемы

Приём 1. Ищите по тексту

Текст легко читать и менять.Id могут быть динамическими.

<td><button id="ext-39"/>Выполнить</button>

</td>

//button[text()="Выполнить"]

если Ваше приложение одноязычное

Приём 1. Ищите по тексту

Функция text() возвращает первый текстовый элемент.

<td><span></span>"найди меня"

</td>

//td[contains(., "найди")]

//td[contains(text(), "найди")]

Приём 2. Используйте только нужные элементы

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

<td><div class="buttons">

<button id="perform"/>Выполнить</button></div>

<td>

//button[@id="perform"]

//div/button[@id="perform"]

Приём 3. Пользуйтесь contains()

Ищите элемент по его части.Это поможет избежать лишних пробелов и переносов строк.

<td><button id="ext-39"/>

Выполнить действие </button>

</td>

//button[contains(text(), "Выполнить")]

<td><button name="SubSection$EditDocument$ChildBBB"/> </button>

</td>

Приём 3. Пользуйтесь contains()

Не используйте длинных и непонятных выражений.Их будут читать люди.

//button[contains(@name, "EditDocument")]

Приём 4. Комбинируйте пути

Комбинируйте пути с помощью "|", если XPath элемента чуть-чуть отличается

//button[text()="Выбрать"]|//button[.//*[contains(text(), "Выбрать")]]

<td><label for="name">Имя</label>

</td><td>

<span nowrap><input type="text">

</span></td>

Приём 5. Пишите относительные пути

//label[@for="name"]/../following-sibling::td[1]//input

Пишите путь до нужного элемента относительно других элементов

Приём 6. Обратный вариант написания

<td><label for="name">Имя</label>

</td><td>

<span nowrap><input type="text">

</span></td>

//input[./ancestor::td/preceding-sibling::td/label[@for="name"]]

Будет найден input, у которого предок td с предыдущим братом td, содержащим label с атрибутом for, имеющим значение name

Приём 7. XPath для таблиц//button[contains(@title, 'Редактировать запись')]

[./parent::td[(./preceding-sibling::td[@headers='a3']//*[contains(text(), 'Ответчик')]) and (./preceding-sibling::td[@headers='a2' and contains(text(), 'Петров Иван')])and (./preceding-sibling::td[@headers='a1' and contains(text(), 'Физическое лицо')])]]

Приём 7. XPath для таблиц

Используйте переменные, чтобы найти нужную строку по заданным параметрам.

Примеры XPath-локаторов

//input[contains(@id, 'ResponseDateField')]

//button[.//*[contains(text(), 'Выбрать')]]

//td[@id='EXPAND-PLUSMINUS'][following-sibling::*//*[contains(text(), 'Документ')]]

//label[contains(text(), 'Вид')]/parent::td/following-sibling::td

(//div[contains(text(),"Добавить")])[last()]

//div[@node_name="pyActionArea" and @node_type="MAIN_RULE"]

//table[@id='ViewTable']//tr[@rowindex]

Итог

+ С помощью XPath-локатора можно найти путь до любого элемента

Ссылки

http://ru.wikipedia.org/wiki/XPath

http://www.w3schools.com/XPath/default.asp

www.zvon.org/xxl/XPathTutorial/General_rus/examples.html

http://habrahabr.ru/post/114772/

Спасибо за внимание!