সেলেনিয়াম সহ সূচী দ্বারা এক্সপথ নোড সেটগুলির মধ্যে নির্দিষ্ট নোডটি কীভাবে নির্বাচন করবেন?


92

আমি সেলেনিয়াম টেস্টকেস লিখছি। এবং এখানে ডেটা টেবিলের মধ্যে থাকা সমস্ত 'মডিফাই' বোতামের সাথে মেলে আমি ব্যবহার করি এক্সপথ এক্সপ্রেশন।

//img[@title='Modify']

আমার প্রশ্ন হ'ল আমি কীভাবে সূচকের সাথে মিলে যাওয়া নোড সেটগুলি দেখতে পারি? আমি চেষ্টা করেছি

//img[@title='Modify'][i]

এবং

//img[@title='Modify' and position() = i]

তবে দুটোই কাজ করে না .. আমি এক্সপথ চেকার (ওয়ান ফায়ারফক্স এক্সটেনশন) দিয়েও চেষ্টা করেছি। পুরোপুরি ১৩ টি ম্যাচ পাওয়া গেছে, তারপরে আমার সম্পূর্ণ ধারণা নেই যে আমি কীভাবে সেগুলির মধ্যে একটি নির্বাচন করব .. বা এক্সপথ নোডগুলির নির্দিষ্ট নির্বাচনকে সমর্থন করে যা একই প্যারেন্ট নোডের আওতাভুক্ত নয়?

উত্তর:


194

এটি একটি FAQ :

//someName[3]

অর্থ : someNameদস্তাবেজের সমস্ত উপাদান, যা someNameতাদের পিতামাতার তৃতীয় সন্তান - এমন অনেক উপাদান থাকতে পারে।

আপনি যা চান তা হ'ল তৃতীয় someNameউপাদান :

(//someName)[3]

ব্যাখ্যা : এর []চেয়ে বেশি অগ্রাধিকার (অগ্রাধিকার) রয়েছে ////someNameযখন আপনি তাদের নির্বাচিত নোড-তালিকার Nth নোড নির্দিষ্ট করতে প্রয়োজন তখন বন্ধনীগুলিতে টাইপের অভিব্যক্তি রাখার জন্য সর্বদা মনে রাখবেন ।


4
অনেক ধন্যবাদ! দুঃখিত আমি অগ্রাধিকারের বিষয়গুলি পুরোপুরি ভুলে গেছি .. আমি চেষ্টা করেছি এবং এটি কার্যকর!
কিমায়র উ

4
@ কিমায়ার-উ: আমি আনন্দিত যে এই উত্তরটি আপনার পক্ষে কার্যকর ছিল। এখানে SO তে কৃতজ্ঞতা প্রকাশের উপায়টি হল একটি উত্তর গ্রহণ করা (ইঙ্গিত: উত্তরের পাশে থাকা চেক-মার্কে ক্লিক করুন)। :)
দিমিত্রে নোভাচাচেভ

@ দিমিত্রে নোভাচেভ আপনি একই প্রশ্নটির জন্য বারবার পয়েন্ট পেয়ে যাচ্ছেন: পি, এফএকিউর জন্য ধন্যবাদ।
আইটিস

4
@ আইটোস, আপনাকে স্বাগতম! এবং হ্যাঁ, আমি তুলনামূলকভাবে সহজ উত্তরের জন্য বেশিরভাগ +1 পাচ্ছি - আমার বিশ্বাস যে উত্তরগুলি আমার সবচেয়ে বড় অর্জন তা - সম্ভবত সবাই প্রাক্তনকে বোঝে এবং প্রায় কেউই পরবর্তীকথাটি বুঝতে পারে না কারণ :)
দিমিত্রে নোভাচেভ

4
@ হেম্পরপাহ, বাস্তবে আমি দেখেছি যে উত্তরে আমি "এর পিতামাতার তৃতীয় 'কোনও নাম' সন্তান" বলিনি। এটি লক্ষ্য করার জন্য ধন্যবাদ। এখনই সংশোধন করা হয়েছে।
দিমিত্রে নোভাচাভেভ

14

iএক্সপথে নেই is

হয় আপনি আক্ষরিক সংখ্যা ব্যবহার করুন: //img[@title='Modify'][1]

অথবা আপনি গতিশীলভাবে এক্সপ্রেশন স্ট্রিংটি তৈরি করেন: '//img[@title='Modify']['+i+']'(তবে মনে রাখবেন গতিশীল এক্সপাথ এক্সপ্রেশন এক্সএসএলটির মধ্যে থেকে কাজ করে না )।

অথবা এক্সপথ নোডগুলির নির্দিষ্ট নির্বাচনকে সমর্থন করে যা একই প্যারেন্ট নোডের অধীন নয়?

হ্যাঁ: (//img[@title='Modify'])[13]


এর //img[@title='Modify'][i]অর্থ " <img>'মোডিফাই' শিরোনাম এবং একটি শিশু উপাদান নামের সাথে থাকা <i>" "


কিছু কারণে গুণাবলী প্রকাশের আগে আমাকে সূচকটি অন্তর্ভুক্ত করা দরকার। উদাহরণস্বরূপ, এটি tdগুলি করে একটি ষষ্ঠ ছোট ছিলে trএবং খালি বিষয়বস্তু নেই://tr/td[6][string-length(text()) > 0]
সমীর Aguiar,

4
@kopranb একটি ব্যাখ্যা জন্য, এই উত্তর দেখার stackoverflow.com/a/1006439/18771
Tomalak

'// img [@ শিরোনাম =' সংশোধন করুন]] ['+ + + +'] '(+1)
দেবানজানবি

3

iএক্সপ্যাটে কোনও কিছুই সম্পূর্ণ সত্য নয়। আপনি এখনও count()সূচকটি সন্ধান করতে এটি ব্যবহার করতে পারেন ।

নিম্নলিখিত পৃষ্ঠাটি বিবেচনা করুন

<html>

	<head>
		<title>HTML Sample table</title>
	</head>

	<style>
	table, td, th {
		border: 1px solid black;
		font-size: 15px;
		font-family: Trebuchet MS, sans-serif;
	}
	table {
		border-collapse: collapse;
		width: 100%;
	}

	th, td {
		text-align: left;
		padding: 8px;
	}

	tr:nth-child(even){background-color: #f2f2f2}

	th {
		background-color: #4CAF50;
		color: white;
	}
	</style>

	<body>
	<table>
		<thead>
			<tr>
				<th>Heading 1</th>
				<th>Heading 2</th>
				<th>Heading 3</th>
				<th>Heading 4</th>
				<th>Heading 5</th>
				<th>Heading 6</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>Data row 1 col 1</td>
				<td>Data row 1 col 2</td>
				<td>Data row 1 col 3</td>
				<td>Data row 1 col 4</td>
				<td>Data row 1 col 5</td>
				<td>Data row 1 col 6</td>
			</tr>
			<tr>
				<td>Data row 2 col 1</td>
				<td>Data row 2 col 2</td>
				<td>Data row 2 col 3</td>
				<td>Data row 2 col 4</td>
				<td>Data row 2 col 5</td>
				<td>Data row 2 col 6</td>
			</tr>
			<tr>
				<td>Data row 3 col 1</td>
				<td>Data row 3 col 2</td>
				<td>Data row 3 col 3</td>
				<td>Data row 3 col 4</td>
				<td>Data row 3 col 5</td>
				<td>Data row 3 col 6</td>
			</tr>
			<tr>
				<td>Data row 4 col 1</td>
				<td>Data row 4 col 2</td>
				<td>Data row 4 col 3</td>
				<td>Data row 4 col 4</td>
				<td>Data row 4 col 5</td>
				<td>Data row 4 col 6</td>
			</tr>
			<tr>
				<td>Data row 5 col 1</td>
				<td>Data row 5 col 2</td>
				<td>Data row 5 col 3</td>
				<td>Data row 5 col 4</td>
				<td>Data row 5 col 5</td>
				<td>Data row 5 col 6</td>
			</tr>
			<tr>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
			</tr>
		</tbody>
	</table>

	</br>

	<table>
		<thead>
			<tr>
				<th>Heading 7</th>
				<th>Heading 8</th>
				<th>Heading 9</th>
				<th>Heading 10</th>
				<th>Heading 11</th>
				<th>Heading 12</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>Data row 1 col 1</td>
				<td>Data row 1 col 2</td>
				<td>Data row 1 col 3</td>
				<td>Data row 1 col 4</td>
				<td>Data row 1 col 5</td>
				<td>Data row 1 col 6</td>
			</tr>
			<tr>
				<td>Data row 2 col 1</td>
				<td>Data row 2 col 2</td>
				<td>Data row 2 col 3</td>
				<td>Data row 2 col 4</td>
				<td>Data row 2 col 5</td>
				<td>Data row 2 col 6</td>
			</tr>
			<tr>
				<td>Data row 3 col 1</td>
				<td>Data row 3 col 2</td>
				<td>Data row 3 col 3</td>
				<td>Data row 3 col 4</td>
				<td>Data row 3 col 5</td>
				<td>Data row 3 col 6</td>
			</tr>
			<tr>
				<td>Data row 4 col 1</td>
				<td>Data row 4 col 2</td>
				<td>Data row 4 col 3</td>
				<td>Data row 4 col 4</td>
				<td>Data row 4 col 5</td>
				<td>Data row 4 col 6</td>
			</tr>
			<tr>
				<td>Data row 5 col 1</td>
				<td>Data row 5 col 2</td>
				<td>Data row 5 col 3</td>
				<td>Data row 5 col 4</td>
				<td>Data row 5 col 5</td>
				<td>Data row 5 col 6</td>
			</tr>
			<tr>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
				<td><button>Modify</button></td>
			</tr>
		</tbody>
	</table>

	</body>
</html>

পৃষ্ঠায় 2 টি টেবিল রয়েছে এবং প্রতিটি অনন্য কলামের নাম সহ 6 টি কলাম এবং ভেরিয়েবল ডেটা সহ 6 টি সারি রয়েছে। শেষ সারিটিতে Modifyদুটি সারণীতে বোতাম রয়েছে।

ধরে নেওয়া যায় যে Modifyশিরোনামের উপর ভিত্তি করে ব্যবহারকারীর প্রথম টেবিল থেকে 4 র্থ বাটনটি নির্বাচন করতে হবে

এক্সপথ ব্যবহার করুন //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button

count()অপারেটর এই মত পরিস্থিতিতে উপকারে আসে।

যুক্তি:

  1. Modifyবোতামটি ব্যবহার করে শিরোনামটি সন্ধান করুন//th[.='Heading 4']
  2. ব্যবহার করে শিরোনাম কলামের সূচকটি সন্ধান করুন count(//tr/th[.='Heading 4']/preceding-sibling::th)+1

দ্রষ্টব্য: সূচকটি শুরু হয়0

  1. ব্যবহার করে সংশ্লিষ্ট শিরোনামের জন্য সারিগুলি পান //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]

  2. Modifyব্যবহার করে উত্তোলিত নোড তালিকা থেকে বোতামটি পান//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button


অনেক ধন্যবাদ! আমি এটি ব্যবহার করি, তবে আমি এসেছি td[count(../preceding-sibling::tr/th[.='Heading 4'])]/following-sibling::tdযে td[1]প্রতিবার আমার কোনও শিরোনাম নেই have :)
মনি

2
//img[@title='Modify'][i]

জন্য সংক্ষিপ্ত

/descendant-or-self::node()/img[@title='Modify'][i]

সুতরাং একই প্যারেন্ট নোডের নীচে আমি নোডটি ফিরিয়ে দিচ্ছি।

তুমি চাও

/descendant-or-self::img[@title='Modify'][i]

4
ঠিক /descendant::img[@title='Modify'][$index]কাজ করবে ঠিক আছে। শিশু উপাদানটির [i]অস্তিত্বের জন্য ভবিষ্যদ্বাণীপূর্ণ পরীক্ষাটিও নোট করুন i

1

(// * [@ অ্যাট্রিবিউট = 'মান']) [সূচি] এতে একাধিক ম্যাচ সন্ধান করার সময় উপাদানটির লক্ষ্য সন্ধান করতে


4
আপনি কি আরও একটু ব্যাখ্যা করতে পারেন?
অভিহোর

0

সূচক ভেরিয়েবলের সমাধান এখানে

ধরা যাক, আপনি একই লোকেটার সহ 5 টি উপাদান পেয়েছেন এবং আপনি প্রতিটি উপাদানকে সূচক সংখ্যা সরবরাহ করে ক্রিয়া করতে চান (এখানে, ভেরিয়েবল "i" হিসাবে সূচকের জন্য ব্যবহৃত হয়)

for(int i=1; i<=5; i++)
{
    string xPathWithVariable = "(//div[@class='className'])" + "[" + i + "]";
    driver.FindElement(By.XPath(xPathWithVariable)).Click();
}

এটি এক্সপথ লাগে:

(//div[@class='className'])[1]
(//div[@class='className'])[2]
(//div[@class='className'])[3]
(//div[@class='className'])[4]
(//div[@class='className'])[5]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.