xpath локаторы в selenium webdriver
DESCRIPTION
XPath locators in Selenium WebDriverTRANSCRIPT
XPath локаторы в Selenium
WebDriver
Докладчик
Кожухов Илья, Специалист по качеству
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
FireBug
https://addons.mozilla.org/ru/firefox/addon/firebug
FirePath
https://addons.mozilla.org/ru/firefox/addon/firepath
XPath в FireFox
в
Инструменты разработчика
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/
Спасибо за внимание!