ХPath: что нужно делать, а что нет
Привет, Хабр! В прошлый раз мы уже поднимали тему написания селекторов на XPath для автоматизации тестирования веб-сервисов. Сегодня мне хотелось бы поговорить о практиках работы с XPath. Этот пост будет том, какие приемы хорошо работают, а каких вещей лучше избегать, если вы так же как и мы сделали выбор в пользу XPath. Всех заинтересованных прошу под кат, а если у вас есть свои уже проверенные временем ноу-хау, давайте делиться ими в комментариях.
Мы постоянно работаем с большими объемами тестов, и по мере роста количества заказов в команду приходят новые инженеры. Именно обучение стало поводом для размышлений над тем, что такое «хороший XPath», а что такое «плохой XPath».
На первый взгляд может показаться, что в этом вопросе нет ничего сложного: просто берете общепринятый стандарт для селекторов, сверху кладете документацию по XPath и отдаете все это новому сотруднику со словами: «Знакомься товарищ!». Но практика показала, что просто знаний синтаксиса недостаточно. И в работе встречаются как хорошие, так и плохие практики написания селекторов. Именно исходя из этого опыта и родился этот пост. А ниже вы найдете те принципы и практики, которые мы выработали сами для себя, набив несколько шишек, потратив часы лишнего времени на исправления и так далее.
XPath и как правильного его готовить
1) Удаляйте лишние пробелы в строке с помощью функции normalize-space ().
Код
Плохая практика //[text()=’Войти через Google’]
Хорошая практика//[normalize-space(text())=’Войти через Google’]
Почему: Последний селектор нивелирует ошибки в верстке, связанные с пробелами. Например, это спасет в подобной ситуации:
2) Не пишите селекторы по полному совпадению наименования классов.
Код Плохая практика Хорошая практика Почему: Буквально завтра заказчик может поменять дизайн и вместо класса red использовать blue, или добавить/удалить какой-нибудь из классов. Если вы не хотите делать лишнюю работу лучше предусмотреть устойчивость селектора к подобным изменениям. А сделать это можно, отказавшись от явного указания на наименование класса. 3) Не используйте фильтры по номерам, если можно этого избежать. Код: Пишем селектор к элементу Плохая практика Хорошая практика Почему: Количеству пунктов в меню и их порядок могут поменяться по мере развития сайта. Правильно составленный селектор будет гораздо устойчивее и окажется независим от количества пунктов в меню. «Живой» пример «плохого» селектора: 4) Используйте один селектор для множества элементов. Снова обратимся к коду из пункта №3. Если посмотреть внимательно, то один XPath селектор можно использовать для каждого пункта меню, достаточно обернуть его в функцию. Плохая практика (писать почти одинаковые селекторы к каждому пункту): Хорошая практика: Почему: Если не использовать общий селектор, то работы по написанию становится больше. А при грамотном оформлении функции получается удобно читаемый/редактируемый код, возрастает скорость его написания. 5) Используйте поиск по вложенному тексту (.) Для тегов //div[@class=’large red Menu_mainLink’]
//div[contains(@class, ’Menu_mainLink’)]
Карта
(//div/a)[3]
//a[normalize-space(.)=’Карта’]
//[@id=’login_form’]/div[2]/div/table/tbody/tr[2]/td[2]/input
service=driver.find_element_by_xpath(f”//[normalize-space(.)=‘Услуги’]”
affiche=driver.find_element_by_xpath(f”//[normalize-space(.)=‘Афиша’]”
map=driver.find_element_by_xpath(f”//[normalize-space(.)=‘Карта’]”
def get_menu_item(text):
element=driver.find_element_by_xpath(f”//[normalize-space(.)=’{text}’]”
return element
service = get_menu_item(‘Услуги’)
affiche = get_menu_item(‘Афиша’)
map = get_menu_item(‘Карта’)
-
, ,