আমি এসও সেলেনিয়াম ট্যাগ মতামত নিয়ে অপ্রিয় লোককে ধরে রাখতে চলেছি যে এক্সপ্যাথ দীর্ঘকালীন সিএসএসের চেয়ে বেশি পছন্দযোগ্য।
এই দীর্ঘ পোস্টটির দুটি বিভাগ রয়েছে - প্রথমে আমি একটি ব্যাক অফ দ্য ন্যাপকিন প্রুফ রাখব উভয়ের মধ্যে পারফরম্যান্স পার্থক্য 0.1-0.3 মিলি সেকেন্ড (হ্যাঁ; এটি 100 মাইক্রো সেকেন্ড) , এবং তারপরে আমি আমার মতামতটি ভাগ করব কেন এক্সপথ আরও শক্তিশালী।
পারফরম্যান্স পার্থক্য
আসুন প্রথমে "ঘরে হাতি" সামলান - সেই এক্সপথটি CSS এর চেয়ে ধীর er
বর্তমান সিপিইউ পাওয়ার সহ (পড়ুন: ২০১৩ সাল থেকে উত্পাদিত কিছু x86) , এমনকি ব্রাউজারস্ট্যাক / সসেল্যাবস / অ্যাউজ ভিএম এবং ব্রাউজারগুলির বিকাশ (পড়ুন: বিগত ৫ বছরে সমস্ত জনপ্রিয়) যা খুব কমই ঘটেছে। ব্রাউজারের ইঞ্জিনগুলি বিকশিত হয়েছে, এক্সপথের সমর্থনটি অভিন্ন, আইই চিত্রের বাইরে নেই (আশা করি আমাদের বেশিরভাগের জন্য) । অন্যান্য উত্তরের এই তুলনাটি পুরো জায়গাতেই উদ্ধৃত করা হচ্ছে, তবে এটি খুব প্রাসঙ্গিক - কতগুলি চলছে - বা যত্ন নিচ্ছে - আইই 8 এর বিরুদ্ধে অটোমেশন রয়েছে?
যদি কোনও পার্থক্য থাকে তবে এটি মিলিসেকেন্ডের ভগ্নাংশে ।
তবুও, বেশিরভাগ উচ্চ-স্তরের ফ্রেমওয়ার্কগুলি যাইহোক যাইহোক কাঁচা সেলেনিয়াম কলের উপরে কমপক্ষে 1 মিমি ওভারহেড যুক্ত করে (মোড়ক, হ্যান্ডলার, রাজ্য সংরক্ষণ ইত্যাদি); আমার পছন্দের ব্যক্তিগত অস্ত্র - রোবটফ্রেমওয়ার্ক - কমপক্ষে 2 মিম যোগ করে, যা এটি সরবরাহ করে তার জন্য ত্যাগ করতে আমি বেশি খুশি। ব্রাউজারস্ট্যাকের হাবের জন্য একটি এডাব্লুএস ইউএস-পূর্ব -১ থেকে একটি নেটওয়ার্ক রাউন্ডট্রিপ সাধারণত 11 মিলিসেকেন্ড হয় ।
তাই রিমোট ব্রাউজারগুলির সাথে যদি এক্সপথ এবং সিএসএসের মধ্যে পার্থক্য থাকে তবে তা অন্য সমস্ত কিছুর চেয়ে কমিয়ে দেয় itude
পরিমাপ
এখানে অনেকগুলি সরকারী তুলনা নেই (আমি সত্যিই কেবল উদ্ধৃত একটি দেখেছি) , সুতরাং - এখানে মোটামুটি একক-কেস, ডামি এবং সাধারণ একটি।
এটি X টি দুটি কৌশল দ্বারা একটি উপাদান সনাক্ত করবে এবং এর জন্য গড় সময়ের তুলনা করবে।
লক্ষ্য - ব্রাউজারস্ট্যাকের অবতরণ পৃষ্ঠা এবং এর "সাইন আপ" বোতাম; এইচটিএমএল এর একটি স্ক্রিনশট এই পোস্টটি লিখতে হিসাবে:
পরীক্ষার কোডটি এখানে রয়েছে (অজগর):
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))
পাইথনের সাথে পরিচিত নয় তাদের জন্য - এটি পৃষ্ঠাটি খোলে এবং উপাদানটি সন্ধান করে - প্রথমে সিএসএস লোকেটার দিয়ে, তারপর এক্সপথ দিয়ে; ফাইন্ড অপারেশনটি 1000 বার পুনরাবৃত্তি করা হয়। আউটপুটটি 1000 পুনরাবৃত্তির জন্য সেকেন্ডে মোট সময় এবং মিলিসেকেন্ডে সন্ধানের গড় সময়।
লোকেশনগুলি হ'ল:
- এক্সপাথের জন্য - "একটি ডিভ উপাদানটির এই সঠিক শ্রেণীর মান রয়েছে, কোথাও ডিওএম-এর";
- সিএসএস একই রকম - "এই শ্রেণীর সাথে একটি ডিভ উপাদান, কোথাও ডিওএম"।
ইচ্ছাকৃতভাবে অতিরিক্ত সুর করা না বেছে নেওয়া হয়েছে; এছাড়াও, শ্রেণি নির্বাচককে CSS এর জন্য "একটি আইডির পরে দ্বিতীয় দ্রুততম" হিসাবে উল্লেখ করা হয়।
পরিবেশ - ক্রোম v66.0.3359.139, ক্রোমড্রাইভার v2.38, সিপিইউ: ইউএলভি কোর এম -5Y10 সাধারণত 1.5GHz এ চলমান (হ্যাঁ, একটি "ওয়ার্ড-প্রসেসিং" এক, এমনকি নিয়মিত আই 7 জন্তু নয়) ।
এখানে ফলাফল:
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 মিলি সেকেন্ডের । "এক্সপথটি দ্রুততর" লাফিয়ে না - কখনও কখনও এটি সিএসএস হয় ss
আসুন আমরা আরেকটি লোকেটারের সাথে চেষ্টা করি, এটি একটি সামান্য-বিট আরও জটিল - একটি অ্যাট্রিবিউটস যার একটি স্ট্রিং থাকে (কমপক্ষে আমার পক্ষে সাধারণ দৃষ্টিভঙ্গি, কোনও উপাদানটির শ্রেণি অনুসরণ করে যখন এর একটি অংশ কার্যকরী অর্থ বহন করে) :
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
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 এর চেয়ে অনেক বেশি শক্তিশালী নির্মাণের অনুমতি দেয়।
উদাহরণস্বরূপ, গাছের প্রতিটি দিকে নেভিগেশন - কোনও উপাদান সন্ধান করুন, তারপরে তার পিতামাতার কাছে যান এবং নির্দিষ্ট বৈশিষ্ট্যযুক্ত এটির সন্তানের সন্ধান করুন।
এটি এম্বেডড বুলিয়ান শর্তগুলির অনুমতি দেয় - cond1 and not(cond2 or not(cond3 and cond4))
; এম্বেড করা নির্বাচক - "এই বৈশিষ্ট্যগুলির সাথে এই শিশুদের নিয়ে একটি ডিভ আবিষ্কার করুন এবং তারপরে এটি অনুসারে নেভিগেট করুন"।
এক্সপথ নোডের মান (এর পাঠ্য) এর উপর ভিত্তি করে অনুসন্ধানের অনুমতি দেয় - তবে এই অনুশীলনের উপর ভিত্তি করে দেখা যায়, এটি বিশেষত খারাপ কাঠামোযুক্ত নথিগুলিতে কার্যকর হয় (গতিশীল আইডিস এবং ক্লাসগুলির মতো পদক্ষেপের কোনও নির্দিষ্ট বৈশিষ্ট্য নয়) - এর পাঠ্য অনুসারে উপাদানটি সনাক্ত করুন সামগ্রী) ।
সিএসএসে পদক্ষেপটি অবশ্যই সহজতর - কেউ কয়েক মিনিটের মধ্যে নির্বাচকদের লেখা শুরু করতে পারে; তবে কয়েক দিন ব্যবহারের পরে, পাওয়ার এবং সম্ভাবনা xpath দ্রুত CSS কে পরাস্ত করেছে।
এবং খাঁটি সাপেক্ষিক - একটি জটিল এক্সপ্যাথ এক্সপ্রেশনের চেয়ে জটিল সিএসএস পড়া খুব কঠিন।
আউটরো;)
অবশেষে, আবার খুব সাবজেক্টিভ - কোনটি বেছে নেবে?
আইএমও, কোন সঠিক বা ভুল পছন্দ নেই - এগুলি একই সমস্যার বিভিন্ন সমাধান এবং কাজের জন্য আরও উপযুক্ত যেটি বেছে নেওয়া উচিত।
এক্সপথের "অনুরাগী" হওয়ায় আমি আমার প্রকল্পগুলিতে উভয়ের মিশ্রণ ব্যবহার করতে লজ্জা পাচ্ছি না - হেক, কখনও কখনও কেবল একটি সিএসএস ফেলে দেওয়া আরও দ্রুত হয়, যদি আমি জানি এটি কাজটি ঠিকঠাক করবে।