3. 1
0%
1. Вводная часть
• термины, определения
• XPath в браузере
2. Язык XPath
3. Построение локаторов в Selenium
4. Терминология
• XPath – язык запросов к элементам XML-документа
• Selenium WebDriver – инструмент для
автоматизированного управления браузерами
• Локатор – строка, уникально идентифицирующая
элемент веб-страницы
5. Локаторы в Selenium
Инженер по тестированию задает в Selenium
последовательность действий
• Открыть страницу
• Произвести действие
• Проверить результат
6. Локаторы в Selenium
С помощью локаторов Selenium «понимает» с
каким веб-элементом производить действие
id Локатор
name
CSS
XPath
className
tagName linkText
partialLinkText
7. XPath
• XML – расширяемый язык разметки
• XPath – путь к элементу xml
• HTML – язык разметки Web-документа
• DOM – объектная модель документа, в
частности HTML
• XPath – осуществляет навигацию по DOM
11. XPath в Chrome
Инструменты разработчика
Elements
Ctrl + F
Вызвать Инструменты разработчика:
• F12
• Ctrl+Shift+I
• Настройки – Инструменты –
Инструменты разработчика
12.
13. XPath в консоли браузера
• $x(path) – принимает ХPath в качеств
параметра и возвращает массив элементов
• $0 … $4 – доступ к последним вызванным
DOM - элементам
14. 15%
1. Вводная часть
2. Язык XPath
2
• абсолютный путь
• относительный путь
• условия
• оси
• функции
• операторы
3. Построение локаторов в Selenium
15. XPath. Абсолютный путь
A/B/C
<A>
<B>
<C/>
</B>
</A>
Путь от корневого элемента
XPath
XML
20. <A>
<B>
XPath. Условия
<C> </C>
<C> </C>
</B>
</A>
//C[1]
В скобках [] заключены условия выборки
21. XPath. @ - атрибут
//C[@id]
<A>
<B>
<C id> </C>
<C> </C>
</B>
</A>
Будут выбраны все элементы, имеющие атрибут "id"
22. XPath. @ - атрибут
//C[@id="one"]
<A>
<B>
<C id="one"> </C>
<C id="two"> </C>
</B>
</A>
Значение атрибута можно сравнивать
23. XPath. * - любой
<A>
<B id>
<C id> </C>
<C> </C>
</B>
</A>
//*[@id]
Любой элемент
24. XPath. * - любой
<A>
<B>
<C id> </C>
<C name> </C>
<C></C>
</B>
</A>
//C[@*]
Любой атрибут
25. Как быть в этом случае?
???
<div id="name">Имя: </div>
<input type="text">
<div id="second_name">Фамилия: </div>
<input type="text">
Каким XPath найти input для ввода имени?
26.
27. XPath. Оси
//div[@id="name"]/following-sibling::input[1]
<div id="name">Имя: </div>
<input type="text">
<div id="second_name">Фамилия: </div>
<input type="text">
С помощью осей осуществляется навигация по узлам XML документа
28.
29. XPath. Оси. Сокращения
• attribute:: — можно заменить на «@»
• child:: — часто просто опускают
• descendant:: — можно заменить на «.//»
• parent:: — можно заменить на «..»
• self:: — можно заменить на «.»
30. XPath. Функции
Функции позволяют использовать результат операций с множеством нод, строками,
числами и логическими операторами в XPath выражених
31. XPath. Функции. text()
//C[text()="Доброе утро!"]
<A>
<B>
<C>Доброе утро!</C>
<C>Злое утро!</C>
</B>
</A>
Функция text() возвращает набор текстовых нод
32. XPath. Функции. contains()
//C[contains(text(), "утро")]
<A>
<B>
<C>Доброе утро!</C>
<C>Злое утро!</C>
</B>
</A>
Строковая функция contains() возвращает истину,
если первая строка содержит вторую
33. XPath. Функции. contains()
//C[contains(@id, "name")]
<A>
<B>
<C id="name"></C>
<C id="second_name"></C>
</B>
</A>
В качестве первого значения может быть подана любая строка
34. XPath. Функции. normalize-space()
//C[normalize-space(@id)="name"]
<A>
<B>
<C id="name"></C>
<C id=" name "></C>
</B>
</A>
Строковая функция normalize-space() убирает лишние и пробелы
35. XPath. Функции. not()
//*[not(@*)]
<A>
<B>
<C id="name"></C>
<C id="second_name"></C>
</B>
</A>
Функция not() – логическое отрицание.
Будут выбраны любые элементы, не имеющие атрибутов
36. XPath. Функции. count()
//*[count(C)=2]
<A>
<B>
<C></C>
<C></C>
</B>
</A>
Функция count() возвращает количество элементов.
Будут выбраны элементы, имеющие два дочерних элемента "C"
37. XPath. Функции. last()
//C[last()]
<A>
<B>
<C></C>
<C></C>
<C></C>
</B>
</A>
Функция last() возвращает номер последнего элемента в множестве
38. XPath. Функции. last()
//C[last()-1]
<A>
<B>
<C></C>
<C></C>
<C></C>
</B>
</A>
Будет выбран предпоследний элемент
40. XPath. Позиции элементов
//C[position() mod 2=0]
<A>
<B>
<C></C>
<C></C>
<C></C>
<C></C>
</B>
</A>
Функция position() возвращает позицию элемента.
Оператор mod возвращает остаток от деления.
Будут выбраны все элементы, имеющие четную позицию
41. 1. Вводная часть
2. Язык XPath
3. Построение локаторов в Selenium
• принципы составления
• приемы
• примеры
3
65%
42. XPath-локаторы. Принципы
составления
• Использовать, когда не хватает
возможности простых локаторов
• Читабельный
• Универсальный – не содержит элементов,
которые не влияют на нахождение
элемента
• Хранить локаторы в одном месте
44. Приём 1. Ищите по тексту
если Ваше приложение одноязычное
Текст легко читать и менять.
Id могут быть динамическими.
<td>
<button id="ext-39"/>Выполнить</button>
</td>
//button[text()="Выполнить"]
45. Приём 1. Ищите по тексту
//td[contains(., "найди")]
Функция text() возвращает первый текстовый элемент.
<td>
<span></span>
"
найди меня
"
</td>
//td[contains(text(), "найди")]
46. Приём 2. Используйте только
нужные элементы
Не используйте элементы, которые не определяют элемент.
В промежуточный путь могут быть добавлены новые элементы.
<td>
<div class="buttons">
<button id="perform"/>Выполнить</button>
</div>
<td>
//button[@id="perform"]
//div/button[@id="perform"]
47. Приём 3. Пользуйтесь contains()
//button[contains(text(), "Выполнить")]
<button id="ext-39"/>
Выполнить действие
</button>
Ищите элемент по его части.
<td>
</td>
Это поможет избежать лишних пробелов и переносов строк.
48. Приём 3. Пользуйтесь contains()
<td>
//button[contains(@name, "EditDocument")]
<button name="SubSection$EditDocument$ChildBBB"/>
</button>
</td>
Не используйте длинных и непонятных выражений.
Их будут читать люди.
49. Приём 4. Комбинируйте пути
//button[text()="Выбрать"]|//button[.//*[contains(text(), "Выбрать")]]
Комбинируйте пути с помощью "|", если XPath элемента чуть-чуть отличается
50. Приём 5. Пишите относительные
<td>
<label for="name">Имя</label>
</td>
<td>
<span nowrap>
<input type="text">
</span>
</td>
пути
//label[@for="name"]/../following-sibling::td[1]//input
Пишите путь до нужного элемента относительно других элементов
51. Приём 6. Обратный вариант
написания
//input[./ancestor::td/preceding-sibling::td/label[@for="name"]]
<td>
<label for="name">Имя</label>
</td>
<td>
<span nowrap>
<input type="text">
</span>
</td>
Будет найден input, у которого предок td с предыдущим братом td, содержащим label с
атрибутом for, имеющим значение name
52. Приём 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(), 'Физическое лицо')])
]]
53. Приём 7. XPath для таблиц
Используйте переменные, чтобы найти нужную строку по заданным параметрам.