У чому різниця між cssSelector та Xpath і що краще щодо продуктивності для перехресного тестування браузера?


87

Я працюю з Selenium WebDriver 2.25.0 на багатомовній веб-програмі та в основному тестую вміст сторінки (для різних мов, таких як арабська, англійська, російська тощо).

Для мого додатка, який кращий за продуктивністю, і переконайтеся, що він повинен підтримувати всі браузери (тобто IE 7,8,9, FF, Chrome тощо).

Заздалегідь дякуємо за цінні пропозиції.

Відповіді:


107

Селектори CSS працюють набагато краще, ніж Xpath, і це добре задокументовано в спільноті Selenium. Ось кілька причин,

  • Механізми Xpath різні в кожному браузері, отже, роблять їх непослідовними
  • IE не має власного механізму xpath, тому селен вводить власний механізм xpath для сумісності свого API. Отже, ми втрачаємо перевагу використання власних функцій браузера, які WebDriver по суті просуває.
  • Xpath, як правило, стає складним і, отже, ускладнює читання, на мій погляд

Однак є деякі ситуації, коли вам потрібно використовувати xpath, наприклад, пошук батьківського елемента або пошук елемента за його текстом (пізніше я б не рекомендував).

Ви можете прочитати блог від Саймона тут . Він також рекомендує CSS через Xpath.

Якщо ви тестуєте вміст, тоді не використовуйте селектори, які залежать від вмісту елементів. Це буде кошмаром для обслуговування кожного регіону. Спробуйте поговорити з розробниками та скористайтеся прийомами, якими вони екстерналізували текст у програмі, наприклад, словники, пакети ресурсів тощо. Ось мій блог, який детально це пояснює.

редагувати 1

Завдяки @parishodak, ось посилання, яке містить цифри, що підтверджують кращу продуктивність CSS


7
Селектори CSS не дозволяють текст. "містить" застаріло в CSS. Як я вже говорив вище, є селектори, незалежні від вмісту. Вміст може знаходитись зовні. Ви можете поговорити з розробниками. Вони, напевно, екстерналізували текст. У них частіше за все є словники для кожної мови. Отже, ключі у словниках однакові, але значення змінюються відповідно до мови. Ви можете використовувати ці файли для перевірки вмісту. Зверніть увагу, що вам потрібно перетворити власні символи в символи ascii за допомогою інструменту nativ2ascii від JDK. Я повинен написати про це щоденник. Я протестував багато локалей, використовуючи цю техніку.
— Нілеш

1
@Chetan चेतन Я додав посилання на свій блог у відповідь. Вибачте, це зайняло деякий час. Сподіваємось, це допоможе вам.
— нілеш

8
@ Нілеш: Я не згоден з вашою відповіддю. 1.) CSS-механізми також різні в кожному браузері. Це не аргумент. 3.) З певним досвідом XPath дуже легко зрозуміти і пропонує більше функціональних можливостей, ніж CSS. Якщо ви шукаєте дуже вкладений елемент, вони обидва є складними: XPath та CSS. З мого досвіду, будь-яка загальна відповідь на це питання буде неправильною. Рішення CSS / XPATH повинно прийматися індивідуально. Початкове питання стосувалось продуктивності. Ваша відповідь в основному складається з припущень та особистих думок. Справжнім доказом було б ВИМІРИТИ ефективність та опублікувати результати тут.
— Elmue

2
Дуже хороша стаття, яка суперечить вашому першому реченню: "Селектори CSS працюють набагато краще, ніж Xpath". Це не так просто, може бути навіть навпаки. І: "IE не має власного механізму xpath, тому селен вводить власний механізм xpath для сумісності свого API". Тут Селен страждає від конструктивної помилки. Безумовно, було б краще впровадити движок XPath в C ++ замість Java-сценарію. Але IE мертвий, тепер з'являється Edge. За всіма питаннями щодо продуктивності не можна забувати, що CSS не має такої важливої ​​функціональності, як пошук тексту елемента.
— Elmue

2
elementalselenium.com/tips/32-xpath-vs-css містить контрольні показники, які припускають, що css3 вже не значно швидший.
— mc0e

46

Я збираюся дотримуватися непопулярної думки щодо SO селену, що XPath є кращим, ніж CSS, у довгостроковій перспективі.

Цей довгий допис має два розділи - спочатку я докажу, що різниця в продуктивності між ними становить 0,1-0,3 мілісекунди (так; це 100 мікросекунд ) , а потім поділюсь своєю думкою, чому XPath є потужнішим.


Різниця в продуктивності

Давайте спочатку вирішимо "слона в кімнаті" - xpath повільніший за css.

При поточній потужності процесора (читайте: все, що x86 випускається з 2013 року) , навіть у віртуальних машинах browserstack / saucelabs / aws, і розвитку браузерів (читайте: усіх популярних за останні 5 років), що навряд чи це так. Двигуни браузера розроблені, підтримка xpath рівномірна, IE відсутній (сподіваємось, для більшості з нас) . Це порівняння в іншій відповіді наводиться повсюдно, але воно дуже контекстуальне - скільки працює - або турбується про - автоматизацію проти IE8?

Якщо є різниця, вона становить частку мілісекунди .

Тим не менше, більшість фреймворків вищого рівня в будь-якому випадку додають принаймні 1 мс накладних витрат над необробленим викликом селену (обгортки, обробники, збереження стану тощо); моя особиста обрана зброя - RobotFramework - додає щонайменше 2 мс, якими я з радістю пожертвую заради того, що вона пропонує. Зворотний зв’язок мережі з AWS us-east-1 до концентратора BrowserStack зазвичай становить 11 мілісекунд .

Тож із віддаленими браузерами, якщо є різниця між xpath та css, це затьмарюється усім іншим, на порядки.


Вимірювання

Публічних порівнянь не так багато (я справді бачив лише цитоване) , отже - ось груба одинична, фіктивна та проста.
Він знайде елемент за двома стратегіями X разів і порівняє середній час для цього.

Ціль - цільова сторінка BrowserStack та її кнопка «Зареєструватися»; скріншот HTML-коду під час написання цього повідомлення:

введіть тут опис зображення

Ось тестовий код (python):

from selenium import webdriver
import timeit


if __name__ == '__main__':

    xpath_locator = '//div[@class="button-section col-xs-12 row"]'
    css_locator = 'div.button-section.col-xs-12.row'

    repetitions = 1000

    driver = webdriver.Chrome()
    driver.get('https://www.browserstack.com/')

    css_time = timeit.timeit("driver.find_element_by_css_selector(css_locator)", 
                             number=repetitions, globals=globals())
    xpath_time = timeit.timeit('driver.find_element_by_xpath(xpath_locator)', 
                             number=repetitions, globals=globals())

    driver.quit()

    print("css total time {} repeats: {:.2f}s, per find: {:.2f}ms".
          format(repetitions, css_time, (css_time/repetitions)*1000))
    print("xpath total time for {} repeats: {:.2f}s, per find: {:.2f}ms".
          format(repetitions, xpath_time, (xpath_time/repetitions)*1000))

Для тих, хто не знайомий з Python - він відкриває сторінку та знаходить елемент - спочатку за допомогою локатора css, потім за допомогою xpath; операція пошуку повторюється 1000 разів. Результатом є загальний час у секундах для 1000 повторень та середній час для однієї знахідки в мілісекундах.

Локаторами є:

  • для xpath - "елемент div, що має саме це значення класу, десь у DOM";
  • css схожий - "елемент div з цим класом, десь у DOM".

Навмисно вибраний, щоб не перенастроюватися; також, селектор класу вказаний для css як "другий за швидкістю після ідентифікатора".

Середовище - Chrome v66.0.3359.139, chromedriver v2.38, процесор: ULV Core M-5Y10, як правило, працює на частоті 1,5 ГГц (так, "текстовий", навіть не звичайний звір i7) .

Ось результат:

css total time 1000 repeats: 8.84s, per find: 8.84ms

xpath total time for 1000 repeats: 8.52s, per find: 8.52ms

Очевидно, що час знаходження досить близький; різниця становить 0,32 мілісекунди . Не стрибайте "xpath швидший" - іноді це так, іноді це css.


Давайте спробуємо з іншим набором локаторів, дещо складнішим - атрибутом, що має підрядок (загальноприйнятий принаймні для мене підхід, що йде за класом елемента, коли його частина має функціональне значення) :

xpath_locator = '//div[contains(@class, "button-section")]'
css_locator = 'div[class~=button-section]'

Два локатори знову семантично однакові - "знайти елемент div, що має у своєму класі атрибут цього підрядка".
Ось результати:

css total time 1000 repeats: 8.60s, per find: 8.60ms

xpath total time for 1000 repeats: 8.75s, per find: 8.75ms

Різниця 0,15 мс .


Як вправа - той самий тест, що й у зв’язаному блозі в коментарях / іншій відповіді - сторінка тесту є загальнодоступною, а також код тестування .

Вони роблять кілька речей у коді - клацають стовпець, щоб відсортувати за ним, потім отримують значення та перевіряють правильність сортування інтерфейсу.
Я виріжу це - просто дістаньте локатори, врешті-решт - це кореневий тест, так?

Той самий код, що і вище, з цими змінами в:

  • URL-адреса зараз http://the-internet.herokuapp.com/tables; є 2 тести.

  • Локатори для першого - "Пошук елементів за ідентифікатором та класом" - це:

css_locator = '#table2 tbody .dues'
xpath_locator = "//table[@id='table2']//tr/td[contains(@class,'dues')]"

І ось результат:

css total time 1000 repeats: 8.24s, per find: 8.24ms

xpath total time for 1000 repeats: 8.45s, per find: 8.45ms

Різниця 0,2 мілісекунди.

"Пошук елементів шляхом обходу":

css_locator = '#table1 tbody tr td:nth-of-type(4)'
xpath_locator = "//table[@id='table1']//tr/td[4]"

Результат:

css total time 1000 repeats: 9.29s, per find: 9.29ms

xpath total time for 1000 repeats: 8.79s, per find: 8.79ms

Цього разу це 0,5 мс (у зворотному напрямку xpath тут виявився "швидшим").

Отже, 5 років потому (кращі браузерні двигуни) і зосередившись лише на продуктивності локаторів (жодних дій, таких як сортування в інтерфейсі тощо), той самий тестовий стенд - практично немає різниці між CSS та XPath.


Отже, з xpath та css, кого з них вибрати для виконання? Відповідь проста - виберіть розташування за ідентифікатором .

Коротше кажучи, якщо ідентифікатор елемента унікальний (як це передбачається згідно специфікацій), його значення відіграє важливу роль у внутрішньому представленні DOM браузера, і, отже, зазвичай є найшвидшим.

Проте унікальні та постійні (наприклад, не автоматично згенеровані) ідентифікатори не завжди доступні, що підводить нас до "чому XPath, якщо є CSS?"


Перевага XPath

Чому, на думку продуктивності, картина xpath краща? Просто - універсальність та потужність.

Xpath - це мова, розроблена для роботи з XML-документами; як такий, він дозволяє набагато потужніші конструкції, ніж css.
Наприклад, навігація в будь-якому напрямку дерева - знайдіть елемент, а потім перейдіть до його бабусі та дідуся та знайдіть дитину, яка має певні властивості.
Це дозволяє вбудовані логічні умови - cond1 and not(cond2 or not(cond3 and cond4)); вбудовані селектори - "знайти div, що має ці дочірні елементи з цими атрибутами, а потім переміщатися відповідно до нього".
XPath дозволяє здійснювати пошук на основі значення вузла (його тексту) - хоч би як це не сприймали, він дуже корисний, особливо в погано структурованих документах (відсутні певні атрибути, як динамічні ідентифікатори та класи - знайдіть елемент за його текстом зміст) .

Вступити в css, безумовно, простіше - можна почати писати селектори за лічені хвилини; але через пару днів використання потужність та можливості xpath швидко долає css.
І суто суб’єктивно - складний css читати набагато важче, ніж складний вираз xpath.

Outro;)

Нарешті, знову дуже суб’єктивно - якого вибрати?

ІМО не існує правильного чи неправильного вибору - вони є різними рішеннями однієї і тієї ж проблеми, і слід вибрати все, що більше підходить для роботи.

Будучи "шанувальником" XPath, я не соромлюсь використовувати у своїх проектах поєднання обох - чорт візьмі, іноді набагато швидше просто кинути CSS, якщо я знаю, що це зробить чудову роботу.


Скільки вузлів має сторінку входу? Сторінки для входу, як правило, дуже прості, тому, можливо, ви бачили незначну різницю.
— pagep

Інші тести продуктивності показують набагато більшу різницю між різними браузерами.
— pagep

1
На ваше перше запитання - у відповіді присутній знімок екрана DOM, а сторінка в Інтернеті та загальнодоступна. Для вашого першого та другого, якщо ви уважно прочитаєте відповідь, я повторив той самий тест, що і elementalselenium, одне з небагатьох доступних порівнянь, яке досить часто цитують, використовуючи ті самі цілі та локатори, що і вони, але лише з 5-річними браузерами .
— Тодор Мінаков

3
@TodorMinakov ВЕЛИКИЙ ПОСТ !!! Я згоден з вами на 100%. Я також вважаю, що синтаксис XPath також є більш природним (принаймні для мене), оскільки він нагадує те, що ми всі добре знаємо. І це шлях до файлу / папки. Тому я думаю, що людина, яка не знає CSS або XPath, навчиться XPath набагато простіше. Оскільки різниця в ефективності незначна, я думаю, що крива навчання заслуговує на серйозний розгляд.
— hfontanez

1
Дякую @hfontanez; чудова аналогія зі структурою файлової системи, я про це не думав. Я маю не погодитися з крихітним кроком щодо простоти вступу - хоча синтаксис XPath спочатку може бути дещо залякуючим, крім того, у ньому є деякі фрази (наприклад, індекс []після //) . Але після початкового дня навчання та його використання майже всі перетинають критичну точку кривої навчання :) (крок css, очевидно, простіший, IMHO) .
— Тодор Мінаков,

13

Дискусія між cssSelector та XPath залишалася б однією з найбільш суб'єктивних дискусій у спільноті Selenium . Те, що ми вже знаємо на даний момент, може бути узагальнено як:

  • Люди, які підтримують cssSelector, кажуть, що він читабельніший і швидший (особливо під час роботи з Internet Explorer).
  • Поки прихильники XPath рекламують, це можливість перекласти сторінку (тоді як cssSelector не може).
  • Обхід DOM у старих браузерах, таких як IE8, не працює з cssSelector, але добре з XPath .
  • XPath може переходити по DOM (наприклад, від дочірнього до батьківського), тоді як cssSelector може переходити лише по DOM (наприклад, від батьківського до дочірнього)
  • Однак неможливість пройти DOM за допомогою cssSelector у старих браузерах - це не обов'язково погана річ, оскільки це більше показник того, що ваша сторінка має поганий дизайн та може отримати корисну розмітку.
  • Бен Бертон згадує, що вам слід використовувати cssSelector, оскільки саме так будуються додатки. Це полегшує написання тестів, розмову про них та допомогу іншим у підтримці.
  • Адам Гоучер каже, що слід застосувати більш гібридний підхід - зосередитись спочатку на ідентифікаторах, потім на cssSelector і використовувати XPath лише тоді, коли він вам потрібен (наприклад , піднімання по DOM), і що XPath завжди буде потужнішим для просунутих локаторів.

Дейв Геффнер провів тест на сторінці з двома таблицями даних HTML , одна таблиця написана без корисних атрибутів ( ID та клас ), а інша - з ними. Я детально проаналізував процедуру тестування та результати цього експерименту в дискусії Чому я повинен коли-небудь використовувати селектори cssSelector на відміну від XPath для автоматизованого тестування? . Хоча цей експеримент продемонстрував, що кожна стратегія локатора є достатньо еквівалентною у всіх браузерах, він не адекватно намалював для нас всю картину. Дейв Геффнер в іншій дискусії Css Vs. X Шлях, під мікроскопомзгадувалося, в тесті з кінця до кінця, було багато інших змінних при грі запуску Соус , браузер запуску та латентність і від тестованого програми. Невдалим виводом з цього експерименту може бути те, що один драйвер може бути швидшим за інший (наприклад, IE проти Firefox ), а насправді це зовсім не так. Щоб отримати справжній смак різниці в продуктивності між cssSelector та XPath, нам потрібно було копати глибше. Ми зробили це, запустивши все з локальної машини, використовуючи утиліту тестування продуктивності. Ми також зосереджувались на конкретній дії селену, а не на всьому тестовому запуску, і запускали речі багато разів. Я детально проаналізував конкретну процедуру тестування та результати цього експерименту в обговоренні cssSelector vs XPath для селену . Але в тестах все ще бракувало одного аспекту, тобто більшої охопленості браузера (наприклад, Internet Explorer 9 та 10) та тестування на більшій та глибшій сторінці.

Дейв Геффнер в іншій дискусії Css Vs. X Path, Під мікроскопом (Частина 2) згадує, щоб переконатися, що необхідні показники охоплені якнайкраще, нам потрібно розглянути приклад, який демонструє велику та глибоку сторінку .


Тестове налаштування

Для демонстрації цього детального прикладу було налаштовано віртуальну машину Windows XP та встановлено Ruby (1.9.3) . Також були встановлені всі доступні браузери та їх еквівалентні драйвери для браузера Selenium. Для порівняльного аналізу benchmarkбуло використано стандартну бібліотеку Ruby .


Тестовий код

require_relative 'base'
require 'benchmark'

class LargeDOM < Base

  LOCATORS = {
    nested_sibling_traversal: {
      css: "div#siblings > div:nth-of-type(1) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3) > div:nth-of-type(3)",
      xpath: "//div[@id='siblings']/div[1]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]/div[3]"
    },
    nested_sibling_traversal_by_class: {
      css: "div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1 > div.item-1",
      xpath: "//div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]/div[contains(@class, 'item-1')]"
    },
    table_header_id_and_class: {
      css: "table#large-table thead .column-50",
      xpath: "//table[@id='large-table']//thead//*[@class='column-50']"
    },
    table_header_id_class_and_direct_desc: {
      css: "table#large-table > thead .column-50",
      xpath: "//table[@id='large-table']/thead//*[@class='column-50']"
    },
    table_header_traversing: {
      css: "table#large-table thead tr th:nth-of-type(50)",
      xpath: "//table[@id='large-table']//thead//tr//th[50]"
    },
    table_header_traversing_and_direct_desc: {
      css: "table#large-table > thead > tr > th:nth-of-type(50)",
      xpath: "//table[@id='large-table']/thead/tr/th[50]"
    },
    table_cell_id_and_class: {
      css: "table#large-table tbody .column-50",
      xpath: "//table[@id='large-table']//tbody//*[@class='column-50']"
    },
    table_cell_id_class_and_direct_desc: {
      css: "table#large-table > tbody .column-50",
      xpath: "//table[@id='large-table']/tbody//*[@class='column-50']"
    },
    table_cell_traversing: {
      css: "table#large-table tbody tr td:nth-of-type(50)",
      xpath: "//table[@id='large-table']//tbody//tr//td[50]"
    },
    table_cell_traversing_and_direct_desc: {
      css: "table#large-table > tbody > tr > td:nth-of-type(50)",
      xpath: "//table[@id='large-table']/tbody/tr/td[50]"
    }
  }

  attr_reader :driver

  def initialize(driver)
    @driver = driver
    visit '/large'
    is_displayed?(id: 'siblings')
    super
  end

  # The benchmarking approach was borrowed from
  # http://rubylearning.com/blog/2013/06/19/how-do-i-benchmark-ruby-code/
  def benchmark
    Benchmark.bmbm(27) do |bm|
      LOCATORS.each do |example, data|
    data.each do |strategy, locator|
      bm.report(example.to_s + " using " + strategy.to_s) do
        begin
          ENV['iterations'].to_i.times do |count|
         find(strategy => locator)
          end
        rescue Selenium::WebDriver::Error::NoSuchElementError => error
          puts "( 0.0 )"
        end
      end
    end
      end
    end
  end

end

Результати

ПРИМІТКА . Результат - в секундах, а результати - за загальний час виконання 100 виконань.

У формі таблиці:

css_xpath_under_microscopev2

У формі діаграми:

  • Chrome :

діаграма-хром

  • Firefox :

діаграма-firefox

  • Internet Explorer 8 :

діаграма-ie8

  • Internet Explorer 9 :

діаграма-ie9

  • Internet Explorer 10 :

діаграма-ie10

  • Опера :

діаграма-опера


Аналіз результатів

  • Chrome і Firefox чітко налаштовані на пришвидшення роботи cssSelector .
  • Internet Explorer 8 - це захоплюючий пакет cssSelector, який не працюватиме, непідконтрольний обхід XPath, який займає ~ 65 секунд, і обхід таблиці тривалістю 38 секунд без результату cssSelector для порівняння.
  • У IE 9 та 10 XPath загалом швидший. У Safari це підкидання, за винятком кількох повільніших обходів з XPath . І майже в усіх браузерах обхід вкладеного брата та комірки таблиці, зроблений за допомогою XPath , є дорогою операцією.
  • Це не повинно бути таким дивним, оскільки локатори є крихкими та неефективними, і нам потрібно уникати їх.

Резюме

  • Загалом є дві обставини, коли XPath помітно повільніший за cssSelector . Але їх легко уникнути.
  • Різниця в ефективності трохи на користь для не-IE-браузерів і трохи на користь для браузерів IE.

Дрібниці

Ви можете виконати розмітку на стенді самостійно, використовуючи цю бібліотеку, де Дейв Хеффнер завернув весь код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.