Saya mencoba menguji antarmuka javascript yang rumit dengan Selenium (menggunakan antarmuka Python, dan melintasi beberapa browser). Saya memiliki sejumlah tombol dalam bentuk:
<div>My Button</div>
Saya ingin dapat mencari tombol berdasarkan "Tombol Saya" (atau pencocokan parsial yang tidak case-sensitif seperti "tombol saya" atau "tombol")
Saya menemukan ini sangat sulit, sampai-sampai saya merasa kehilangan sesuatu yang jelas. Hal terbaik yang saya miliki sejauh ini adalah:
driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')
Ini peka huruf besar-kecil. Hal lain yang saya coba adalah mengulangi semua div di halaman, dan memeriksa properti element.text. Namun, setiap kali Anda mendapatkan situasi berupa:
<div class="outer"><div class="inner">My Button</div></div>
div.outer juga memiliki "My Button" sebagai teks. Untuk memperbaiki ITU, saya sudah mencoba melihat apakah div.outer adalah induk dari div.inner, tetapi tidak dapat menemukan cara melakukannya (element.get_element_by_xpath ('..') mengembalikan orangtua elemen, tetapi tes tidak sama dengan div.outer). Selain itu, melakukan iterasi melalui semua elemen pada halaman tampaknya sangat lambat, setidaknya menggunakan webdriver Chrome.
Ide ide?
Sunting: Pertanyaan ini sedikit kabur. Ditanyakan (dan dijawab) versi yang lebih spesifik di sini: Cara mendapatkan teks elemen di Selenium WebDriver (melalui api Python) tanpa menyertakan teks elemen anak?
sumber
Jawaban:
Coba yang berikut ini:
sumber
find_element(s)_by_link_text
danfind_element(s)_by_partial_link_text
metodeAnda dapat mencoba xpath seperti:
sumber
.format
tidak dikenali dalam gerhana saya. itu memberi dan kesalahan. ada ide, kenapa?Anda juga dapat menggunakannya dengan Pola Objek Halaman, misalnya:
Coba kode ini:
sumber
// * akan mencari tag HTML apa pun. Di mana jika beberapa teks umum untuk Button dan tag div dan jika // * adalah kategorinya, itu tidak akan berfungsi seperti yang diharapkan. Jika Anda perlu memilih spesifik maka Anda bisa mendapatkannya dengan mendeklarasikan tag Elemen HTML. Suka:
sumber
Menariknya, hampir semua jawaban berputar di sekitar fungsi xpath
contains()
, mengabaikan fakta bahwa ia peka terhadap huruf besar-kecil - berlawanan dengan yang diminta OP.Jika Anda memerlukan ketidakpekaan huruf, yang dapat dicapai di xpath 1.0 (versi dukungan browser kontemporer) , meskipun tidak cantik - dengan menggunakan
translate()
fungsi. Ini menggantikan karakter sumber ke bentuk yang diinginkan, dengan menggunakan tabel terjemahan.Membuat tabel dari semua karakter huruf besar akan secara efektif mengubah teks node ke bentuk yang lebih rendah () - memungkinkan pencocokan case-insensitive (berikut ini adalah hak prerogatifnya) :
Panggilan python lengkap:
Tentu saja pendekatan ini memiliki kelemahan - seperti yang diberikan, itu hanya akan berfungsi untuk teks latin; jika Anda ingin membahas karakter unicode - Anda harus menambahkannya ke tabel terjemahan. Saya sudah melakukannya dalam sampel di atas - karakter terakhir adalah simbol Cyrillic
"Й"
.Dan jika kita hidup di dunia di mana browser mendukung xpath 2.0 dan lebih tinggi (🤞, tetapi tidak terjadi dalam waktu dekat ☹️) , kita dapat menggunakan fungsi
lower-case()
(namun, tidak sepenuhnya sadar-lokal), danmatches
(untuk pencarian regex, dengan case -insensitive ('i'
) flag).sumber
Dalam HTML yang Anda berikan:
Teksnya
My Button
adalahinnerHTML
dan tidak memiliki spasi putih di sekitarnya sehingga Anda dapat dengan mudah menggunakantext()
sebagai berikut:Teks dengan spasi di depan / belakang
Masukkan teks yang relevan yang mengandung spasi putih di awal:
atau pada akhirnya:
atau di kedua ujungnya:
Dalam kasus ini, Anda memiliki 2 opsi:
Anda bisa menggunakan
contains()
fungsi yang menentukan apakah string argumen pertama berisi string argumen kedua dan mengembalikan boolean benar atau salah sebagai berikut:Anda bisa menggunakan
normalize-space()
fungsi yang mengupas memimpin dan mengekor ruang putih dari string, mengganti urutan karakter spasi dengan satu spasi, dan mengembalikan string yang dihasilkan sebagai berikut:xpath untuk Teks variabel
Memetikan teks adalah variabel yang dapat Anda gunakan:
sumber
sumber
Masalah serupa: Temukan
<button>Advanced...</button>
Mungkin ini akan memberi Anda beberapa ide (harap transfer konsep dari Java ke Python):
sumber
Gunakan driver.find_elements_by_xpath dan cocok dengan fungsi pencocokan regex untuk pencarian elemen yang tidak sensitif dengan teksnya.
sumber
matches()
adalah fungsi xpath 2.0, dan sayangnya browser hanya memiliki dukungan untuk 1.0.Coba ini. Sangat mudah:
Ini benar-benar bekerja untuk saya di driver web selenium.
sumber