Saya sedang menulis testcase Selenium. Dan inilah ekspresi xpath yang saya gunakan untuk mencocokkan semua tombol 'Ubah' dalam tabel data.
//img[@title='Modify']
Pertanyaan saya adalah, bagaimana saya bisa mengunjungi kumpulan node yang cocok dengan indeks? Saya sudah mencoba dengan
//img[@title='Modify'][i]
dan
//img[@title='Modify' and position() = i]
Tapi tidak ada yang berhasil .. Saya juga mencoba dengan pemeriksa XPath (Satu ekstensi firefox). Ada total 13 kecocokan yang ditemukan, maka saya sama sekali tidak tahu bagaimana saya akan memilih salah satunya .. Atau apakah XPath mendukung pemilihan node tertentu yang tidak berada di bawah node induk yang sama?
Tidak ada
i
di XPath.Entah Anda menggunakan angka literal:
//img[@title='Modify'][1]
Atau Anda membangun string ekspresi secara dinamis:
'//img[@title='Modify']['+i+']'
(namun perlu diingat bahwa ekspresi XPath dinamis tidak berfungsi dari dalam XSLT).Iya:
(//img[@title='Modify'])[13]
Ini
//img[@title='Modify'][i]
berarti "apa saja<img>
dengan judul 'Ubah' dan elemen anak bernama<i>
."sumber
td
anak keenam dari atr
dan tidak memiliki konten kosong://tr/td[6][string-length(text()) > 0]
Tidak ada
i
di xpath tidak sepenuhnya benar. Anda masih dapat menggunakancount()
untuk menemukan indeks.Simak halaman berikut ini
<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>
Halaman ini memiliki 2 tabel dan memiliki 6 kolom masing-masing dengan nama kolom unik dan 6 baris dengan data variabel. Baris terakhir memiliki
Modify
tombol di kedua tabel.Dengan asumsi bahwa pengguna harus memilih
Modify
tombol ke-4 dari tabel pertama berdasarkan judulnyaGunakan xpath
//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
The
count()
Operator berguna dalam situasi seperti ini.Logika:
Modify
menggunakan tombol//th[.='Heading 4']
count(//tr/th[.='Heading 4']/preceding-sibling::th)+1
Dapatkan baris untuk tajuk yang sesuai menggunakan
//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]
Dapatkan
Modify
tombol dari daftar node yang diekstrak menggunakan//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
sumber
td[count(../preceding-sibling::tr/th[.='Heading 4'])]/following-sibling::td
hal itu tidak jatuh ketd[1]
setiap kali saya tidak memiliki beberapa judul :)adalah kependekan dari
karenanya mengembalikan simpul ke-i di bawah simpul induk yang sama.
Kamu ingin
sumber
/descendant::img[@title='Modify'][$index]
akan bekerja dengan baik. Perhatikan juga bahwa[i]
tes predikat untuk keberadaani
elemen anak.(// * [@ attribute = 'value']) [index] untuk menemukan target elemen sementara Anda menemukan beberapa kecocokan di dalamnya
sumber
Berikut adalah solusi untuk variabel indeks
Misalkan, Anda telah menemukan 5 elemen dengan pelacak yang sama dan Anda ingin melakukan tindakan pada setiap elemen dengan memberikan nomor indeks (di sini, variabel digunakan untuk indeks sebagai "i")
for(int i=1; i<=5; i++) { string xPathWithVariable = "(//div[@class='className'])" + "[" + i + "]"; driver.FindElement(By.XPath(xPathWithVariable)).Click(); }
Dibutuhkan XPath:
sumber