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

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

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

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

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

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

Да, они бессмысленны между 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

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

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

1 лайк

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

1 лайк