একটি নির্দিষ্ট স্ট্রিং রয়েছে এমন একটি গুনের সাথে আমি কীভাবে মিলব?


442

বৈশিষ্ট্যে একাধিক শব্দের সমন্বিত হলে অ্যাট্রিবিউট অনুসারে নোডগুলি নির্বাচন করতে আমার সমস্যা হচ্ছে। উদাহরণ স্বরূপ:

<div class="atag btag" />

এটি আমার এক্সপথ এক্সপ্রেশন:

//*[@class='atag']

এক্সপ্রেশন কাজ করে

<div class="atag" />

তবে আগের উদাহরণের জন্য নয়। আমি কীভাবে এটি নির্বাচন করতে পারি <div>?


9
এটি উল্লেখ করার মতো, আমি মনে করি, "আটাগ বিটাগ" দুটি নয়, একটি একক বৈশিষ্ট্য। আপনি xpath এ সাবস্ট্রিং ম্যাচিং করার চেষ্টা করছেন।
skaffman

3
হ্যাঁ আপনি ঠিক বলেছেন - আমি যা চাই তা ঠিক আছে।
ক্রেগ্রেইলস


1
এজন্য আপনার সিএসএস নির্বাচক ব্যবহার করা উচিত ... div.atagবা div.btag। সুপার সিম্পল, স্ট্রিং ম্যাচিং নয়, এবং ওয়ে দ্রুত (এবং ব্রাউজারগুলিতে আরও ভাল সমর্থিত)। এক্সপ্যাথ (এইচটিএমএল এর বিপরীতে) কী তা কার্যকর করতে পারে ... এটিতে থাকা টেক্সট এবং ডিওএম নেভিগেশনের জন্য উপাদানগুলি সন্ধান করা উচিত।
জেফসি

উত্তর:


486

এখানে একটি উদাহরণ যা ডিভ উপাদানগুলি খুঁজে পায় যার ক্লাসনেমে রয়েছে atag:

//div[contains(@class, 'atag')]

এখানে একটি উদাহরণ যা ডিভ উপাদানগুলি খুঁজে পায় যার ক্লাসনেমে রয়েছে atagএবং btag:

//div[contains(@class, 'atag') and contains(@class ,'btag')]

তবে এটির মতো আংশিক মিলও খুঁজে পাবে class="catag bobtag"

আপনি যদি আংশিক ম্যাচ না চান তবে নীচে ববিন্সের উত্তর দেখুন।


123
@ রেডবার্ড: এটি একটি আক্ষরিক উত্তর তবে ক্লাস-মিলের সমাধানটির জন্য সাধারণত কী করা উচিত তা নয়। বিশেষত এটি মিলবে <div class="Patagonia Halbtagsarbeit">, যার মধ্যে লক্ষ্যযুক্ত স্ট্রিং রয়েছে তবে প্রদত্ত শ্রেণীর সাথে এটি কোনও ডিভ নয়।

3
এটি সাধারণ দৃশ্যের জন্য কাজ করবে - তবে আপনি যে বৈশিষ্ট্যটির জন্য যাচাই করছেন তাতে মান কম বা কোনও নিয়ন্ত্রণ ছাড়াই বৃহত্তর প্রসঙ্গে আপনি এই উত্তরটি ব্যবহার করতে চান কিনা তা দেখুন। সঠিক উত্তরটি বোবিন্সের।
অলিভার

16
দুঃখিত, এটি একটি শ্রেণীর সাথে মেলে না, এটি একটি স্ট্রিংয়ের সাথে মেলে
টিমো হুভিনেন 14

5
এটি স্পষ্টতই ভুল হিসাবে এটি খুঁজে পেয়েছে: <div class = "annatag bobtag"> যা এটি করা উচিত নয়।
আলেক্সি বিনোগ্রাদভ

6
প্রশ্নটি ছিল "একটি নির্দিষ্ট স্ট্রিং রয়েছে" একটি নির্দিষ্ট শ্রেণীর সাথে মেলে না "
Alsatian

303

এমজেভির উত্তরটি একটি ভাল শুরু তবে এটিএগ প্রথম শ্রেণীর নাম তালিকাভুক্ত না হলে ব্যর্থ হবে।

স্বাভাবিক পদ্ধতির পরিবর্তে অযৌক্তিক:

//*[contains(concat(' ', @class, ' '), ' atag ')]

এটি ততক্ষণ কাজ করে যতক্ষণ না ক্লাস কেবল ফাঁকা জায়গাগুলির দ্বারা পৃথক করা হয়, এবং হোয়াইটস্পেসের অন্য রূপ নয়। এটি প্রায় সবসময়ই ঘটে থাকে। যদি এটি নাও হয় তবে আপনাকে আরও অনস্বাস্থ্যকর করতে হবে:

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

(শ্রেণীকরণের মতো স্থান-পৃথক স্ট্রিং দ্বারা নির্বাচন করা এমন সাধারণ ঘটনা যে এটি CSS3 এর '[শ্রেণি ~ = "আটাগ"]' এর মতো কোনও নির্দিষ্ট এক্সপথ ফাংশন নেই, অবাক করার মতো বিষয়))


57
বাহ, এক্সপথের কিছু সংশোধন দরকার
র্যান্ডি এল

13
@ রেডবার্ড সুপ্রে123 এর উত্তর যদি সমস্যা হয় তবে যদি "অ্যাটাগনবার্টও" এর মতো সিএসএস শ্রেণি থাকে যা আপনি নির্বাচন করতে চান না, যদিও আমি স্বীকার করব এটি সম্ভবত নাও হতে পারে (:
ড্র্যাভিকো

7
@ ক্রাজেরিলস: আপনি দয়া করে এই উত্তরটিকে সঠিক উত্তর হিসাবে গ্রহণ করতে পারেন? এটি ভবিষ্যতের অনুসন্ধানকারীদের আপনার প্রশ্নের দ্বারা বর্ণিত সমস্যার সঠিক সমাধান সনাক্ত করতে সহায়তা করবে। ধন্যবাদ!
অলিভার

2
@ চ00সাইট: হ্যাঁ তারা, এক্সপ্যাথ ২.০ এ এবং নিম্নলিখিতগুলি করতে পারে। এক্সপাথ ২.০ অফিসিয়াল হওয়ার আগে এই উত্তরটি লেখা হয়েছিল। দেখুন stackoverflow.com/a/12165032/423105 বা stackoverflow.com/a/12165195/423105
LarsH

1
আমার মতো হয়ে উঠবেন না এবং এই উদাহরণে আপনি যে শ্রেণীর সন্ধান করছেন তার চারপাশের স্থানগুলি সরিয়ে ফেলুন; তারা আসলে গুরুত্বপূর্ণ। অন্যথায় এটি কাজ করতে পারে তবে উদ্দেশ্যটি হারাতে পারে।
সিটিএস_এই

40

এটা চেষ্টা কর: //*[contains(@class, 'atag')]


ক্লাসের নাম হলে কী হবে grabatagonabag? (ইঙ্গিত: এটি এখনও মিলবে)
ওয়েইন

38

সম্পাদনা : বোবিন্সের সমাধানটি দেখুন যা ব্যবহার শুরু করার পরিবর্তে ধারণ করে , সম্পূর্ণ টোকেনের স্তরে তুলনা সম্পন্ন করার বিষয়টি নিশ্চিত করার জন্য একটি কৌশল (যাতে 'অ্যাটাগ' প্যাটার্নটি অন্য 'ট্যাগ' এর অংশ হিসাবে পাওয়া যায় না)।

"atag btag" ক্লাস অ্যাট্রিবিউটের জন্য একটি বিজোড় মান, তবে কখনই কম নয়, চেষ্টা করুন:

//*[starts-with(@class,"atag")]

আপনি যদি এটি ব্যবহার করতে পারেন আপনার এক্সপথ ইঞ্জিনটি প্রারম্ভকালীন কমান্ডটি সমর্থন করে, উদাহরণস্বরূপ জেভিএম 6 এটিকে সমর্থন করে না যতদূর মনে পড়ে
মোহাম্মদ ফারামাভি

10
@ এমজেভি: একাধিক মান নির্দিষ্ট করার জন্য সিএসএস শ্রেণির বৈশিষ্ট্যের জন্য এটি সাধারণ। সিএসএস এভাবেই করা হয়।
skaffman

7
@ এমজেভি আপনি গ্যারান্টি দিতে পারবেন না যে শ্রেণিটির বৈশিষ্ট্যের শুরুতে সেই নামটি উপস্থিত হবে।
অ্যালান ক্রুয়েগার

@ থুক্টুন @ স্কাফম্যান। ধন্যবাদ, দুর্দান্ত মন্তব্য। আমি সেই অনুযায়ী সমাধান বোবিন্সে 'পুনর্নির্দেশ' করেছি।
এমজেভি

<Div class = "btag atag"> যা উপরের সমতুল্য
আলেক্সি বিনোগ্রাদভ

30

একটি 2.0 এক্সপথ যা কাজ করে:

//*[tokenize(@class,'\s+')='atag']

অথবা একটি পরিবর্তনশীল সহ:

//*[tokenize(@class,'\s+')=$classname]

যদি @classএকাধিক উপাদান থাকে তবে কীভাবে এটি কাজ করতে পারে ? কারণ এটি শব্দের একটি তালিকা ফেরত দিতে চলেছে এবং এর সাথে একটি স্ট্রিংয়ের সাথে তুলনা করা ভুল কার্ডিনালিটির সাথে ব্যর্থ ।
অ্যালেক্সিস উইলকের

3
@ অ্যালেক্সিসওয়িল্ক - স্পেস থেকে ( w3.org/TR/xpath20/#id-general-comparisons ): সাধারণ তুলনা অস্তিত্বযুক্ত পরিমাণযুক্ত তুলনা যা কোনও দৈর্ঘ্যের অপারেন্ড সিকোয়েন্সগুলিতে প্রয়োগ করা যেতে পারে। আমি চেষ্টা করেছি এমন প্রতি 2.0 প্রসেসরে এটি কাজ করেছে।
ড্যানিয়েল হ্যালি

1
আরও খেয়াল করুন, এক্সপথ ৩.১ এ এটিকে সরল করা যেতে পারে//*[tokenize(@class)=$classname]
মাইকেল কে

1
এবং সম্পূর্ণতার জন্য, যদি আপনি স্কিমা-সচেতন এক্সপাথ প্রসেসরটি ব্যবহার করার মতো সৌভাগ্যবান হন এবং @ ক্লাসের যদি একটি তালিকা-মূল্যবান প্রকার থাকে তবে আপনি কেবল লিখতে পারেন//*[@class=$classname]
মাইকেল কে

21

সচেতন থাকুন যে আপনি যে শ্রেণীর নামটিতে আগ্রহী তা অন্য কোনও সম্ভাব্য শ্রেণীর নামের পরিবর্তে নয় এমন ধারণা ধরে নিতে পারলে বোবিন্সের উত্তর অত্যধিক জটিল হতে পারে । যদি এটি সত্য হয় তবে আপনি কেবল ফাংশনটির মাধ্যমে স্ট্রিং ম্যাচিং ব্যবহার করতে পারেন। নীচে এমন কোনও উপাদানটির সাথে মিলবে যার শ্রেণিতে 'আটাগ' সাবস্ট্রিং রয়েছে:

//*[contains(@class,'atag')]

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

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

এটি মিলবে atagএবং নাও মিলবে matag


এটিই আমি সমাধান খুঁজছিলাম। এটি ক্লাসে 'পরীক্ষা' পরিষ্কারভাবে খুঁজে পেয়েছে = 'হ্যালো টেস্ট ওয়ার্ল্ড' এবং 'হ্যালো টেস্ট-টেস্ট ওয়ার্ল্ড' এর সাথে মেলে না। যেহেতু আমি কেবল এক্সপথ ০.০ ব্যবহার করি এবং এর কোনও রেজিএক্স না থাকে এটি কেবলমাত্র সমাধান যা কাজ করে।
জান স্টানিকেক

7

ববিন্সের উত্তর যুক্ত করতে ... আপনি যে কোনও সরঞ্জাম / লাইব্রেরি Xpath 2.0 ব্যবহার করেন তবে আপনি এটি করতে পারেন:

//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]

গণনা () আপাতদৃষ্টিতে প্রয়োজনীয় কারণ ইনডেক্স-এর () প্রতিটি সূচির ক্রমটি স্ট্রিংয়ের সাথে মিল থাকে।


1
আমি মনে করি আপনি $classnameকোটগুলির মধ্যে পরিবর্তনশীল রাখবেন না ? কারণ এটি যেমন, এটি একটি স্ট্রিং।
অ্যালেক্সিস উইলকের

1
অবশেষে, getElementsByClassName এর একটি সঠিক (জাভাস্ক্রিপ্ট সুসংগত) বাস্তবায়ন ... '$classname'অবশ্যই স্ট্রিং আক্ষরিক থেকে আলাদা ।
জোয়েল মেলন

1
এটি মারাত্মকভাবে অতিরিক্ত জটিল। সঠিক এক্সপথ ২.০ উত্তরের জন্য @ ড্যানিয়েলহ্যালির প্রতিক্রিয়া দেখুন।
মাইকেল কে


0

আমি এখানে রানোরেক্স স্টুডিও 9.0.1 এর সমাধান অনুসন্ধান করতে এসেছি। এখনও সেখানে কোনও () নেই। পরিবর্তে আমরা রেগেক্স যেমন ব্যবহার করতে পারি:

div[@class~'atag']

-1

যে লিঙ্কগুলিতে সাধারণ ইউআরএল রয়েছে তাদের জন্য একটি ভেরিয়েবলে কনসোল করতে হবে। তারপরে এটি ক্রমানুসারে চেষ্টা করুন।

webelements allLinks=driver.findelements(By.xpath("//a[contains(@href,'http://122.11.38.214/dl/appdl/application/apk')]"));
int linkCount=allLinks.length();
for(int i=0; <linkCount;i++)
{
    driver.findelement(allLinks[i]).click();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.