मैं एसओ सेलेनियम टैग राय पर अलोकप्रिय रखने जा रहा हूं कि XPath लंबे समय में सीएसएस के लिए बेहतर है।
इस लंबे पोस्ट के दो खंड हैं - पहले मैं बैक-ऑफ-द-नैपकिन प्रूफ दूंगा, दोनों के बीच प्रदर्शन अंतर 0.1-0.3 मिलीसेकंड है (हाँ; यह 100 माइक्रो सेकंड है) , और फिर मैं अपनी राय साझा करूँगा क्यों XPath अधिक शक्तिशाली है।
प्रदर्शन अंतर
चलो पहले "कमरे में हाथी" से निपटते हैं - जो xpath सीएसएस की तुलना में धीमा है।
वर्तमान सीपीयू पावर (2013 से उत्पादित कुछ भी x86) के साथ , यहां तक कि ब्राउज़रस्टैक / सॉसेलब / एम्स वीएम और ब्राउज़र के विकास पर भी (पढ़ें: पिछले 5 वर्षों में सभी लोकप्रिय हैं) शायद ही ऐसा हो। ब्राउज़र के इंजन विकसित हो गए हैं, xpath का समर्थन एक समान है, IE तस्वीर से बाहर है (हम में से अधिकांश के लिए उम्मीद है) । अन्य उत्तर में इस तुलना का सभी जगह उल्लेख किया जा रहा है, लेकिन यह बहुत ही प्रासंगिक है - कितने चल रहे हैं - या IE8 के खिलाफ स्वचालन के बारे में परवाह है?
यदि अंतर है, तो यह एक मिलीसेकंड के एक अंश में है ।
फिर भी, अधिकांश उच्च-स्तरीय ढांचे कच्चे सेलेनियम कॉल पर ओवरहेड के कम से कम 1ms को जोड़ते हैं (रैपर, हैंडलर, स्टेट स्टोरिंग आदि); पसंद का मेरा व्यक्तिगत हथियार - रोबॉटफ़्रेमवर्क - कम से कम 2ms जोड़ता है, जो मुझे प्रदान करने के लिए बलिदान करने से अधिक खुश है। AWS us-East-1 से BrowserStack के हब तक एक नेटवर्क राउंडट्रिप आमतौर पर 11 मिलीसेकंड है ।
इसलिए दूरस्थ ब्राउज़रों के साथ अगर xpath और css के बीच अंतर होता है, तो इसे परिमाण के क्रम में, बाकी सब चीज़ों के साथ बदल दिया जाता है।
माप
ऐसा नहीं है कि कई सार्वजनिक तुलनाएं (मैंने वास्तव में केवल एक का उल्लेख किया है) , इसलिए - यहां एक मोटा एकल-मामला, डमी और सरल है।
यह दो रणनीतियों X बार एक तत्व का पता लगाएगा, और उसके लिए औसत समय की तुलना करेगा।
लक्ष्य - ब्राउज़रस्टैक का लैंडिंग पृष्ठ, और इसका "साइन अप" बटन; इस पोस्ट को लिखने के रूप में HTML का स्क्रीनशॉट:
यहाँ परीक्षण कोड (अजगर) है:
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))
उन लोगों के लिए जो पायथन से परिचित नहीं हैं - यह पृष्ठ खोलता है, और तत्व पाता है - पहले सीएसएस लोकेटर के साथ, फिर xath के साथ; खोज ऑपरेशन को 1,000 बार दोहराया गया है। आउटपुट 1,000 पुनरावृत्ति के लिए सेकंड में कुल समय है, और मिलीसेकंड में एक के लिए औसत समय है।
लोकेटर हैं:
- xpath के लिए - "एक दिव्य तत्व जिसमें यह सटीक वर्ग मान है, कहीं डोम में";
- सीएसएस समान है - "इस वर्ग के साथ एक दिव्य तत्व, डोम में कहीं"।
जानबूझकर ओवर-ट्यून नहीं चुना गया; वर्ग चयनकर्ता को सीएसएस के लिए "एक आईडी के बाद दूसरा सबसे तेज़" के रूप में उद्धृत किया गया है।
पर्यावरण - क्रोम v66.0.3359.139, क्रोमेड्रिवर v2.38, सीपीयू: ULV Core M-5Y10 आमतौर पर 1.5GHz पर चल रहा है (हाँ, एक "वर्ड-प्रोसेसिंग" एक, नियमित रूप से 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 तेज है" - कभी-कभी यह है, कभी-कभी यह सीएसएस है।
आइए स्थानीय लोगों के एक और सेट के साथ प्रयास करें, एक छोटा सा और अधिक जटिल - एक विशेषता जिसमें एक विकल्प है (कम से कम मेरे लिए सामान्य दृष्टिकोण, तत्व के वर्ग के बाद जा रहा है जब इसका एक हिस्सा कार्यात्मक अर्थ धारण करता है) :
xpath_locator = '//div[contains(@class, "button-section")]'
css_locator = 'div[class~=button-section]'
दो लोकेटर फिर से एक ही हैं - "अपनी कक्षा में इस तत्व को प्रतिस्थापित करने वाले एक दिव्य तत्व को खोजें"।
यहाँ परिणाम हैं:
css total time 1000 repeats: 8.60s, per find: 8.60ms
xpath total time for 1000 repeats: 8.75s, per find: 8.75ms
0.15ms की कठिनाई ।
एक अभ्यास के रूप में - टिप्पणियों / अन्य उत्तर में लिंक किए गए ब्लॉग में जैसा परीक्षण किया गया है - परीक्षण पृष्ठ सार्वजनिक है, और इसलिए परीक्षण कोड है ।
वे कोड में कुछ चीजें कर रहे हैं - इसके द्वारा सॉर्ट करने के लिए एक कॉलम पर क्लिक करना, फिर मान प्राप्त करना और यूआई सॉर्ट की जांच करना सही है।
मैं इसे काट दूंगा - बस लोकेटर मिल जाएंगे, आखिर - यह रूट टेस्ट है, है ना?
इन परिवर्तनों के साथ ऊपर जैसा ही कोड:
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
की Diff 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 साल बाद (बेहतर ब्राउज़र इंजन) और केवल लोकेटर प्रदर्शन (यूआई, आदि में छंटनी जैसी कोई कार्रवाई ) पर ध्यान केंद्रित नहीं किया गया, वही परीक्षण किया गया - सीएसएस और एक्सपीथ के बीच व्यावहारिक रूप से कोई अंतर नहीं है।
तो, xpath और css में से, दोनों में से किसको प्रदर्शन के लिए चुनना है? उत्तर सरल है - आईडी द्वारा पता लगाना चुनें ।
लंबी कहानी छोटी है, अगर किसी तत्व की आईडी अद्वितीय है (जैसा कि यह चश्मा के अनुसार माना जाता है), तो इसका मान DOM के ब्राउज़र के आंतरिक प्रतिनिधित्व में महत्वपूर्ण भूमिका निभाता है, और इस प्रकार आमतौर पर सबसे तेज़ होता है।
फिर भी, अद्वितीय और निरंतर (उदाहरण के लिए ऑटो-जेनरेट नहीं) आईडी हमेशा उपलब्ध नहीं होती हैं, जो हमें "सीएसएस के लिए सीएसएस क्यों है?"
XPath लाभ
चित्र के प्रदर्शन से, मुझे लगता है कि xpath बेहतर क्यों है? सरल - बहुमुखी प्रतिभा, और शक्ति।
Xpath XML दस्तावेजों के साथ काम करने के लिए विकसित भाषा है; जैसे, यह सीएसएस की तुलना में बहुत अधिक शक्तिशाली निर्माणों की अनुमति देता है।
उदाहरण के लिए, पेड़ में हर दिशा में नेविगेशन - एक तत्व ढूंढें, फिर उसके दादा-दादी के पास जाएं और इसके कुछ गुणों वाले बच्चे की खोज करें।
यह एम्बेडेड बूलियन स्थितियों की अनुमति देता है - cond1 and not(cond2 or not(cond3 and cond4))
; एम्बेडेड चयनकर्ता - "इन विशेषताओं वाले इन बच्चों वाले एक डिव को खोजें, और फिर उसके अनुसार नेविगेट करें"।
XPath एक नोड के मूल्य (इसके पाठ) के आधार पर खोज करने की अनुमति देता है - हालांकि इस अभ्यास पर आधारित है, यह विशेष रूप से बुरी तरह से संरचित दस्तावेजों में काम में आता है (गतिशील आईडी और कक्षाओं की तरह कोई निश्चित गुण नहीं है - इस पाठ द्वारा तत्व का पता लगाएं सामग्री) ।
सीएसएस में कदम रखना निश्चित रूप से आसान है - कोई मिनटों में चयनकर्ताओं को लिखना शुरू कर सकता है; लेकिन कुछ दिनों के उपयोग के बाद, xpath की शक्ति और संभावनाएं जल्दी से सीएसएस से अधिक हो गई हैं।
और विशुद्ध रूप से व्यक्तिपरक - एक जटिल सीएसएस एक जटिल xpath अभिव्यक्ति की तुलना में पढ़ने के लिए बहुत कठिन है।
आउटरो;)
अंत में, फिर से बहुत व्यक्तिपरक - जो एक को चुना?
आईएमओ, कोई सही या गलत विकल्प नहीं है - वे एक ही समस्या के अलग-अलग समाधान हैं, और जो कुछ भी नौकरी के लिए अधिक उपयुक्त है, उसे चुनना चाहिए।
XPath का "प्रशंसक" होने के नाते मुझे अपनी परियोजनाओं में दोनों के मिश्रण का उपयोग करने में शर्म नहीं है - बिल्ली, कभी-कभी यह सिर्फ एक सीएसएस एक को फेंकने के लिए बहुत तेज़ होता है, अगर मुझे पता है कि यह काम ठीक कर देगा।