- Ghost Driver adalah implementasi WebDriver yang dibangun ke dalam PhantomJS untuk pengujian browser headless
- Pengaturan memerlukan pengunduhan PhantomJS, penambahan language bindings, dan pengaturan kapabilitas executable
- Eksekusi headless berjalan lebih cepat daripada Firefox dan tidak memerlukan server tampilan eksternal
- Kapabilitas kustom memungkinkan penggantian user-agent, pengabaian SSL, dan penerusan argumen CLI
- Pelaporan masalah memerlukan kode pengujian yang dapat direproduksi untuk memastikan perbaikan bug yang cepat
Apa itu Ghost Driver? Konsep Inti
Ghost Driver berfungsi sebagai jembatan penting antara protokol WebDriver Selenium dan PhantomJS, sebuah browser WebKit headless. Saat Anda menulis skrip pengujian menggunakan bindings Selenium, komponen Remote WebDriver berkomunikasi melalui protokol REST HTTP/JSON berdasarkan spesifikasi WebDriver W3C. Ghost Driver menerima perintah ini di dalam proses PhantomJS dan menerjemahkannya menjadi aksi browser.
Sorotan Video:
- Penjelasan tentang identitas ganda Ghost Driver sebagai pustaka yang dibundel dan skrip mandiri
- Diagram urutan terperinci tentang apa yang terjadi selama instansiasi driver
- Gambaran arsitektur yang menunjukkan bagaimana Selenium berkomunikasi dengan PhantomJS
- Perbandingan antara PhantomJS dan solusi headless lainnya seperti HTMLUnit
Ghost Driver dan PhantomJS Driver sering tertukar. Ghost Driver adalah implementasi JavaScript yang berjalan di dalam PhantomJS. PhantomJS Driver merujuk pada kelas language binding (seperti PhantomJSDriver di Java) yang digunakan dalam skrip pengujian Anda.
Saat Anda menginisialisasi instance PhantomJSDriver baru dalam pengujian Anda, beberapa operasi kompleks dijalankan di balik layar. Layanan driver meluncurkan proses PhantomJS yang terpisah, yang kemudian memuat skrip Ghost Driver. Layanan ini melakukan polling pada endpoint /status hingga PhantomJS merespons dengan kode sukses. Setelah itu, ia membuat sesi baru dengan mengirimkan permintaan HTTP POST dengan kapabilitas yang Anda inginkan.
| Komponen | Peran | Lokasi |
|---|---|---|
| Selenium Bindings | Skrip pengujian sisi klien | Proyek pengujian Anda |
| Remote WebDriver | Menerjemahkan perintah menjadi permintaan HTTP | Pustaka Selenium |
| Ghost Driver | Mengimplementasikan protokol WebDriver | Di dalam PhantomJS |
| PhantomJS | Mesin eksekusi WebKit headless | Proses terpisah |
Pengaturan Ghost Driver: Konfigurasi Langkah demi Langkah
Menyiapkan Ghost Driver memerlukan konfigurasi pada executable PhantomJS dan language bindings Selenium Anda. Prosesnya sedikit berbeda tergantung pada bahasa pemrograman Anda, tetapi konsep intinya tetap identik di seluruh Java, Python, Ruby, dan .NET.
Unduh PhantomJS
Unduh build PhantomJS yang sesuai untuk sistem operasi Anda dari situs web resmi. Ekstrak paketnya dan catat jalur ke executable-nya. Membangun dari sumber memang dimungkinkan, tetapi membutuhkan waktu satu hingga lima jam tergantung pada perangkat keras, karena mengompilasi seluruh mesin WebKit.
Tambahkan Language Bindings
Tambahkan bindings Selenium WebDriver ke proyek Anda. Di Gradle, ini hanya memerlukan satu baris dependensi. Untuk Maven, gunakan inklusi gaya POM. Pengguna Python, Ruby, dan .NET dapat menginstal paket Selenium, yang secara native menyertakan kelas driver PhantomJS.
Set Kapabilitas Jalur Executable
Buat objek kapabilitas dan atur properti phantomjs.executable.path ke lokasi binary PhantomJS Anda. Skrip pengujian Anda memerlukan jalur eksplisit ini untuk menemukan dan meluncurkan proses browser headless.
Inisialisasi Driver dan Jalankan Pengujian
Teruskan objek kapabilitas ke konstruktor PhantomJSDriver. Dari titik ini dan seterusnya, driver akan berperilaku seperti implementasi WebDriver standar pada umumnya. Pengujian Selenium yang ada seharusnya berjalan tanpa modifikasi di sebagian besar skenario.
Gunakan konstanta static final yang disediakan di kelas PhantomJSDriverService untuk mengatur kunci kapabilitas. Nama konstanta ini panjang tetapi dapat mencegah kesalahan ketik dan membuat kode konfigurasi Anda mendokumentasikan dirinya sendiri (self-documenting).
| Bahasa | Metode Pengaturan | Tingkat Kesulitan |
|---|---|---|
| Python | pip install selenium | Mudah |
| Ruby | Instalasi Gem | Mudah |
| .NET | Paket NuGet | Mudah |
| Java (Gradle) | Satu baris dependensi | Menengah |
| Java (Maven) | Inklusi POM XML | Menengah |
Kapabilitas Lanjutan dan Kustomisasi
Ghost Driver mendukung beberapa kapabilitas lanjutan yang memungkinkan penguji menyempurnakan perilaku PhantomJS. Pengaturan kustom ini melewati batasan protokol WebDriver standar dengan meneruskan parameter spesifik PhantomJS secara langsung ke objek halaman yang dibuat selama eksekusi pengujian.
Penggantian User-Agent
- Lewati filter scraping
- Simulasikan perangkat iOS atau Android
- Diatur melalui
phantomjs.page.settings.userAgent - Berlaku untuk semua sesi
Mengabaikan Sertifikat SSL
- Lewati kesalahan validasi sertifikat
- Ideal untuk pengujian internal perusahaan
- Teruskan
--ignore-ssl-errors=truemelalui kapabilitas args CLI - Tersedia di versi 1.3+
Argumen CLI Kustom
- Teruskan flag command-line PhantomJS apa pun
- Gunakan array kapabilitas
phantomjs.cli.args - Mendukung semua parameter PhantomJS standar
- Konfigurasi fleksibel per sesi
Selain argumen CLI, Ghost Driver mengekspos semua pengaturan halaman PhantomJS standar melalui kapabilitas. Ini termasuk mengaktifkan JavaScript, mengaktifkan/menonaktifkan pemuatan gambar, dan izin akses jaringan. Lihat dokumentasi resmi PhantomJS untuk daftar lengkap pengaturan yang tersedia.
| Kunci Kapabilitas | Tujuan | Contoh Nilai |
|---|---|---|
phantomjs.executable.path | Jalur ke binary PhantomJS | /usr/local/bin/phantomjs |
phantomjs.page.settings.userAgent | Ganti string user-agent browser | Mozilla/5.0 (iPhone...) |
phantomjs.cli.args | Array argumen CLI | ["--ignore-ssl-errors=true"] |
phantomjs.ghostdriver.path | Jalur skrip Ghost Driver kustom | /path/to/ghostdriver.js |
Integrasi Selenium Grid
Ghost Driver mendukung pendaftaran dengan hub Selenium Grid, memungkinkan pengujian headless terdistribusi di beberapa mesin. Integrasi ini memungkinkan pipeline CI untuk meminta instance PhantomJS sesuai permintaan dari hub terpusat.
Untuk mendaftarkan PhantomJS dengan Selenium Grid, teruskan URL hub sebagai parameter command-line saat meluncurkan proses PhantomJS. Flag --webdriver-selenium-grid-hub memberi tahu PhantomJS tempat untuk mendaftarkan dirinya. Setelah terdaftar, hub akan merutekan permintaan pengujian yang masuk ke instance PhantomJS yang tersedia.
Pada versi saat ini, Ghost Driver mendukung pendaftaran dengan Selenium Grid tetapi tidak menerapkan protokol pembatalan pendaftaran eksplisit. Jika proses PhantomJS mogok atau mesin menjadi offline, hub mungkin masih mencoba merutekan pengujian ke instance yang sudah mati hingga terjadi timeout.
| Fitur Grid | Status Dukungan | Catatan |
|---|---|---|
| Pendaftaran Hub | Didukung | Melalui flag --webdriver-selenium-grid-hub |
| Pembatalan Pendaftaran Instance | Tidak diterapkan | Tidak ada protokol pembatalan pendaftaran eksplisit |
| Pencocokan Kapabilitas | Didukung | Kapabilitas WebDriver standar |
| Timeout Sesi | Didukung | Penanganan timeout tingkat hub |
Perintah WebDriver: Status Implementasi
Ghost Driver belum mengimplementasikan setiap perintah dalam spesifikasi WebDriver. Memahami perintah mana yang tersedia membantu penguji menghindari kegagalan tak terduga dan merencanakan pendekatan alternatif untuk fungsionalitas yang tidak didukung.
Tinjau spreadsheet implementasi perintah resmi sebelum menulis skenario pengujian yang kompleks. Sumber daya ini melacak perintah WebDriver mana yang sepenuhnya diterapkan, didukung sebagian, atau direncanakan untuk rilis mendatang.
| Perintah WebDriver | Status | Solusi Alternatif |
|---|---|---|
| Navigasi (Get, Back, Forward) | Diterapkan | Tidak diperlukan |
| Lokasi Elemen (FindElement) | Diterapkan | Tidak diperlukan |
| Tangkapan Layar | Diterapkan | Diambil dari rendering dalam memori |
| Mengubah Ukuran Jendela | Diterapkan | Tidak diperlukan |
| Penanganan Alert/Confirm/Prompt | Tidak diterapkan | Memerlukan modifikasi inti PhantomJS |
| Touch API | Tidak diterapkan | Tidak ada solusi saat ini |
| Geolocation API | Tidak diterapkan | Tidak ada solusi saat ini |
| Manipulasi Local Storage | Tidak diterapkan | Gunakan eksekusi JavaScript |
| Orientasi Layar | Tidak diterapkan | Tidak berlaku untuk mode headless |
| Pengambilan Log | Tidak diterapkan | Gunakan pencatatan konsol (console logging) |
Praktik Terbaik untuk Pengujian dan Pelaporan Masalah
Pengujian yang efektif dengan Ghost Driver memerlukan pemahaman tentang keunggulannya sebagai browser headless dan mengikuti pedoman komunitas saat melaporkan masalah. Proyek ini berkembang berkat keterlibatan kontributor, dan laporan masalah yang tepat secara dramatis mengurangi waktu penyelesaian.
Selalu sertakan kasus pengujian yang dapat direproduksi. Masalah yang disertai dengan kode sumber yang menunjukkan masalah tersebut akan diperbaiki dalam satu hingga dua hari. Laporan tanpa langkah reproduksi hampir mustahil untuk ditangani dan kemungkinan besar akan ditutup.
Sebelum Mengajukan Masalah:
- Cari masalah yang ada untuk laporan serupa
- Buat kasus pengujian minimal yang dapat direproduksi
- Verifikasi bahwa masalah ada di versi Ghost Driver terbaru
- Periksa apakah perintah WebDriver terdaftar sebagai telah diterapkan
- Sertakan pesan kesalahan dan perilaku yang diharapkan
Saat membandingkan Ghost Driver dengan alternatif seperti HTMLUnit, perbedaan utamanya adalah PhantomJS menjalankan mesin WebKit asli dengan implementasi JavaScript yang lengkap. HTMLUnit adalah browser tiruan (mocked) yang kesulitan menangani kerangka kerja UI yang kompleks seperti YUI3. Pengujian yang ditulis untuk PhantomJS umumnya akan menghasilkan perilaku JavaScript yang sama seperti di Chrome dan Safari, karena keduanya berbagi fondasi WebKit.
| Skenario Pengujian | Alat yang Direkomendasikan | Alasan |
|---|---|---|
| Iterasi pengembangan lokal | Ghost Driver | Cepat, headless, tanpa popup jendela |
| Pipeline CI tanpa server tampilan | Ghost Driver | Tidak memerlukan X11 atau virtual framebuffer |
| Validasi lintas-browser | Chrome/Firefox | Ghost Driver hanya mendukung WebKit |
| Pengujian kerangka kerja UI yang kompleks | Ghost Driver | Mesin JavaScript asli, tidak seperti HTMLUnit |
| Simulasi perangkat seluler | Ghost Driver | Penggantian user-agent dan viewport |
Ghost Driver unggul dalam iterasi waktu pengembangan dan lingkungan CI. Ini tidak boleh sepenuhnya menggantikan pengujian Chrome, Firefox, atau Safari. Gunakan bersama driver browser asli untuk cakupan lintas-browser yang komprehensif.
Pertanyaan yang Sering Diajukan
Q: Apa perbedaan antara Ghost Driver dan PhantomJS?
Ghost Driver adalah implementasi JavaScript dari protokol WebDriver yang berjalan di dalam PhantomJS. PhantomJS adalah browser WebKit headless itu sendiri. Ghost Driver menerjemahkan perintah Selenium WebDriver menjadi aksi yang dapat dieksekusi oleh PhantomJS.
Q: Apakah Ghost Driver mendukung tangkapan layar dalam mode headless?
Ya. PhantomJS menyimpan gambar di dalam memori dari halaman yang dirender. Saat Anda meminta tangkapan layar melalui perintah tangkapan layar WebDriver, Ghost Driver mengambil gambar dari memori dan mengembalikannya sebagai file.
Q: Bagaimana Ghost Driver dibandingkan dengan HTMLUnit Driver?
Ghost Driver menjalankan mesin browser WebKit asli dengan dukungan JavaScript penuh, sementara HTMLUnit adalah browser simulasi yang tidak dapat menangani kerangka kerja UI yang kompleks. Pengujian yang berhasil di Ghost Driver umumnya akan berperilaku sama di browser berbasis WebKit seperti Chrome dan Safari.
Q: Bisakah saya menggunakan Ghost Driver dengan Selenium Grid?
Ya. PhantomJS dapat mendaftarkan dirinya ke hub Selenium Grid menggunakan flag command-line --webdriver-selenium-grid-hub. Namun, pembatalan pendaftaran eksplisit saat ini tidak didukung, yang dapat menyebabkan masalah instance basi jika sebuah proses mogok.
Q: Mengapa pengujian saya berhasil di Firefox tetapi gagal di Ghost Driver?
Beberapa perintah WebDriver belum diimplementasikan di Ghost Driver, seperti penanganan alert, touch API, dan manipulasi local storage. Periksa status implementasi perintah dan verifikasi bahwa pengujian Anda hanya menggunakan perintah yang didukung.