Jaka jest różnica między css-selector i Xpath? co jest lepsze(w zależności od wydajności i testowania między przeglądarkami)?

Pracuję z Selenium WebDriver 2.25.0 na wielojęzycznej aplikacji internetowej i głównie testować zawartość strony(dla różnych języków, takich jak arabski, angielski, rosyjski i tak dalej).

Dla mojej aplikacji, która jest lepsza w zależności od wydajności & upewnij się, że powinna być Obsługa wszystkich przeglądarek (tj.

Z góry dziękuję za cenne sugestie.

Author: Ripon Al Wasim, 2013-05-28

2 answers

Selektory CSS działają znacznie lepiej niż Xpath i są dobrze udokumentowane w społeczności Selenium. Oto kilka powodów,

  • silniki Xpath są różne w każdej przeglądarce, dlatego sprawiają, że są niespójne
  • IE nie ma natywnego silnika xpath, dlatego selenium wstrzykuje własny silnik xpath dla kompatybilności swojego API. Dlatego tracimy przewagę korzystania z natywnych funkcji przeglądarki, które WebDriver z natury Promuje.
  • Xpath zwykle stają się złożone i dlatego trudno to read in my opinion

Są jednak sytuacje, w których należy użyć xpath, na przykład, szukając elementu nadrzędnego lub szukając elementu po jego tekście (nie polecałbym późniejszego).

Możesz przeczytać bloga Szymona tutaj . Poleca również CSS nad Xpath.

Jeśli testujesz zawartość, nie używaj selektorów zależnych od zawartości elementów. To będzie koszmar dla każdej lokalizacji. Spróbuj porozmawiać z Programiści i używają technik używanych do eksternalizacji tekstu w aplikacji, takich jak słowniki lub pakiety zasobów itp. Oto mój blog , który wyjaśnia to szczegółowo.

Edycja 1

Dzięki @ parishodak, oto link który dostarcza liczb dowodzących, że wydajność CSS jest lepsza

 67
Author: nilesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-28 15:01:07

Utrzymam niepopularną opinię na temat tagu selenium, że XPATH jest preferowany od CSS w dłuższej perspektywie.

Pozwól, że najpierw zajmę się "The elephant in the room" – xpath jest wolniejszy niż css.

Przy obecnej mocy procesora (Czytaj: wszystko, co wyprodukowano w ciągu ostatnich 5 lat), nawet na Browserstack/saucelabs VM, i rozwoju przeglądarek (czytaj: wszystkie popularne w ciągu ostatnich 5 lat), że nie jest to przypadek. Rozwijały się silniki przeglądarki, obsługa xpath jest jednorodny, czyli nie ma go w obrazku (mam nadzieję, że dla większości z nas). To porównanie w drugiej odpowiedzi jest cytowane wszędzie, ale jest bardzo kontekstowe-ilu działa - lub obchodzi-przeciwko IE8?

Jeśli istnieje różnica, jest toułamek milisekundy .

Jednak większość frameworków wyższego poziomu dodaje przynajmniej 1ms nad wywołaniem raw selenium (wrappery, manipulatory, przechowywanie stanu itp.); moja osobista broń z wyboru – robotframework-dodaje co najmniej 2ms, które z przyjemnością poświęcę za to, co zapewnia. Obieg sieciowy z AWS us-east-1 do koncentratora BrowserStack wynosi zwykle 11 milisekund.

Więc w przypadku zdalnych przeglądarek, jeśli istnieje różnica między XPath a css, jest ona przyćmiona przez Wszystko inne.


Nie ma zbyt wielu publicznych porównań (naprawdę widziałem cytowane), więc – tutaj jest szorstki pojedynczy przypadek, głupi i prosty. Cel – Strona docelowa browserstacka i przycisk "Zarejestruj się"; zrzut ekranu html:

Tutaj wpisz opis obrazka

Oto kod testowy (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))

dla tych, którzy nie są zaznajomieni z Pythonem-otwiera stronę i znajduje element-najpierw z lokalizatorem css, a następnie z xpath; operacja find jest powtarzana 1000 razy. Wyjście jest całkowity czas w sekundach dla 1000 powtórzeń, a średni czas dla jednego znaleziska w milisekundach.

The lokalizatory są – dla xpath - "elementem div o tej dokładnej wartości klasy, gdzieś w DOM"; css jest podobny - "elementem div o tej klasie, gdzieś w DOM". Celowo wybrany, aby nie być przesadnie dostrojony; również selektor klas jest cytowany dla css jako "drugi najszybszy po id".

[5]}środowisko – Chrome v66. 0. 3359. 139, chromedriver v2.38, procesor: ULV Core M-5Y10 Zwykle działający z częstotliwością 1,5 GHz (tak, "edytor tekstu", a nie zwykła bestia i7).

Oto wyjście:

Css łączny czas 1000 powtórzeń: 8.84 s, per find: 8.84 ms

XPath łączny czas dla 1000 powtórzeń: 8.52 s, per find: 8.52 ms

Oczywiście czasy per find są dość bliskie; różnica jest 0.32 milisekundy. Nie skacz – xpath jest szybszy-czasem jest, czasem jest css.

Spróbujmy z innym zestawem lokalizatorów, trochę bardziej skomplikowanym-atrybutem posiadającym podłańcuch (wspólne podejście przynajmniej dla ja, idąc za klasą elementu, gdy jego część nosi znaczenie funkcjonalne):

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

Dwa lokalizatory są ponownie semantycznie takie same – "znajdź element div mający w swojej klasie atrybut ten podłańcuch". Oto wyniki:

Css łączny czas 1000 powtórzeń: 8.60 s, per find: 8.60 ms

XPath całkowity czas dla 1000 powtórzeń: 8.75 s, per find: 8.75 ms

Różnica 0,15 ms.

Przy bardziej złożonym DOM, wyniki są takie same; nie mam żadnych publicznie dostępne adresy URL pod ręką, aby dać przykład, ale ponownie widziałem podobne wyniki dla XPath i css.


Jako ćwiczenie-ten sam test, co w linked blog {[29] } w komentarzach / inne odpowiedzi - strona testowa jest publiczna, podobnie jak kod testowy .

Robią kilka rzeczy w kodzie-klikają na kolumnę, aby ją sortować, następnie pobierają wartości i sprawdzają poprawność sortowania interfejsu. Wytnę-po prostu weź lokalizatory, po tym wszystkim to jest test root, prawda?

Ten sam kod jak wyżej, z tymi zmianami w:

Adres url jest teraz http://the-internet.herokuapp.com/tables; są 2 testy.

Lokalizatory dla pierwszego z nich - "Finding Elements By ID and Class" - to:

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

Wynik:

Css łączny czas 1000 powtórzeń: 8.24 s, per find: 8.24 ms

XPath całkowity czas dla 1000 powtórzeń: 8.45 s, per find: 8.45 ms

Różnica 0,2 milisekundy.

" Znajdowanie Elementów Przez Przejście": {]}

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

Wynik:

Css łączny czas 1000 powtórzeń: 9.29 s, per find: 9.29 ms

XPath łączny czas dla 1000 powtórzeń: 8.79 s, per find: 8.79 ms

Tym razem jest to 0,5 ms (w odwrotnej kolejności xpath okazał się tutaj "szybszy").


Więc, poza xpath i css, który z nich wybrać dla wydajności? Odpowiedź jest prosta-Wybierz lokalizowanie według id .

W skrócie, jeśli id elementu jest unikalne (jak to według specyfikacji), jego wartość odgrywa ważną rolę w wewnętrznej reprezentacji DOM przeglądarki, a więc jest zwykle najszybsza.


Z występem poza obrazem, dlaczego uważam, że xpath jest lepszy? Proste-wszechstronność i moc.

Xpath jest językiem stworzonym do pracy z dokumentami XML; jako taki pozwala na znacznie potężniejsze konstrukcje niż css.
Na przykład, nawigacja w każdym kierunku w drzewie-znajdź element, a następnie udać się do dziadka i szukać dziecka z niego o pewnych właściwościach. Pozwala na wbudowane warunki logiczne-cond1 I not (cond2 lub not (cond3 i cond4)); wbudowane selektory - "znajdź div o tych dzieciach z tymi atrybutami, a następnie Nawiguj zgodnie z nim". Umożliwia przeszukiwanie w oparciu o wartość węzła – jednak jest to przydatne szczególnie w źle zorganizowanych dokumentach (brak określonych atrybutów, takich jak dynamiczne identyfikatory i klas).

Krok w css jest zdecydowanie łatwiejszy – można zacząć pisać selektory w ciągu kilku minut; ale po kilku dniach użytkowania, moc i możliwości xpath szybko pokonuje css.
I czysto subiektywne – złożony css jest o wiele trudniejszy do odczytania niż złożone wyrażenie xpath.

Wreszcie, znowu bardzo subiektywny-który wybrać? IMHO, nie ma dobrego lub złego wyboru - są to różne rozwiązania tego samego problemu, a co więcej nadaje się do pracy należy wybrać. Będąc fanem xpath nie wstydzę się używać w moich projektach mieszanki obu-heck, czasami jest znacznie szybciej po prostu rzucić css jeden, jeśli Wiem, że będzie działać dobrze.

 5
Author: Todor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 01:11:17