Saya mengalami masalah dalam memilih node berdasarkan atribut ketika atribut mengandung lebih dari satu kata. Sebagai contoh:
<div class="atag btag" />
Ini adalah ekspresi xpath saya:
//*[@class='atag']
Ekspresi bekerja dengan
<div class="atag" />
tetapi tidak untuk contoh sebelumnya. Bagaimana saya bisa memilih <div>
?
div.atag
ataudiv.btag
. Super sederhana, bukan pencocokan string, dan WAY lebih cepat (dan lebih didukung di browser). XPath (terhadap HTML) harus diturunkan ke apa yang berguna untuk ... menemukan elemen dengan teks yang terkandung dan untuk navigasi DOM.Jawaban:
Berikut ini adalah contoh yang menemukan elemen div yang className-nya berisi
atag
:Berikut ini contoh yang menemukan elemen div yang className-nya berisi
atag
danbtag
:Namun, ia juga akan menemukan kecocokan sebagian
class="catag bobtag"
.Jika Anda tidak ingin kecocokan sebagian, lihat jawaban bobince di bawah ini.
sumber
<div class="Patagonia Halbtagsarbeit">
, yang berisi string target tetapi bukan div dengan kelas yang diberikan.Jawaban mjv adalah awal yang baik tetapi akan gagal jika atag bukan nama kelas pertama yang terdaftar.
Pendekatan yang biasa adalah yang agak sulit:
ini berfungsi selama kelas dipisahkan oleh spasi saja, dan bukan bentuk spasi putih lainnya. Ini hampir selalu demikian. Jika tidak, Anda harus membuatnya tetap lebih berat:
(Memilih dengan string yang dipisahkan oleh ruang seperti classname adalah kasus umum sehingga mengejutkan bahwa tidak ada fungsi XPath khusus untuk itu, seperti '[class ~ = "atag"]' CSS3.)
sumber
coba ini:
//*[contains(@class, 'atag')]
sumber
grabatagonabag
? (Petunjuk: masih akan cocok.)EDIT : lihat solusi bobince yang menggunakan berisi bukan mulai-dengan , bersama dengan trik untuk memastikan perbandingan dilakukan pada tingkat token lengkap (jangan sampai pola 'atag' ditemukan sebagai bagian dari 'tag' lain).
"atag btag" adalah nilai ganjil untuk atribut kelas, tetapi jangan pernah kurang, coba:
sumber
XPath 2.0 yang berfungsi:
atau dengan variabel:
sumber
@class
memiliki lebih dari satu elemen? Karena itu akan mengembalikan daftar kata dan membandingkannya dengan string gagal dengan kardinalitas yang salah .//*[tokenize(@class)=$classname]
//*[@class=$classname]
Ketahuilah bahwa jawaban bobince mungkin terlalu rumit jika Anda dapat menganggap bahwa nama kelas yang Anda minati bukanlah substring dari nama kelas lain yang mungkin . Jika ini benar, Anda bisa menggunakan pencocokan substring melalui fungsi berisi. Berikut ini akan cocok dengan elemen apa pun yang kelasnya mengandung substring 'atag':
Jika asumsi di atas tidak berlaku, kecocokan substring akan cocok dengan elemen yang tidak Anda inginkan. Dalam hal ini, Anda harus menemukan batas kata. Dengan menggunakan pembatas ruang untuk menemukan batas nama kelas, jawaban kedua bobince menemukan kecocokan tepat:
Ini akan cocok
atag
dan tidakmatag
.sumber
Untuk menambahkan jawaban bobince ... Jika alat / pustaka apa pun yang Anda gunakan menggunakan Xpath 2.0, Anda juga dapat melakukan ini:
count () tampaknya diperlukan karena indeks-of () mengembalikan urutan setiap indeks yang cocok di dalam string.
sumber
$classname
variabel di antara tanda kutip? Karena sebagaimana adanya, itu adalah sebuah string.'$classname'
tentunya.Anda dapat mencoba yang berikut ini
By.CssSelector("div.atag.btag")
sumber
Saya datang ke sini mencari solusi untuk Ranorex Studio 9.0.1. Belum ada mengandung () di sana. Sebaliknya kita bisa menggunakan regex seperti:
sumber
Untuk tautan yang berisi url umum harus konsol dalam variabel. Kemudian cobalah secara berurutan.
sumber