Saya mencari pemilih CSS untuk tabel berikut:
Peter | male | 34
Susanne | female | 12
Apakah ada pemilih yang cocok dengan semua TD yang mengandung "laki-laki"?
css
css-selectors
Jimimon
sumber
sumber
$x
menjawab pertanyaan itu. untuk pertanyaan awal,$x("//td[text()='male']")
lakukan triknyaJawaban:
Jika saya membaca spesifikasi dengan benar, tidak.
Anda bisa mencocokkan pada suatu elemen, nama atribut dalam elemen, dan nilai atribut bernama dalam suatu elemen. Saya tidak melihat apa pun untuk mencocokkan konten dalam suatu elemen.
sumber
:empty
.Menggunakan jQuery:
sumber
Sepertinya mereka memikirkannya untuk spesifikasi CSS3 tetapi tidak berhasil .
:contains()
Pemilih CSS3 http://www.w3.org/TR/css3-selectors/#content-selectorssumber
Looks like they were thinking about it for the CSS3 spec but it didn't make the cut.
Dan untuk alasan yang baik, itu akan melanggar seluruh premis memisahkan gaya, konten, struktur, dan perilaku.Anda harus menambahkan atribut data ke baris yang disebut
data-gender
denganmale
ataufemale
nilai dan menggunakan pemilih atribut:HTML:
CSS:
sumber
male
ataufemale
? Fakta bahwaclass
diisi dengan kelas-kelas lain, urutannya tidak dijamin, mungkin ada collisi dengan nama-nama kelas lain dll membuatclass
tempat yang lebih buruk untuk hal-hal semacam ini.data-*
Atribut khusus mengisolasi data Anda dari semua hal itu dan membuatnya lebih mudah untuk melakukan pencocokan parsial dll di atasnya menggunakan pemilih atribut.Sebenarnya ada dasar yang sangat konseptual mengapa ini belum dilaksanakan. Ini pada dasarnya adalah kombinasi dari 3 aspek:
Ketiga ini secara bersamaan berarti bahwa pada saat Anda memiliki konten teks, Anda tidak dapat naik kembali ke elemen yang mengandung, dan Anda tidak dapat menata teks saat ini. Ini mungkin signifikan karena turun hanya memungkinkan untuk pelacakan konteks tunggal dan penguraian gaya SAX. Ascending atau penyeleksi lain yang melibatkan sumbu lain memperkenalkan perlunya solusi traversal yang lebih kompleks atau serupa yang akan sangat mempersulit penerapan CSS ke DOM.
sumber
text()
fungsi XPath .:contains(<sub-selector>)
untuk memilih elemen yang mengandung elemen spesifik lainnya. Sepertidiv:contains(div[id~="bannerAd"])
untuk menyingkirkan iklan dan kontainer itu.Anda bisa mengatur konten sebagai atribut data dan kemudian menggunakan pemilih atribut , seperti yang ditunjukkan di sini:
Anda juga dapat menggunakan jQuery untuk dengan mudah mengatur atribut data-konten:
sumber
.text()
dan.textContent
sangat berat, cobalah untuk menghindarinya dalam daftar panjang atau teks besar bila memungkinkan..html()
dan.innerHTML
cepat.$("td:contains(male)")
contenteditable='true'
- kasus saya), itu tidak cukup untuk mengatur nilaidata-content
atribut sebelum halaman diberikan. Itu harus diperbarui terus menerus. Di sini yang saya gunakan:<td onkeypress="event.target.setAttribute('data-content', event.target.textContent);">
Karena CSS tidak memiliki fitur ini, Anda harus menggunakan JavaScript untuk menata sel berdasarkan konten. Misalnya dengan XPath
contains
:Kemudian gunakan hasilnya seperti ini:
https://jsfiddle.net/gaby_de_wilde/o7bka7Ls/9/
sumber
Saya khawatir ini tidak mungkin, karena kontennya bukan atribut dan tidak dapat diakses melalui kelas semu. Daftar lengkap pemilih CSS3 dapat ditemukan dalam spesifikasi CSS3 .
sumber
Bagi mereka yang ingin melakukan pemilihan teks Selenium CSS, skrip ini mungkin bermanfaat.
Caranya adalah dengan memilih induk dari elemen yang Anda cari, dan kemudian mencari anak yang memiliki teks:
Ini akan mengembalikan elemen pertama jika ada lebih dari satu karena selalu satu elemen, dalam kasus saya.
sumber
TD:contains('male')
jika Anda menggunakan Selenium: saya hanya menggunakannya jika Anda tidak dapat memperbarui sumber untuk menambahkan kelas. misalnya jika Anda menguji kode warisan atau perusahaan Anda tidak akan membiarkan Anda berbicara dengan devs (eurgh!) karena tes Anda akan rapuh dan akan pecah jika seseorang mengubah teks nantimasculine
atau mengubah bahasa. Dokumen SauceLabs menunjukkan penggunaan dicontains
sini ( saucelabs.com/resources/articles/selenium-tips-css-selectors ) + cc @matas vaitkevicius apakah saya melewatkan sesuatu?Saya setuju bahwa atribut data (jawaban voyager) adalah bagaimana penanganannya, TETAPI, aturan CSS seperti:
seringkali dapat menjadi lebih mudah untuk diatur, terutama dengan lib sisi klien seperti angular yang dapat sesederhana:
Pastikan bahwa kontennya hanya satu kata! Atau Anda bahkan dapat memetakan ke berbagai nama kelas CSS dengan:
Untuk kelengkapan, inilah pendekatan atribut data:
sumber
Jawaban @ voyager tentang penggunaan
data-*
atribut (mis.data-gender="female|male"
adalah pendekatan yang paling efektif dan standar pada 2017:Hampir semua tujuan dapat dicapai karena ada beberapa penyeleksi terbatas meskipun berorientasi pada teks. Huruf :: pertama adalah elemen pseudo yang dapat menerapkan gaya terbatas pada huruf pertama elemen. Ada juga elemen :: pseudo-baris pertama selain jelas memilih baris pertama dari suatu elemen (seperti paragraf) juga menyiratkan bahwa jelas bahwa CSS dapat digunakan untuk memperluas kemampuan yang ada ini untuk merancang aspek-aspek spesifik dari textNode. .
Sampai advokasi tersebut berhasil dan diimplementasikan, hal terbaik berikutnya yang dapat saya sarankan ketika dapat diterapkan adalah untuk
explode
/split
kata-kata menggunakan pembatas ruang, output setiap kata individu di dalam suatuspan
elemen dan kemudian jika tujuan kata / styling dapat diprediksi digunakan dalam kombinasi dengan : n penyeleksi :Lain jika tidak dapat diprediksi , lagi, jawabannya penggunaan voyager tentang menggunakan
data-*
atribut. Contoh menggunakan PHP:sumber
Jika Anda menggunakan Chimp / Webdriver.io , mereka mendukung lebih banyak penyeleksi CSS daripada spesifikasi CSS.
Ini, misalnya, akan mengklik jangkar pertama yang berisi kata "Bad bear":
sumber
Sebagian besar jawaban di sini mencoba menawarkan alternatif cara menulis kode HTML untuk memasukkan lebih banyak data karena setidaknya hingga CSS3 Anda tidak dapat memilih elemen dengan teks dalam sebagian. Tapi itu bisa dilakukan, Anda hanya perlu menambahkan sedikit vanilla JavaScript, perhatikan karena perempuan juga mengandung laki-laki itu akan dipilih:
sumber
Saya menemukan opsi atribut untuk menjadi taruhan terbaik Anda jika Anda tidak ingin menggunakan javascript atau jquery.
Misalnya untuk menata semua sel tabel dengan kata siap, Dalam HTML lakukan ini:
Kemudian di css:
sumber
Anda juga bisa menggunakan
content
denganattr()
dan menata sel tabel yang ::not
:empty
A
ZeroWidthSpace
digunakan untuk mengubah warna dan dapat ditambahkan menggunakan JavaScript vanilla:Meskipun
<td>
tag akhir dapat dihilangkan dengan melakukan hal itu dapat menyebabkannya diperlakukan sebagai non-kosong.sumber
Jika Anda tidak membuat DOM sendiri (misalnya dalam skrip pengguna) Anda dapat melakukan hal berikut dengan JS murni:
Output konsol
sumber
Melakukan Widget Filter kecil seperti ini:
sumber
Sintaks pertanyaan ini terlihat seperti sintaks Robot Framework. Dalam hal ini, meskipun tidak ada pemilih css yang dapat Anda gunakan untuk berisi, ada kata kunci SeleniumLibrary yang dapat Anda gunakan sebagai gantinya. The Tunggu Sampai Element Berisi .
Contoh:
sumber