সিএসএসলেক্টর এবং এক্সপাথের মধ্যে পার্থক্য কী এবং ক্রস ব্রাউজার পরীক্ষার জন্য পারফরম্যান্সের ক্ষেত্রে আরও ভাল?


89

আমি বহুভাষিক ওয়েব অ্যাপ্লিকেশনে সেলেনিয়াম ওয়েবড্রাইভার ২.২৫.০ এর সাথে কাজ করছি এবং মূলত পৃষ্ঠাগুলি (আরবি, ইংরাজী, রাশিয়ান ইত্যাদির মতো বিভিন্ন ভাষার জন্য) পরীক্ষা করছি।

আমার অ্যাপ্লিকেশনটির জন্য যা পারফরম্যান্স অনুসারে ভাল এবং নিশ্চিত হয়ে নিন যে এটি সমস্ত ব্রাউজারের জন্য সমর্থন করা উচিত (যেমন IE 7,8,9, এফএফ, ক্রোম ইত্যাদি)।

আপনার মূল্যবান পরামর্শের জন্য আগাম ধন্যবাদ।

উত্তর:


108

সিএসএস নির্বাচকরা এক্সপাথের থেকে অনেক বেশি ভাল পারফর্ম করেন এবং এটি সেলেনিয়াম সম্প্রদায়ের মধ্যে ডকুমেন্টেড। এখানে কিছু কারণ রয়েছে,

  • প্রতিটি ব্রাউজারে এক্সপাথ ইঞ্জিনগুলি পৃথক, তাই এগুলি বেমানান
  • IE এর নেটিভ এক্সপথ ইঞ্জিন নেই, সুতরাং সেলেনিয়াম তার এপিআই এর সামঞ্জস্যের জন্য নিজস্ব xpath ইঞ্জিনকে ইনজেক্ট করে। তাই ওয়েবড্রাইভার সহজাতভাবে প্রচার করে এমন নেটিভ ব্রাউজার বৈশিষ্ট্যগুলি ব্যবহার করার সুবিধাটি আমরা হারাব।
  • এক্সপাথ জটিল হয়ে ওঠে এবং তাই আমার মতে পড়া শক্ত করে

তবে কিছু পরিস্থিতি রয়েছে যেখানে আপনার এক্সপথ ব্যবহার করা দরকার, উদাহরণস্বরূপ, কোনও পিতামাতার উপাদান অনুসন্ধান করা বা এর পাঠ্য অনুসারে উপাদান অনুসন্ধান করা (আমি পরে প্রস্তাব করব না)।

আপনি এখানে সাইমন থেকে ব্লগ পড়তে পারেন । তিনি এক্সপথের ওপরে সিএসএসেরও পরামর্শ দেন।

আপনি যদি বিষয়বস্তু পরীক্ষা করে থাকেন তবে উপাদানগুলির সামগ্রীর উপর নির্ভরশীল এমন নির্বাচকগুলি ব্যবহার করবেন না। এটি প্রতিটি লোকালের জন্য রক্ষণাবেক্ষণের দুঃস্বপ্ন হবে। বিকাশকারীদের সাথে কথা বলার চেষ্টা করুন এবং অ্যাপ্লিকেশনটিতে যেমন পাঠ্য বা সংস্থান বান্ডিল ইত্যাদির পাঠ্যকে বহিরাগত করার জন্য তারা ব্যবহার করেছিলেন এমন কৌশলগুলি ব্যবহার করুন এখানে আমার ব্লগটি এটি বিস্তারিতভাবে ব্যাখ্যা করেছে।

সম্পাদনা 1

@ পারিশোদককে ধন্যবাদ, এখানে লিঙ্কটি দেওয়া হয়েছে যা সিএসএসের কার্যকারিতা আরও ভাল তা প্রমাণ করে যে সংখ্যাগুলি সরবরাহ করে


7
সিএসএস নির্বাচকরা পাঠ্যের অনুমতি দেয় না। সিএসএসে 'অন্তর্ভুক্ত' অবমূল্যায়ন করা হয়। আমি উপরে যেমন বলেছি, নির্বাচনের বিষয়বস্তু থেকে পৃথক থাকতে হবে। সামগ্রীগুলি বাইরে থাকতে পারে। আপনি বিকাশকারীদের সাথে কথা বলতে পারেন। তাদের অবশ্যই পাঠ্যটি বহিরাগত করা উচিত। তাদের বেশিরভাগ সময় লোকাল প্রতি অভিধান থাকে। সুতরাং অভিধানের কীগুলি একই তবে মান অনুসারে লোকেল অনুসারে পরিবর্তন হয়। বিষয়বস্তু যাচাই করতে আপনি এই ফাইলগুলি ব্যবহার করতে পারেন। নোট করুন যে আপনাকে জেডিকে থেকে নাটিভি 2 এসসিআই সরঞ্জামটি ব্যবহার করে নেটিভ অক্ষরগুলি ascii অক্ষরে রূপান্তর করতে হবে। আমার অবশ্যই এটিতে একটি ব্লগ লিখতে হবে। আমি এই কৌশলটি ব্যবহার করে অনেক লোকেল পরীক্ষা করেছি।
নিলেশ

4
@ চেতান answer উত্তরে আমি আমার ব্লগের লিঙ্কটি যুক্ত করেছি। দুঃখিত এটি একটি সময় নিয়েছে। আশা করি এটি আপনাকে সহায়তা করবে।
নিলেশ

8
@ নীলেশ: আমি আপনার উত্তরের সাথে একমত নই। ১) প্রতিটি ব্রাউজারে সিএসএস ইঞ্জিনগুলিও আলাদা। এটি কোন যুক্তি নয়। ৩) কিছু অভিজ্ঞতার সাথে এক্সপথটি বোঝা খুব সহজ এবং CSS এর চেয়ে বেশি কার্যকারিতা সরবরাহ করে। যদি আপনি খুব নেস্টেড উপাদান অনুসন্ধান করেন তবে সেগুলি উভয়ই জটিল: এক্সপথ এবং সিএসএস। আমার অভিজ্ঞতায় এই প্রশ্নের কোনও সাধারণ উত্তর ভুল হবে। সিএসএস / এক্সপ্যাথ সিদ্ধান্তটি পৃথকভাবে নেওয়া উচিত। মূল প্রশ্ন ছিল কর্মক্ষমতা সম্পর্কে about আপনার উত্তরটি মূলত অনুমান এবং ব্যক্তিগত মতামত নিয়ে গঠিত। একটি বাস্তব প্রমাণ কর্মক্ষমতা পরিমাপ এবং ফলাফল এখানে পোস্ট করা হবে।
এলমিউ

4
একটি খুব ভাল নিবন্ধ যা আপনার প্রথম বাক্যটির সাথে বিরোধী: "সিএসএস নির্বাচকরা এক্সপথের চেয়ে অনেক বেশি ভাল সম্পাদন করে"। এটি এত সহজ নয়, এটি বিপরীতও হতে পারে। এবং: "আইই এর নেটিভ এক্সপথ ইঞ্জিন নেই, সুতরাং সেলেনিয়াম তার এপিআই এর সামঞ্জস্যের জন্য নিজস্ব xpath ইঞ্জিনকে ইনজেক্ট করে।" এখানে সেলেনিয়াম একটি ডিজাইনের ত্রুটিতে ভুগছে। জাভা স্ক্রিপ্টের পরিবর্তে সি ++ এ এক্সপথ ইঞ্জিনটি প্রয়োগ করা আরও ভাল হত। তবে আইই মারা গেছে, এখন এজ এসেছে। সমস্ত পারফরম্যান্স প্রশ্নের পিছনে একটি ভুলে যাওয়া উচিত নয় যে কোনও উপাদানটির পাঠ্য অনুসন্ধান করার মতো CSS এর মধ্যে খুব গুরুত্বপূর্ণ কার্যকারিতা নেই।
এলমিউ

4
এলিমেন্টালেন্সিলিয়াম. com/tips/32-xpath-vs-css এমন মানদণ্ড সরবরাহ করে যা সিএসএস 3 উল্লেখযোগ্যভাবে দ্রুত হয় না বলে প্রস্তাব করে।
এমসি0e

46

আমি এসও সেলেনিয়াম ট্যাগ মতামত নিয়ে অপ্রিয় লোককে ধরে রাখতে চলেছি যে এক্সপ্যাথ দীর্ঘকালীন সিএসএসের চেয়ে বেশি পছন্দযোগ্য।

এই দীর্ঘ পোস্টটির দুটি বিভাগ রয়েছে - প্রথমে আমি একটি ব্যাক অফ দ্য ন্যাপকিন প্রুফ রাখব উভয়ের মধ্যে পারফরম্যান্স পার্থক্য 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 এর পার্থক্য ।


অনুশীলন হিসাবে - মন্তব্য / অন্যান্য উত্তরের লিঙ্কযুক্ত ব্লগের মতো একই পরীক্ষা - পরীক্ষার পৃষ্ঠাটি সর্বজনীন, এবং টেস্টিং কোডটিও

তারা কোডে কয়েকটি জিনিস করছেন - এটির দ্বারা বাছাই করতে একটি কলামে ক্লিক করা, তারপরে মানগুলি পাওয়া এবং ইউআই বাছাই করা পরীক্ষা করা সঠিক।
আমি এটি কেটে দেব - কেবল लोকেটারগুলি পেয়ে যাব, সর্বোপরি - এটিই মূল পরীক্ষা, তাই না?

উপরের মত একই কোড, এই পরিবর্তনগুলির সাথে:

  • ইউআরএল এখন 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 এর চেয়ে অনেক বেশি শক্তিশালী নির্মাণের অনুমতি দেয়।
উদাহরণস্বরূপ, গাছের প্রতিটি দিকে নেভিগেশন - কোনও উপাদান সন্ধান করুন, তারপরে তার পিতামাতার কাছে যান এবং নির্দিষ্ট বৈশিষ্ট্যযুক্ত এটির সন্তানের সন্ধান করুন।
এটি এম্বেডড বুলিয়ান শর্তগুলির অনুমতি দেয় - cond1 and not(cond2 or not(cond3 and cond4)); এম্বেড করা নির্বাচক - "এই বৈশিষ্ট্যগুলির সাথে এই শিশুদের নিয়ে একটি ডিভ আবিষ্কার করুন এবং তারপরে এটি অনুসারে নেভিগেট করুন"।
এক্সপথ নোডের মান (এর পাঠ্য) এর উপর ভিত্তি করে অনুসন্ধানের অনুমতি দেয় - তবে এই অনুশীলনের উপর ভিত্তি করে দেখা যায়, এটি বিশেষত খারাপ কাঠামোযুক্ত নথিগুলিতে কার্যকর হয় (গতিশীল আইডিস এবং ক্লাসগুলির মতো পদক্ষেপের কোনও নির্দিষ্ট বৈশিষ্ট্য নয়) - এর পাঠ্য অনুসারে উপাদানটি সনাক্ত করুন সামগ্রী)

সিএসএসে পদক্ষেপটি অবশ্যই সহজতর - কেউ কয়েক মিনিটের মধ্যে নির্বাচকদের লেখা শুরু করতে পারে; তবে কয়েক দিন ব্যবহারের পরে, পাওয়ার এবং সম্ভাবনা xpath দ্রুত CSS কে পরাস্ত করেছে।
এবং খাঁটি সাপেক্ষিক - একটি জটিল এক্সপ্যাথ এক্সপ্রেশনের চেয়ে জটিল সিএসএস পড়া খুব কঠিন।

আউটরো;)

অবশেষে, আবার খুব সাবজেক্টিভ - কোনটি বেছে নেবে?

আইএমও, কোন সঠিক বা ভুল পছন্দ নেই - এগুলি একই সমস্যার বিভিন্ন সমাধান এবং কাজের জন্য আরও উপযুক্ত যেটি বেছে নেওয়া উচিত।

এক্সপথের "অনুরাগী" হওয়ায় আমি আমার প্রকল্পগুলিতে উভয়ের মিশ্রণ ব্যবহার করতে লজ্জা পাচ্ছি না - হেক, কখনও কখনও কেবল একটি সিএসএস ফেলে দেওয়া আরও দ্রুত হয়, যদি আমি জানি এটি কাজটি ঠিকঠাক করবে।


লগইন পৃষ্ঠাতে কতটি নোড রয়েছে? লগইন পৃষ্ঠাগুলি সাধারণত খুব সাধারণ হয় তাই আপনি সম্ভবত খুব কম পার্থক্য দেখে থাকতে পারেন।
পৃষ্ঠা

অন্যান্য কর্মক্ষমতা পরীক্ষা বিভিন্ন ব্রাউজার জুড়ে অনেক বড় পার্থক্য দেখায়।
পৃষ্ঠা

4
আপনার প্রথম প্রশ্নের জন্য - ডমটির একটি স্ক্রিনশট উত্তরে উপস্থিত রয়েছে এবং পৃষ্ঠাটি অনলাইন এবং সর্বজনীন। আপনার প্রথম এবং দ্বিতীয়টির জন্য, যদি আপনি উত্তরটি মনোযোগ সহকারে পড়েন তবে আমি অ্যালিমেন্টালেনেনিয়াম হিসাবে একই পরীক্ষার পুনরাবৃত্তি করেছি, এমন কয়েকটি উপলব্ধ তুলনাগুলির মধ্যে একটি যা প্রায়শই উদ্ধৃত হয়, তাদের হিসাবে একই লক্ষ্য এবং লোকেটারগুলি ব্যবহার করে, তবে কেবল 5 বছরের নতুন ব্রাউজারগুলির সাথে ।
টডর মিনাকভ

4
@ ট্ডারমিনাকভ দুর্দান্ত পোস্ট !!! আমি আপনার সাথে 100% একমত হয়েছি আমি এও মনে করি যে এক্সপথ সিনট্যাক্সটি আরও প্রাকৃতিক (কমপক্ষে আমার কাছে) কারণ এটি এমন কিছু যা আমরা সবাই খুব ভাল জানি তার সাথে সাদৃশ্যপূর্ণ। এবং এটি ফাইল / ফোল্ডার পাথ। তাই আমি মনে করি সিএসএস বা এক্সপ্যাথের শূন্য জ্ঞানের অধিকারী একজন ব্যক্তি এক্সপথটি আরও সহজ শিখবেন। যেহেতু পারফরম্যান্সের পার্থক্য নগণ্য, তাই আমি মনে করি বক্ররেখা শেখার পক্ষে দৃ consideration় বিবেচনা করা উচিত।
hfontanez

4
আপনাকে @hfontanez ধন্যবাদ; ফাইল সিস্টেম কাঠামোর সাথে দুর্দান্ত সাদৃশ্য, আমি এটি ভাবিনি। আমি একটি অতি ক্ষুদ্র অংশ মতানৈক্য আছে ধাপ-ইন অনায়াস যদিও - জন্য XPath সিনট্যাক্স একটু প্রথমে ভয় হতে পারে, তাছাড়াও এটি কিছু gotcha হয়-এস হয়েছে (INDEX []পর //উদাহরণস্বরূপ) । তবে শেখার এবং এটি ব্যবহারের প্রাথমিক দিনের পরে, সবাই শেখার বক্ররেখার টিপিং পয়েন্টটি অতিক্রম করে :) (সিএসএস পদক্ষেপটি স্বাচ্ছন্দ্যে সহজ, আইএমএইচও)
টডর মিনাকভ

13

মধ্যে বিতর্ক cssSelector বনাম জন্য XPath সবচেয়ে ইতিবাচক বিতর্ক এক হিসাবে থাকবে সেলেনিয়াম কমিউনিটি । আমরা ইতিমধ্যে যা জানি তা সংক্ষিপ্ত করা যেতে পারে:

  • সিএসএসলেক্টরের পক্ষে থাকা লোকেরা বলে যে এটি বেশি পঠনযোগ্য এবং দ্রুত (বিশেষত যখন ইন্টারনেট এক্সপ্লোরারের বিরুদ্ধে চলছে)।
  • এক্সপ্যাথের পক্ষে যারা এই পৃষ্ঠাটি স্থানান্তরিত করতে সক্ষম হন (যখন সিএসএসলেক্টর পারবেন না)।
  • আইই 8 এর মতো পুরানো ব্রাউজারগুলিতে ডিওএম ট্র্যাভার করা সিএসএসলেক্টরের সাথে কাজ করে না তবে এক্সপ্যাথের সাথে ঠিক আছে ।
  • জন্য XPath করে DOM আপ চলতে পারে (যেমন পিতা বা মাতা সন্তানকে থেকে), যেহেতু cssSelector শুধুমাত্র করে DOM নিচে তর্ক করতে পারেন (যেমন সন্তানের পিতা বা মাতা থেকে)
  • তবে পুরানো ব্রাউজারগুলিতে সিএসএসলেক্টরের সাথে ডিওএমকে অতিক্রম করতে সক্ষম হবেন না এটি অকারণে খারাপ জিনিস নয় কারণ এটি আপনার সূচকের চেয়ে বেশি যে আপনার পৃষ্ঠায় খুব কম নকশা রয়েছে এবং এটি কিছু সহায়ক মার্কআপ থেকে উপকৃত হতে পারে।
  • বেন বার্টন উল্লেখ করেছেন যে আপনার সিএসএসলেক্টর ব্যবহার করা উচিত কারণ অ্যাপ্লিকেশনগুলি এভাবেই তৈরি করা হয়। এটি পরীক্ষাগুলি লিখতে, কথা বলতে এবং অন্যকে বজায় রাখতে সহায়তা করে easier
  • আদম Goucher আরো একটি সংকর পদ্ধতির দত্তক গ্রহণ করা বলছেন - ID- র প্রথম মনোযোগ, তারপর cssSelector এবং ওঠানামা জন্য XPath শুধুমাত্র যখন আপনি এটি (যেমন করে DOM আপ হাঁটা) এবং যে প্রয়োজন জন্য XPath সবসময় উন্নত Locators জন্য আরো শক্তিশালী হতে হবে।

ডেভ হেফনার দুটি HTML ডেটা টেবিল সহ একটি পৃষ্ঠায় একটি পরীক্ষা করেছিলেন , একটি টেবিল সহায়ক গুণাবলী ( আইডি এবং ক্লাস ) ছাড়াই রচনা করা হয়েছিল , এবং অন্যটি তাদের সাথে। আমি পরীক্ষার পদ্ধতি এবং এই পরীক্ষার ফলাফল বিশদভাবে বিশদভাবে বিশ্লেষণ করেছি বিশদ বিবরণে স্বয়ংক্রিয় পরীক্ষার জন্য আমি কেন কখনও সিএসএসলেক্টর নির্বাচকদের এক্সপ্যাথের বিপরীতে ব্যবহার করব ? । যদিও এই পরীক্ষাটি দেখিয়েছে যে প্রতিটি লোকেটার কৌশল ব্রাউজারগুলিতে যুক্তিসঙ্গত সমতুল্য, তবে এটি আমাদের জন্য পুরো চিত্রটি পর্যাপ্তভাবে আঁকেনি। অন্যান্য আলোচনায় ডেভ হাফনার সিএসএস বনাম। এক্স পাথ, একটি মাইক্রোস্কোপের অধীনেউল্লিখিত, একটি শেষ থেকে শেষের পরীক্ষায় নাটক সস স্টার্টআপ , ব্রাউজার স্টার্টআপ এবং পরীক্ষার অধীনে থাকা অ্যাপ্লিকেশনটিতে এবং ল্যাটেন্সিতে প্রচুর অন্যান্য ভেরিয়েবল ছিল । দুর্ভাগ্যজনকভাবে সেই পরীক্ষাটি গ্রহণ করা যেতে পারে যে একজন চালক অন্যের তুলনায় দ্রুত হতে পারে (যেমন আই আই বনাম ফায়ারফক্স ), যখন বাস্তবে এটি মোটেই ঘটেনি। সিএসএসলেক্টর এবং এক্সপ্যাথের মধ্যে পারফরম্যান্সের পার্থক্য কী তা আসল স্বাদ পেতে, আমাদের আরও গভীর খনন করা দরকার। পারফরম্যান্স বেঞ্চমার্কিং ইউটিলিটিটি ব্যবহার করার সময় আমরা একটি স্থানীয় মেশিন থেকে সমস্ত কিছু চালিয়ে তা করেছি। আমরা পুরো পরীক্ষা চালানোর পরিবর্তে একটি নির্দিষ্ট সেলেনিয়াম ক্রিয়ায় মনোনিবেশ করেছি এবং জিনিসগুলি বহুবার চালিত করি। সেলেনিয়ামের জন্য সিএসসিলেকটার বনাম এক্সপ্যাথের আলোচনায় আমি সুনির্দিষ্ট পরীক্ষা পদ্ধতি এবং এই পরীক্ষার ফলাফল বিশ্লেষণ করেছি । তবে পরীক্ষাগুলিতে এখনও একটি দিক অনুপস্থিত ছিল যেমন আরও ব্রাউজারের কভারেজ (যেমন, ইন্টারনেট এক্সপ্লোরার 9 এবং 10) এবং আরও বড় এবং গভীর পৃষ্ঠার বিরুদ্ধে পরীক্ষা করা।

ডেভ হাফনার আরেকটি আলোচনায় সিএসএস বনাম এক্স পাথ, একটি মাইক্রোস্কোপের আওতায় (পার্ট 2) উল্লেখ করেছে যাতে প্রয়োজনীয় বেঞ্চমার্কগুলি সর্বোত্তম সম্ভাব্য উপায়ে কভার করা হয়েছে তা নিশ্চিত করার জন্য আমাদের একটি উদাহরণ বিবেচনা করা উচিত যা একটি বৃহত এবং গভীর পৃষ্ঠা প্রদর্শন করে


পরীক্ষা সেটআপ

এই বিশদ উদাহরণটি প্রদর্শনের জন্য, একটি উইন্ডোজ এক্সপি ভার্চুয়াল মেশিন সেটআপ হয়েছিল এবং রুবি (1.9.3) ইনস্টল করা হয়েছিল। সেলেনিয়ামের জন্য সমস্ত উপলব্ধ ব্রাউজার এবং তাদের সমতুল্য ব্রাউজার ড্রাইভারও ইনস্টল করা হয়েছিল। বেঞ্চমার্কিংয়ের জন্য, রুবির স্ট্যান্ডার্ড লিব benchmarkব্যবহার করা হয়েছিল।


পরীক্ষার কোড

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

ফলাফল

দ্রষ্টব্য : আউটপুটটি কয়েক সেকেন্ডের মধ্যে রয়েছে এবং ফলাফলগুলি মৃত্যুদণ্ড কার্যকর করার জন্য মোট রান সময়ের জন্য।

সারণী আকারে:

সিএসএস_স্পাথ_উন্ডার_মাইক্রোস্কোপ 2

চার্ট ফর্ম ইন:

  • ক্রোম :

চার্ট ক্রোম

  • ফায়ারফক্স :

চার্ট-ফায়ারফক্স

  • ইন্টারনেট এক্সপ্লোরার 8 :

চার্ট- ie8

  • ইন্টারনেট এক্সপ্লোরার 9 :

চার্ট- ie9

  • ইন্টারনেট এক্সপ্লোরার 10 :

চার্ট- ie10

  • অপেরা :

চার্ট-অপেরা


ফলাফল বিশ্লেষণ

  • দ্রুত CSS সিলেক্টর পারফরম্যান্সের জন্য ক্রোম এবং ফায়ারফক্স স্পষ্টভাবে সুর করেছে ।
  • ইন্টারনেট এক্সপ্লোরার 8 এর একটি দখল ব্যাগ cssSelector হবে এমন কাজ নেই, নিয়ন্ত্রণ একটি আউট জন্য XPath ট্র্যাভেরসাল যে ~ সঙ্গে নেয় 65 সেকেন্ড, এবং একটি 38 দ্বিতীয় টেবিল ট্র্যাভেরসাল cssSelector বিরুদ্ধে তুলনা ফলাফল।
  • আইই 9 এবং 10 এ, এক্সপথ সামগ্রিকভাবে দ্রুত is সাফারিতে, এক্সপ্যাথের সাথে ধীরে ধীরে ট্রভারসাল রান চালানো বাদে এটি একটি টস আপ । আর প্রায় সব ব্রাউজারে জুড়ে, নেস্টেড সহোদর ট্র্যাভেরসাল এবং টেবিল সেল ট্র্যাভেরসাল সঙ্গে সম্পন্ন জন্য XPath একটি ব্যয়বহুল অপারেশন হয়।
  • এগুলি যে আশ্চর্যজনক হওয়া উচিত নয় যেহেতু লোকেটারগুলি ভঙ্গুর এবং অদক্ষ এবং আমাদের সেগুলি এড়ানো দরকার।

সারসংক্ষেপ

  • সার্বিক দুটি পরিস্থিতিতে কোথায় জন্য XPath লক্ষণীয়ভাবে তুলনায় ধীর হয় cssSelector । তবে এগুলি সহজেই এড়ানো যায়।
  • পারফরম্যান্স পার্থক্য সামান্য পক্ষে নন-আইই ব্রাউজারগুলির জন্য এবং কিছুটা পক্ষে আইই ব্রাউজারগুলির জন্য।

ট্রিভিয়া

আপনি এই গ্রন্থাগারটি ব্যবহার করে যেখানে ডেভ হেফনার সমস্ত কোড গুটিয়ে রেখেছিলেন , আপনি নিজেরাই বেঞ্চ-চিহ্ন সম্পাদন করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.