Bagaimana Selenium Bekerja: Episode 1 - 2

Terjemahan artikel disiapkan sebelum dimulainya kursus Java QA Engineer .



Episode 1 - Transportasi


Sebagai hasil dari dialog yang berlangsung pada akhir pekan terakhir bulan Januari 2020, yang didedikasikan untuk salah satu masalah di Selenium, di mana seseorang mengatakan kepada saya "mengapa Anda tidak akan melakukan ini ..." sebagai jawaban untuk menjelaskan masalah, saya memutuskan untuk menulis serangkaian artikel yang menjelaskan perintah di Selenium WebDriver dan mengapa kami berakhir dengan desain yang kami miliki saat ini.

Saya akan mengulangi ini di setiap episode seri ini - banyak, kadang-kadang sampai gila, banyak pemikiran dan pemikiran dimasukkan ke dalam karya setiap detail terkecil Selenium.

Mengapa?

Secara kebetulan dan seberapa baik dia melakukan apa yang seharusnya dia lakukan, Selenium digunakan oleh jutaan orang di seluruh dunia. Ini adalah bagaimana jangkauan terluas perusahaan dari startup kecil ke Microsoft dan Google memastikan bahwa situs mereka berfungsi di setiap browser.

Selenium ?


Selama bertahun-tahun Selenium, kami akhirnya fokus menggunakan HTTP sebagai cara untuk berinteraksi dengan browser. Kami menciptakan REST-ish API (REST-ish - dalam semangat REST), yang dapat menggunakan setiap klien yang mengikat dan mendapatkan, kami berharap, hasil yang sama.

HTTP dan ISTIRAHAT? Serius?

Ya ...

Mari kita mulai dengan bagian HTTP. Ketika kami pertama kali mulai, kami harus mendukung berbagai cara berinteraksi dengan setiap browser, berdasarkan pendekatan terbaik untuk masing-masing browser. Misalnya, untuk Internet Explorer, kami menulis kode COM. Dia bekerja dengan baik, tetapi darinya kita masih memiliki mimpi buruk. Untuk Firefox, kami menulis monster membaca baris demi baris, yang, untungnya, berkat pendekatan "make your browser" Mozilla, mampu melakukan banyak hal. Opera memungkinkan kami untuk masuk melalui protokol DevTools.

Jadi, ini berarti bahwa, terutama pada tahun-tahun awal WebDriver, kami perlu mendukung N: M binding, di mana N adalah binding bahasa dan M adalah browser yang kami dukung. Jalur ini tidak mengarah ke produk yang bagus. Kami memutuskan bahwa kami membutuhkan sesuatu yang setiap bahasa akan mengerti. Kami juga membutuhkan sesuatu yang cukup andal. Jadi pilihan jatuh pada HTTP, dan kami mulai membuat JSONWireProtocol.

Dalam kerangka itu, JSONWireProtocolkami membangun antarmuka ISTIRAHAT yang berkomunikasi di JSON. Saya katakan REST-ish karena tidak sepenuhnya mengikuti semua prinsip REST, tetapi mewujudkannya sampai tingkat yang cukup untuk menjadikannya alat yang ampuh untuk tugas-tugas kami.

Bagaimana dengan keadaan saat ini?

Web, Internet, dan dunia terus berjalan. Jadi mengapa Selenium tidak?

Ini adalah pertanyaan yang bagus, tetapi kenyataannya adalah bahwa kami berusaha untuk memodernisasi. Sayangnya, jaringan dikarakteristikkan oleh keadaan saat tidak berfungsi, jika tidak berjalan. HTTP cukup dapat diandalkan sebagai protokol. Itu juga memungkinkan orang untuk membuat cluster untuk pengujian tanpa khawatir tentang bagaimana multiplexing akan bekerja. Ini adalah alasan Selenium Grid dibuat, yang masih merupakan pilihan yang baik ketika datang untuk mengatur pengujian dengan beberapa perangkat dan komputer.

Tapi itu lebih mirip jaringan.

Jadi ... Ada alat yang menggunakan Protokol Debug Chrome untuk mengontrol Chrome. Mereka melakukan beberapa hal lebih baik daripada Selenium, yang merupakan konsekuensi dari pilihan mereka tentang cara berkomunikasi dengan browser. Sayangnya, ini adalah protokol milik Chrome, dan membuatnya dapat diakses oleh peramban lain tidak untuk kepentingan Google.

Selain itu, mengabaikan solusi desain yang menarik dari tim Google, ada masalah sehingga kita harus memiliki koneksi yang terus-menerus terbuka. Dalam hal ini, ia menggunakan WebSockets, tetapi Anda harus mengingat komentar saya di atas bahwa Internet tidak tersedia saat tidak berfungsi. WebSockets akan terus terhubung kembali. Ada juga masalah tentang berapa banyak lalu lintas akan naik dan turun saluran ini.

Ini bukan masalah bagi dalang ketika Anda berinteraksi dengan sesuatu hanya di komputer lokal Anda, tetapi jika Anda mengintegrasikan layanan CI seperti Circle CI atau TravisCI dan sesuatu seperti AWS Device Farm, Sauce Labs atau BrowserStack, di antara Anda dan pelari Anda tiba-tiba mendapatkan Internet, dan data ini harus mencapai penerima.

Kelompok kerja Pengujian dan Alat Peramban W3C, yang terdiri dari vendor peramban dan orang-orang Selenium, sedang mencoba merancang bagaimana segala sesuatunya terlihat untuk memastikan bahwa kami dapat memastikan kompatibilitas lintas-peramban sejak awal, tanpa menggunakan tambalan hacker yang aneh dan pengiriman pribadi semua ini. browser.

Ingin tahu lebih banyak?



Episode 2 - Navigasi
Dalam episode ini kita akan melihat sejumlah besar pekerjaan yang berkaitan dengan navigasi.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")


Apa yang kita lihat di atas ... terlihat sangat sederhana, benar ... tapi ini dia!

Bahkan, ini menuntun saya ke wawancara tanpa perasaan. Jika seseorang pernah meminta Anda untuk menggambarkan apa yang terjadi di browser saat Anda mengetik URL dan tekan enter, ada kemungkinan besar bahwa dia tidak memiliki ide nyata tentang apa yang terjadi di navigasi. Pokoknya ... kembali ke Selenium dan navigasinya. Segera setelah kami mengirim permintaan melalui lapisan transportasi , kesenangan sesungguhnya dimulai. Kita perlu mencari tahu ke mana kita ingin pergi, dan memberitahu browser untuk pergi ke sana untuk kita. Sayangnya, ini akan mengarah pada yang pertama dari banyak masalah untuk otomasi.

driver.get



Sertifikat


Jika Anda pernah bekerja di perusahaan perusahaan besar, di mana teknologi bukanlah yang utama, Anda memahami rasa sakit yang mungkin dihadapi tim pengembangan. Sekarang gandakan rasa sakit ini, dan Anda bisa membayangkan rasa sakit yang harus dihadapi penguji dan insinyur otomasi.

Salah satunya adalah sertifikat. Perusahaan itu pelit dan akan membuat sertifikat yang ditandatangani sendiri dan kelainan bentuk lainnya. Terutama di masa-masa awal Selenium, ketika tidak ada layanan seperti Let's Encrypt . Dan bahkan sekarang, sebagian besar pengembang dan grup QA jarang memiliki akses ke perubahan konfigurasi di lingkungan pengujian mereka atau di server CI mereka. Kami perlu mencari jalan keluar di sekitar sertifikat. ( Ini adalah salah satu alasan pertama mengapa Selenium dipandang sebagai risiko keamanan. )

Dengan demikian, masing-masing browser melewatkan sertifikat yang dikonfigurasi dengan buruk selama otomatisasi. Jika mereka tidak menyadarinya, maka banyak penguji / pengembang tidak akan memiliki kesempatan untuk menguji situs mereka.

Sekarang ... ketika kita menyelesaikan masalah pertama, kita perlu beralih ke memuat halaman.

Memuat


Segera setelah kami menerima sertifikat, kami mendapatkan halaman untuk diunduh. Untungnya, kita tidak perlu melakukan hal yang lebih rumit daripada yang setara

location = "https://www.theautomatedtester.co.uk"; 
// 
window.location.href = "https://www.theautomatedtester.co.uk";


Selesai ...


Ketika Selenium "menyelesaikan" tim, kami akan menerima pengembalian uang. Jadi, kita hanya perlu menunggu halaman dimuat. Sejujurnya, apa artinya "selesai memuat" ?

Peramban akan menjalankan beberapa peristiwa berbeda. Kami akan tahu kapan halaman akan ditampilkan, dan kemudian apa itu readyState. Selenium akan menguji semua ini dan juga akan menunggu DOMContentLoaded.

Dan kemudian masalah muncul jika Anda berada di halaman dan mencoba untuk melompat ke jangkar di halaman itu. Mari kita lihat contoh berikut ini.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
driver.get("https://www.theautomatedtester.co.uk#someAnchor")


Oh, lihat saja, tidak ada acara pemuatan halaman yang akan dipecat! Kelas? Peramban bodoh akan bekerja secara efisien dan cukup gulir ke jangkar. Ini berarti bahwa kami tidak dapat hanya bergantung pada peristiwa yang berasal dari halaman.

Tidak, oleh karena itu, kami memerlukan kode khusus untuk kasus ini dan pemahaman tentang apa artinya "siap" dalam kasus ini. Jika kita melakukan kesalahan, ini akan membuat banyak tes tidak stabil. Tes yang tidak stabil membuat orang menjadi galak, dan kami tidak ingin pengembang yang galak, ada cukup banyak di dunia dan tanpa tes yang tidak stabil.

Setelah kami menyelesaikan pemeriksaan ini, dan Anda dapat memanipulasi cara kami melihat acara ini, jika Anda ingin mereka memuat lebih cepat menggunakan Strategi Memuat Halaman. Ini lebih merupakan fitur pengguna paver, jadi saya tidak akan repot tentang mereka sekarang, tetapi mereka mempengaruhi kecepatan perintah navigasi.

Bagaimana dengan kerangka kerja JavaScript dan navigasi


Ini adalah tempat di mana semua "kesenangan" terkonsentrasi. Banyak kerangka kerja akan tetap memuat banyak setelah pemuatan awal pada halaman. Jika Anda pernah bekerja pada aplikasi satu halaman atau hanya menggunakannya, Anda telah melihat banyak elemen ditampilkan saat mereka memuat. Sayangnya, ini berarti Anda tidak bisa hanya mengandalkan kembalinya perintah navigasi. Anda perlu menambahkan perintah WebDriverWaitke kode Anda, seperti yang ditunjukkan di bawah ini, untuk memastikan pengujian Anda dalam keadaan yang benar sebelum Anda pergi untuk melakukan apa yang dibutuhkan.

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox()
driver.get("https://www.theautomatedtester.co.uk")
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(β€œsomeId”))


Kesimpulan


Saat memuat halaman, jangan selalu mengandalkan Selenium kembali ketika halaman selesai memuat. Jika Anda perlu melihat elemen pada halaman, maka lakukanlah. Hanya tahu bagaimana JavaScript pada halaman dapat mengubahnya setelah memuat awal.

Untuk bacaan lebih lanjut






Pelajari lebih lanjut tentang kursus .



All Articles