Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как выполняется поиск по атрибуту name или id в dom дереве?

xpath
id
css-selectors
webdriver
Теги: #<Tag:0x00007f7b6306b568> #<Tag:0x00007f7b6306b310> #<Tag:0x00007f7b6306b1a8> #<Tag:0x00007f7b6306b040>

(Roma Marinsky) #1

Сравнивал сегодня как работают разные типы локаторов, скорость корректность, удобство написания
И вот так интересно вышло
поиск такого локатора “[name*=‘firstName’]” и такого By.name(“address[firstName]”) - занимает одинаковое приблизительно время, около 22 мс - статистически на основе 20 пробегов теста. Если переоткрывать браузер при каждом тесте, то в среднем выходит 30 мс, если держать браузер открытым для всех прогонов, то среднее время сокращается до 15 мс.
С id идентификатором, время поиска аналогичное вышло

И очень стало интересно, какой механизм реализован в селениум по поиску элементов на странице? Стал рыться в исходниках селениум и ничего явного, что бы сказало какая команда говорит браузеру через драйвер найти элемент определённым образом не нашёл чёткого ответа, стали только возникать подозрения, что по умолчанию это реализовано через css selectors, ну а css селектор уже имеет свой механизм поиска. И что самое для меня удивительное - что поиск по частичному совпадению значения атрибута name выполняется с примерно той же скоростью что и по полному соответствию name или же id… Как так

Всякие полезности нашёл в исходниках для себя, элементарно - findElement возращает элемент из findElements с нулевым индексом.
Но кишки ещё не нашёл, просто очень интересно


(Roma Marinsky) #2

Оо нашёл такую штуку:
В классе JsonHttpCommandCodec
defineCommand(FIND_ELEMENTS, post("/session/:sessionId/elements"));


(asolntsev) #3

Ага , получается, что основное время уходит на обмен http-запросами между вебдрайвером и браузером. И все эти споры о том, быстрее XPath или CSS, совершенно бессмысленны. :slight_smile:


(Roma Marinsky) #4

Да, они бессмысленны между xpath и css, но вот интересно как выполняется поиск в браузере по id или name
По исходникам селениума такое представление сложилось, что поиск есть только трёх видов: по id, по css и по xpath,
А если использовать по tag, name, linkText, className - то строится css locator, если он не найден, то как исключение ищется аналогичное по xpath. А с id не стало ясно, выглядит так что по id поиск выполняется другими средствами в браузере, по http передаётся value, а браузер отдаёт результат.

Типы поиска tag, name, linkText, className, видимо созданы только для повышения некоей читабельности локаторов в нашем прекрасном коде. Ну, а основной механизм поиска элементов выполняется через css и xpath или id


(Roma Marinsky) #5

А ещё если id не найден на странице, то как исключение выполняется поиск по тому же наименованию, но по name


(Goshko Nazar) #6

А можно узнать практичекео значение данного исследования?


(Roma Marinsky) #7

Просто хотел разбираться как работает селенид и селениум, нашёл много полезного - как никак привентирую костыли и повышаю грамотность. Только для этого