Rintangan terbesar dalam menguji ExtJS dengan Selenium adalah bahwa ExtJS tidak merender elemen HTML standar dan Selenium IDE akan secara naif (dan berhak) menghasilkan perintah yang ditargetkan pada elemen yang hanya bertindak sebagai dekorasi - elemen berlebihan yang membantu ExtJS dengan seluruh desktop- Lihat dan rasakan. Berikut adalah beberapa tip dan trik yang saya kumpulkan saat menulis tes Selenium otomatis terhadap aplikasi ExtJS.
Tip Umum
Menemukan Elemen
Saat membuat kasus uji Selenium dengan merekam tindakan pengguna dengan Selenium IDE di Firefox, Selenium akan mendasarkan tindakan yang direkam pada id elemen HTML. Namun, untuk sebagian besar elemen yang dapat diklik, ExtJS menggunakan id yang dihasilkan seperti "ext-gen-345" yang kemungkinan besar akan berubah pada kunjungan berikutnya ke halaman yang sama, meskipun tidak ada perubahan kode yang dilakukan. Setelah merekam tindakan pengguna untuk sebuah pengujian, perlu ada upaya manual untuk melakukan semua tindakan yang bergantung pada id yang dihasilkan dan menggantinya. Ada dua jenis penggantian yang bisa dilakukan:
Mengganti Id Locator dengan CSS atau XPath Locator
Pencari CSS dimulai dengan "css =" dan pelacak XPath dimulai dengan "//" (awalan "xpath =" adalah opsional). Pelacak CSS tidak terlalu bertele-tele dan lebih mudah dibaca dan lebih disukai daripada pencari XPath. Namun, mungkin ada kasus di mana pelacak XPath perlu digunakan karena pelacak CSS tidak dapat memotongnya.
Menjalankan JavaScript
Beberapa elemen memerlukan lebih dari sekadar interaksi mouse / keyboard karena rendering kompleks yang dilakukan oleh ExtJS. Misalnya, Ext.form.CombBox sebenarnya bukan <select>
elemen tetapi input teks dengan daftar drop-down terpisah yang ada di suatu tempat di bagian bawah pohon dokumen. Untuk mensimulasikan pilihan ComboBox dengan benar, pertama-tama mungkin untuk mensimulasikan klik pada panah drop-down dan kemudian mengklik daftar yang muncul. Namun, menemukan elemen ini melalui pelacak CSS atau XPath bisa jadi merepotkan. Alternatifnya adalah dengan mencari komponen ComoBox itu sendiri dan memanggil metode di atasnya untuk mensimulasikan pemilihan:
var combo = Ext.getCmp('genderComboBox'); // returns the ComboBox components
combo.setValue('female'); // set the value
combo.fireEvent('select'); // because setValue() doesn't trigger the event
Di Selenium, runScript
perintah dapat digunakan untuk melakukan operasi di atas dalam bentuk yang lebih ringkas:
with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
Mengatasi AJAX dan Slow Rendering
Selenium memiliki rasa "* AndWait" untuk semua perintah untuk menunggu pemuatan halaman saat tindakan pengguna menghasilkan transisi halaman atau memuat ulang. Namun, karena pengambilan AJAX tidak melibatkan pemuatan halaman yang sebenarnya, perintah ini tidak dapat digunakan untuk sinkronisasi. Solusinya adalah dengan memanfaatkan petunjuk visual seperti ada / tidak adanya indikator kemajuan AJAX atau munculnya baris dalam kisi, komponen tambahan, tautan, dll. Misalnya:
Command: waitForElementNotPresent
Target: css=div:contains('Loading...')
Terkadang sebuah elemen hanya akan muncul setelah jangka waktu tertentu, bergantung pada seberapa cepat ExtJS merender komponen setelah tindakan pengguna menghasilkan perubahan tampilan. Alih-alih menggunakan penundaan arbiter dengan pause
perintah, metode yang ideal adalah menunggu sampai elemen yang menarik datang dalam genggaman kita. Misalnya, untuk mengklik suatu item setelah menunggu item itu muncul:
Command: waitForElementPresent
Target: css=span:contains('Do the funky thing')
Command: click
Target: css=span:contains('Do the funky thing')
Mengandalkan jeda sewenang-wenang bukanlah ide yang baik karena perbedaan waktu yang dihasilkan dari menjalankan pengujian di browser yang berbeda atau pada mesin yang berbeda akan membuat kasus pengujian tidak stabil.
Item yang tidak dapat diklik
Beberapa elemen tidak dapat dipicu oleh click
perintah. Itu karena event listener sebenarnya ada di container, mengamati kejadian mouse pada elemen anaknya, yang akhirnya mengarah ke induknya. Kontrol tab adalah salah satu contohnya. Untuk mengklik tab, Anda harus mensimulasikan mouseDown
acara di label tab:
Command: mouseDownAt
Target: css=.x-tab-strip-text:contains('Options')
Value: 0,0
Validasi Bidang
Bidang formulir (komponen Ext.form. *) Yang memiliki ekspresi reguler atau vtypes terkait untuk validasi akan memicu validasi dengan penundaan tertentu (lihat validationDelay
properti yang disetel ke 250 md secara default), setelah pengguna memasukkan teks atau segera ketika bidang kehilangan fokus - atau kabur (lihat validateOnDelay
properti). Untuk memicu validasi kolom setelah mengeluarkan perintah jenis Selenium untuk memasukkan beberapa teks di dalam kolom, Anda harus melakukan salah satu hal berikut:
Memicu Validasi Tertunda
ExtJS mengaktifkan timer tunda validasi saat bidang menerima peristiwa keyup. Untuk memicu pengatur waktu ini, cukup keluarkan acara dummy keyup (tidak masalah kunci mana yang Anda gunakan karena ExtJS mengabaikannya), diikuti dengan jeda singkat yang lebih lama dari validationDelay:
Command: keyUp
Target: someTextArea
Value: x
Command: pause
Target: 500
Memicu Validasi Segera
Anda dapat memasukkan peristiwa buram ke dalam bidang untuk memicu validasi langsung:
Command: runScript
Target: someComponent.nameTextField.fireEvent("blur")
Memeriksa Hasil Validasi
Setelah validasi, Anda dapat memeriksa ada atau tidaknya bidang kesalahan:
Command: verifyElementNotPresent
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]
Command: verifyElementPresent
Target: //*[@id="nameTextField"]/../*[@class="x-form-invalid-msg" and not(contains(@style, "display: none"))]
Perhatikan bahwa pemeriksaan "display: none" diperlukan karena setelah bidang kesalahan ditampilkan dan kemudian harus disembunyikan, ExtJS hanya akan menyembunyikan bidang kesalahan alih-alih menghapusnya sepenuhnya dari pohon DOM.
Kiat khusus elemen
Mengklik sebuah Ext.form.Button
Pilihan 1
Perintah: klik Target: css = tombol: berisi ('Simpan')
Memilih tombol dengan keterangannya
pilihan 2
Perintah: klik Target: css = # tombol simpan-opsi
Memilih tombol berdasarkan id-nya
Memilih Nilai dari Ext.form.ComboBox
Command: runScript
Target: with (Ext.getCmp('genderComboBox')) { setValue('female'); fireEvent('select'); }
Pertama-tama setel nilainya dan kemudian secara eksplisit mengaktifkan peristiwa pemilihan jika ada pengamat.