Почему CSS локаторы работают быстрее чем XPath?


(Mykhailo Poliarush) #1

Посмотрел я видео, где рассказывают о CSS vs XPath. 

http://www.youtube.com/watch?v=6vPu3TO6XZ4&feature=channel_video_title

Мне стало интересно, почему практически во всех случаях XPath работает медленее (пуская в доли секунды для FireFox или секунды для Internet Explorer) чем CSS?


(Vitalik) #2

когда страница загружается - браузер парсует CSS в любом случае, тогда селениум просто обращается к уже загруженному объекту. когда же речь идет про xpath - HTML парсуется по запросу, но один раз за страницу - так что второй запрос к xpath на странице будет немного быстрее, но все равно не так как CSS. А отсюда уже претензии к разработчикам парсера (не селениум)


(Mykhailo Poliarush) #3

у меня нет претензий к селениум :) а на счет загрузки страницы, я думал, что в случае xpath браузер тоже парсит страницу.

так на много понятней, только вот один вопрос, насколько я знаю файерфокс также сразу создает xml дерево в памяти при загрузке странице.

походу полчается, что разработчики CSS технологии намного лучше пишут чем XPath :)


(barancev) #4

Дело в том, что CSS-локаторы были разработаны специально для HTML, а XPath-локаторы -- это универсальный механизм для поиска по XML DOM.

Поэтому для CSS идентификатор и имя -- это особые атрибуты, он строит табличку-индекс для быстрого обращения к элементам, снабженным этими атрибутами. Поскольку эти атрибуты должны быть уникальными, индексация работает очень эффективно. А с точки зрения XPath -- это "просто атрибуты", поиск ведётся не по таблице-индексу, а по всему DOM-дереву.

Поиск по классу уже не так эффективен, а поиск по контенту в обоих случаях работает без индексации, здесь разница между XPath и CSS незначительна.


(Mykhailo Poliarush) #5

Спасибо, я не знал о такой таблице, а где можно больше почитать о ней?

В CSS спецификации даже упомянули "Selectors have been optimized for use with HTML and XML, and are designed to be usable in performance-critical code.". Походу они своего добились.


(barancev) #6

Что касается id -- это реализовано прямо внутри браузеров, нативными средствами, метод document.getElementById является частью спецификации CSS 2 -- http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-getElBId

Про name надо уже смотреть реализации на JS. Насколько я понял, в этом ролике речь идет про Se1, он использует библиотеку Sizzle, вот там и надо искать.


(Mykhailo Poliarush) #7

То что можно использовать метод document.getElementById - понятно, что хотелось найти “строит табличку-индекс для быстрого обращения к элементам”. Так и не нашел.

З.Ы. Интерсные ссылки походу поиска http://kimblim.dk/css-tests/selectors/ и http://ajaxian.com/archives/css-child-selector-performance


(barancev) #8

Я посмотрел на реализации Sizzle и jQuery -- для поиска по имени они обращаются к другой стандартной функции getElementsByName -- http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-71555259 , то есть реализация опять таки нативная, надо искать в коде браузеров. Именно там прячутся эти таблички-индексы.