CATATAN: sebut saja 'klik' adalah klik pengguna akhir. 'js click' adalah klik melalui JS
Mengapa mengklik "via JavaScript" berfungsi ketika klik WebDriver biasa tidak?
Ada 2 kasus untuk ini terjadi:
I. Jika Anda menggunakan PhamtomJS
Maka ini adalah perilaku yang paling umum diketahui PhantomJS
. Beberapa elemen terkadang tidak dapat diklik, misalnya <div>
. Ini karena PhantomJS
ini asli dibuat untuk mensimulasikan mesin browser (seperti HTML + CSS awal -> komputasi CSS -> rendering). Tetapi itu tidak berarti berinteraksi dengan cara pengguna akhir (melihat, mengklik, menyeret). Karena PhamtomJS
itu hanya didukung sebagian dengan interaksi pengguna akhir.
MENGAPA JS KLIK BEKERJA? Adapun klik, mereka semua adalah klik berarti. Itu seperti pistol dengan 1 barel dan 2 pemicu . Satu dari viewport, satu dari JS. Karena PhamtomJS
hebat dalam mensimulasikan mesin peramban, klik JS seharusnya bekerja dengan sempurna.
II Penangan acara "klik" harus terikat dalam periode waktu yang buruk.
Sebagai contoh, kami mendapat <div>
-> Kami melakukan beberapa perhitungan
-> lalu kita ikat acara klik ke <div>
.
-> Plus dengan beberapa pengkodean sudut yang buruk (mis. Tidak menangani siklus scope dengan benar)
Kita mungkin berakhir dengan hasil yang sama. Klik tidak akan berfungsi, karena WebdriverJS mencoba mengklik pada elemen ketika tidak memiliki pengendali event klik.
MENGAPA JS KLIK BEKERJA? Js klik seperti menyuntikkan js langsung ke browser. Mungkin dengan 2 cara,
Fist melalui konsol devtools (ya, WebdriverJS berkomunikasi dengan konsol devtools).
Kedua adalah menyuntikkan <script>
tag langsung ke HTML.
Untuk setiap browser, perilakunya akan berbeda. Tetapi bagaimanapun juga, metode ini lebih menyulitkan daripada mengklik tombol. Klik menggunakan apa yang sudah ada (klik pengguna akhir), klik saja akan melalui backdoor.
Dan untuk klik js akan tampak sebagai tugas yang tidak sinkron. Hal ini terkait dengan topik yang agak rumit tentang ' tugas asinkron peramban dan penjadwalan tugas CPU ' (baca beberapa waktu lalu tidak dapat menemukan artikel lagi). Singkatnya, ini sebagian besar akan menghasilkan js klik akan perlu menunggu siklus penjadwalan tugas CPU dan akan berjalan sedikit lebih lambat setelah pengikatan acara klik.
(Anda bisa mengetahui kasus ini ketika Anda menemukan elemen kadang-kadang dapat diklik, kadang tidak.)
Kapan tepatnya ini terjadi dan apa kelemahan dari solusi ini (jika ada)?
=> Seperti disebutkan di atas, keduanya berarti untuk satu tujuan, tetapi tentang menggunakan pintu masuk mana:
- Klik: menggunakan apa yang disediakan oleh browser default.
- Klik JS: melalui backdoor.
=> Untuk kinerja, sulit untuk mengatakan karena itu bergantung pada browser. Tetapi umumnya:
- Klik: tidak berarti lebih cepat tetapi hanya menandatangani posisi yang lebih tinggi dalam daftar jadwal tugas eksekusi CPU.
- Klik JS: tidak berarti lebih lambat tetapi hanya masuk ke posisi terakhir dari daftar jadwal tugas CPU.
=> Kerugian:
- Klik: tampaknya tidak memiliki downside kecuali Anda menggunakan PhamtomJS.
- Klik JS: sangat buruk untuk kesehatan. Anda mungkin secara tidak sengaja mengklik sesuatu yang tidak ada pada tampilan. Saat Anda menggunakan ini, pastikan elemennya ada dan tersedia untuk dilihat dan diklik sebagai sudut pandang pengguna akhir.
PS jika Anda mencari solusi.
- Menggunakan PhantomJS? Saya akan menyarankan menggunakan Chrome tanpa kepala. Ya, Anda dapat menyiapkan Chrome tanpa kepala di Ubuntu. Hal berjalan seperti Chrome tetapi hanya tidak memiliki tampilan dan kurang buggy seperti PhantomJS.
- Tidak menggunakan PhamtomJS tetapi masih mengalami masalah? Saya akan menyarankan menggunakan ExpectedCondition of Protractor with
browser.wait()
( periksa ini untuk informasi lebih lanjut )
(Saya ingin membuatnya singkat, tetapi berakhir dengan buruk. Apa pun yang berhubungan dengan teori rumit untuk dijelaskan ...)