सेलेनियम के साथ सूचकांक द्वारा Xpath नोड सेट के भीतर निर्दिष्ट नोड का चयन कैसे करें?


91

मैं एक सेलेनियम टेस्टकेस लिख रहा हूं। और यहाँ xpath अभिव्यक्ति का उपयोग मैं डेटा तालिका के सभी 'संशोधित' बटन से मेल खाता हूं।

//img[@title='Modify']

मेरा सवाल है, मैं सूचकांक द्वारा मिलान किए गए नोड सेट पर कैसे जा सकता हूं? मैंने कोशिश की है

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

तथा

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

लेकिन न तो काम करता है .. मैंने XPath चेकर (एक फ़ायरफ़ॉक्स एक्सटेंशन) के साथ भी कोशिश की। आप पूरी तरह से 13 मैच पाए गए हैं, तो मुझे पूरी तरह से पता नहीं है कि मैं कैसे उनमें से एक का चयन करने जा रहा हूं .. या XPath नोड्स के निर्दिष्ट चयन का समर्थन करता है जो समान मूल नोड के तहत नहीं हैं?

जवाबों:


190

यह एक FAQ है :

//someName[3]

का अर्थ है : someNameदस्तावेज़ में सभी तत्व, someNameउनके माता-पिता की तीसरी संतान हैं - ऐसे कई तत्व हो सकते हैं।

आप जो चाहते हैं वह वास्तव में तीसरा someNameतत्व है :

(//someName)[3]

स्पष्टीकरण : की []तुलना में उच्च वरीयता (प्राथमिकता) है ////someNameजब आप अपने चयनित नोड-सूची के Nth नोड को निर्दिष्ट करने की आवश्यकता हो, तो हमेशा ब्रैकेट्स के प्रकार के भाव रखना याद रखें ।


1
बहुत बहुत धन्यवाद! क्षमा करें, मैं पूर्ववर्ती चीजों को पूरी तरह से भूल गया .. मैंने बस कोशिश की और यह काम करता है!
काइमर वू

1
@ Kymair-Wu: मुझे खुशी है कि यह उत्तर आपके लिए उपयोगी था। यहाँ SO पर आभार व्यक्त करने का तरीका एक उत्तर स्वीकार करने से है (संकेत: उत्तर के आगे चेक-मार्क पर क्लिक करें)। :)
डिमिट्रे नोवाचेव

@DimitreNovatchev आपको एक ही सवाल के लिए अंक मिल रहे हैं: p, FAQ के लिए धन्यवाद।
ईटॉस

2
@Eytoss, आपका स्वागत है। और हां, मुझे अपेक्षाकृत सरल उत्तरों के लिए सबसे अधिक + 1s मिल रहा है - उन उत्तरों के लिए नहीं जो मुझे विश्वास है कि मेरी सबसे बड़ी उपलब्धियां हैं - शायद इसलिए कि हर कोई पूर्व को समझता है और लगभग कोई भी बाद वाले को नहीं समझता है :)
दिमित्रे नोवात्चेव

2
@TEHEMPRAH, वास्तव में मैंने देखा कि उत्तर में मैंने "3 EM कुछ 'अपने माता-पिता का बच्चा नहीं कहा था।" यह ध्यान देने के लिए धन्यवाद। अब ठीक हो गया।
दिमित्रे नोवत्चेव

14

iएक्सपीथ में कोई नहीं है।

या तो आप शाब्दिक संख्याओं का उपयोग करते हैं: //img[@title='Modify'][1]

या आप अभिव्यक्ति स्ट्रिंग को गतिशील रूप से बनाते हैं: '//img[@title='Modify']['+i+']'(लेकिन ध्यान रखें कि डायनेमिक XPath एक्सप्रेशन XSLT के भीतर से काम नहीं करता है )।

या XPath नोड्स के निर्दिष्ट चयन का समर्थन करता है जो एक ही मूल नोड के अंतर्गत नहीं हैं?

हाँ: (//img[@title='Modify'])[13]


इसका //img[@title='Modify'][i]मतलब है "कोई भी <img>'संशोधित करें' शीर्षक और एक बाल तत्व नाम के साथ <i>।"


किसी कारण से मुझे विशेषता अभिव्यक्ति से पहले सूचकांक को शामिल करने की आवश्यकता थी। उदाहरण के लिए, खोजने के लिए tdकि छठे बच्चे थे trऔर खाली सामग्री नहीं है://tr/td[6][string-length(text()) > 0]
समीर अगुइर

1
@kopranb एक स्पष्टीकरण के लिए, इस उत्तर को देखें stackoverflow.com/a/1006439/18771
तोमलक

'// img [@ title =' संशोधित '] [' + + + ']' (+1) के बारे में समझाने के लिए धन्यवाद
देबंजन बी

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

के लिए छोटा है

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

इसलिए मैं समान मूल नोड के तहत i'th नोड लौटा रहा हूं।

तुम्हें चाहिए

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

1
बस /descendant::img[@title='Modify'][$index]ठीक काम करेगा। यह भी ध्यान दें कि बाल तत्व के [i]अस्तित्व के लिए परीक्षण की भविष्यवाणी करें i

2

वहाँ नहीं iहै xpath में पूरी तरह से सच नहीं है। आप अभी भी 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 वें बटन का चयन करना है

Xpath का उपयोग करें //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


1

(// * [@ विशेषता = 'मूल्य']] [सूचकांक] तत्व का लक्ष्य खोजने के लिए जबकि इसमें आपके कई मैच मिल रहे हैं


1
क्या आप थोड़ा और समझा सकते हैं?
अभियोरा

0

यहाँ सूचकांक चर के लिए समाधान है

मान लीजिए, आपको एक ही लोकेटर के साथ 5 तत्व मिले हैं और आप प्रत्येक तत्व पर सूचकांक संख्या प्रदान करके कार्रवाई करना चाहेंगे (यहाँ, चर का उपयोग सूचकांक के लिए "i" के रूप में किया जाता है)

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

यह XPath लेता है:

(//div[@class='className'])[1]
(//div[@class='className'])[2]
(//div[@class='className'])[3]
(//div[@class='className'])[4]
(//div[@class='className'])[5]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.