Selenium ile dizine göre Xpath düğüm kümeleri içinde belirtilen düğüm nasıl seçilir?


92

Bir Selenium test çantası yazıyorum. Ve işte bir veri tablosundaki tüm 'Değiştir' butonlarını eşleştirmek için kullandığım xpath ifadesi.

//img[@title='Modify']

Sorum şu, eşleşen düğüm kümelerini dizine göre nasıl ziyaret edebilirim? İle denedim

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

ve

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

Ama ikisi de işe yaramıyor .. XPath denetleyicisi ile de denedim (One firefox uzantısı). Toplam 13 eşleşme bulundu, o zaman bunlardan birini nasıl seçeceğim hakkında hiçbir fikrim yok .. Veya XPath aynı ana düğüm altında olmayan belirli düğüm seçimini destekliyor mu?

Yanıtlar:


194

Bu bir SSS :

//someName[3]

şu anlama gelir : someNamebelgedeki someNameebeveynlerinin üçüncü çocuğu olan tüm öğeler - bu tür birçok öğe olabilir.

İstediğiniz tam olarak 3. someNameunsur :

(//someName)[3]

Açıklama : []daha yüksek önceliğe (önceliğe) sahiptir //. //someNameSeçili düğüm listesinin Nth düğümünü belirtmeniz gerektiğinde her zaman türden ifadeleri köşeli parantez içine koymayı unutmayın .


1
Çok teşekkürler! Özür dilerim, öncelikli şeyleri tamamen unuttum .. Sadece denedim ve işe yarıyor!
Kymair Wu

1
@ Kymair-Wu: Bu cevabın sizin için yararlı olduğuna sevindim. SO'da minnettarlığınızı ifade etmenin yolu bir cevabı kabul etmektir (ipucu: cevabın yanındaki onay işaretine tıklayın). :)
Dimitre Novatchev

@DimitreNovatchev aynı soru için defalarca puan alıyorsunuz: p, SSS için teşekkürler.
Eytoss

2
@Eytoss, hoş geldiniz. Ve evet, en fazla + 1'leri nispeten basit cevaplar için alıyorum - en büyük başarılarım olduğuna inandığım cevaplar için değil - muhtemelen herkes
ilkini

2
@TEHEMPRAH, Aslında cevapta "ebeveyninin 3. 'someName' çocuğu" demediğimi gördüm. Bunu fark ettiğiniz için teşekkürler. Şimdi düzeltildi.
Dimitre Novatchev

14

Yok iXPath'de .

Ya değişmez sayılar kullanırsınız: //img[@title='Modify'][1]

Veya ifade dizesini dinamik olarak oluşturursunuz: '//img[@title='Modify']['+i+']'(ancak dinamik XPath ifadelerinin XSLT içinde çalışmadığını unutmayın ).

Veya XPath, aynı üst düğüm altında olmayan belirli düğüm seçimini destekliyor mu?

Evet: (//img[@title='Modify'])[13]


Bu //img[@title='Modify'][i], " <img>Değiştir" başlığına ve adlı bir alt öğeye sahip olan "anlamına gelir <i>.


Bazı nedenlerden dolayı dizini öznitelik ifadesinden önce eklemem gerekiyordu. Örneğin td, a'nın altıncı çocuğu olan trve boş içeriği olmayan ' leri bulmak için ://tr/td[6][string-length(text()) > 0]
Samir Aguiar

1
@kopranb Açıklama için bu cevaba bakın stackoverflow.com/a/1006439/18771
Tomalak

'// img [@ title =' Modify '] [' + i + ']' (+1)
DebanjanB

3

Orada yok ixpath tamamen doğru değil. Yine count()de dizini bulmak için kullanabilirsiniz .

Aşağıdaki sayfayı düşünün

<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>

Sayfada 2 tablo vardır ve her biri benzersiz sütun adlarına sahip 6 sütun ve değişken veriler içeren 6 satır vardır. Son satırdaModify iki tabloda düğmesi vardır.

Kullanıcının Modifybaşlığa göre ilk tablodan 4. düğmeyi seçmesi gerektiğini varsayarsak

Xpath'i kullanın //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button

count()Operatör Bu gibi durumlarda işe yarar.

Mantık:

  1. ModifyDüğmesini kullanarak düğmenin başlığını bulun//th[.='Heading 4']
  2. Kullanarak başlık sütununun dizinini bulun count(//tr/th[.='Heading 4']/preceding-sibling::th)+1

Not: Dizin başlar0

  1. Kullanarak ilgili başlık için satırları alın //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]

  2. Get Modifykullanılarak çıkarılan düğüm listesinden düğmeyi//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button


çok teşekkürler! ben bunu kullanıyorum ama geldi td[count(../preceding-sibling::tr/th[.='Heading 4'])]/following-sibling::tdiçine düşmemesi td[1]ben bazı başlığı :) yok her zaman
mani

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

İçin Kısa

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

dolayısıyla aynı ebeveyn düğüm altında i'inci düğümü döndürür.

İstediğiniz

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

1
Sadece /descendant::img[@title='Modify'][$index]iyi çalışacak. Ayrıca [i], ialt öğenin varlığına yönelik yüklem testine de dikkat edin .

1

(// * [@ attribute = 'value']) [index], içinde birden çok eşleşme bulurken öğenin hedefini bulmak için


1
Biraz daha açıklayabilir misin?
abhiarora

0

İşte indeks değişkeninin çözümü

Diyelim ki, aynı konumlandırıcıya sahip 5 öğe buldunuz ve her bir öğe üzerinde indeks numarası sağlayarak işlem yapmak istiyorsunuz (burada, değişken indeks için "i" olarak kullanılmaktadır)

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

XPath gerektirir:

(//div[@class='className'])[1]
(//div[@class='className'])[2]
(//div[@class='className'])[3]
(//div[@class='className'])[4]
(//div[@class='className'])[5]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.