Локаторы для поиска элементов на странице.

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

  • ID
  • Name
  • Linktext
  • Tag Name
  • Class name
  • Css
  • Xpath

0 участников

Это вопрос из разряда - какой язык лучше для тестирования? )
В чем собственно проблема?

Хочу понять что лучше использовать, допустим xpath из хромовской тулзы скопировал и порядок, но возникает вопрос насколько это стабильно и правильно ли вообще…

скопировать… вы такого на собеседованиях только не говорите.

1 лайк

CSS selectors почти для всего вместе с чейнингом поиска от элемента к элементу, краткий пример:

let header = $('header')
let loginButton = header.$('button.login')
let registerButton = header.$('button.register')

Брат жив, зависимость есть.

А Xpath - прекрасен для таблиц и каких-то хитровыкрученых моментов в верстке.

1 лайк

благодарю за Ваш ответ.

Почему Вас смутило слово “скопировать”?

Стратегия поиска по CSS работает всегда и во всех браузерах одинаково.
xPath по разному поддерживается, а иногда вообще может некорректно работать.

CSS селектор зачастую проще и лаконичней в записи чем xPath.
xPath гораздо мощнее по возможностям.

Путь по CSS может быть только вглубь (вниз по DOM дереву).
xPath выражения могут обходить DOM как угодно и вверх и вниз.

В скорости поиска тоже есть разница, но она мизерная. СSS чуток быстрее везде, кроме браузера Internet Explorer, в котором xPath отрабатывает быстрее.

Кроме того, findById, findByName, findByClassName внути селениума все равно преобразуются в findByCssSelector, тоесть они вообще эквивалентны.

В общем и целом CSS вполне достаточно везде. Когда CSS недостаточно, можно использовать xPath, но надо понимать, что он может по разному работать в IE и в Chrome.

xpath из хромовской тулзы скопировал и порядок

Непорядок вобщем-то )) Не думаю, что такой локатор, особенно если внутри его есть индексы, переживет изменения в верстке на следующем апдейте. Хотя тулзы разные есть. Тут скорее непорядок в том, что нужно понимать что ты делаешь, а не бездумно копировать и вставлять.

3 лайка

Собственно Ярослав уже ответил, локаторы с индексами могут стать неработоспособными после верстки страници.

Благодарю за полный ответ, теперь все ясно и понятно.

позволяют также

  • Binding
  • cssContainingText
  • Input
  • Model
  • Repeater
  • Button Text / Partial Button Text
  • Options
  • RepeaterColumn
  • RepeaterRow
  • RepeaterElement
  • Selected Options / Repeater Selected Options
    и
  • Evaluate
    например
<div ng-controller="myCtrlr">
  <h1>Welcome to my book store</h1>
    <div style="width: 100%; overflow: scroll;">
      <div ng-repeat="person in people" ng-class="{even: !$even, odd: !$odd}">
        <span>{{person.Name}}</span>
        <span> {{person.Country}}</span>
      </div>
    </div>
  </div>

можно

ngDriver.findElements(NgBy.repeater("person in people"))

и

NgBy.binding("person.Name")

и напр.

WebElement personName = new NgWebElement(ngDriver, currentElement)
                    .findElement(NgBy.binding("person.Name"));
            Object personCountry = new NgWebElement(ngDriver, currentElement)
                    .evaluate("person.Country");
            if (personName.getText().indexOf("Centro comercial Moctezuma") >= 0) {
                assertThat(personCountry.toString(), containsString("Mexico"));
                highlight(personName);
            }


Как правило, самые надежные селекторы - это ID и ClassName. Я в основном использую коллекцию из className и кликаю по индексу

Это только в том случае, если ваши программисты тоже надежные как скала)))

П.С. ID(“myId”) и ClassName(“myClass”). Все равно транслируются селениумом в cssSelector("#myId") и cssSelector(".myClass") соответственно.

Кликать по индексу в колекции? Вы серьёзно? :slight_smile:

Один лишний элемент в коллекции появляется - и нужно переписать ВСЕ индексы. Или я что-то упускаю?

1 лайк

Как показывает практика, тестирование фронта - дело вообще не благодарное))
И если уж на то пошло, то кроме ID-шников и ухватиться то не за что. Все меняется постоянно.
Да и айдишники иногда меняются

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

Так что если вы не договорились с разработчиками об этом, это нужно сделать (договориться), чтобы потом говном друг в друга не бросаться :smiley:

Иногда бывает, когда договариваться уже поздно. У меня такое было.

меня очень сильно выручает добавление уникального ключа. И xpath выглядит просто и со вкусом

<div class="_sidebarMenu_r9khk_9" data-test="sidebarMenu">

а так выглядить поиск по xpath

'//div[@data-test="sidebarMenu"]'

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

P.S. на рефакториннг уходит гораздо меньше времени, так как изменение dom ни как не затрагивает такие простые записи