Cara Menunggu Halaman Dimuat dengan Selenium

How Wait Page Load With Selenium



Saat otomatisasi web atau pengikisan web dengan driver web Selenium, Anda mungkin menghadapi masalah seperti elemen yang ingin Anda pilih tidak tersedia atau tombol yang ingin Anda tekan tidak siap untuk diklik dan sebagainya.

Alasan ini terjadi adalah karena driver web Selenium harus mengunduh halaman web dan menyelesaikan rendering halaman sebelum Anda dapat melakukan apa pun di dalamnya. Di masa lalu, server web membuat konten situs web, dan browser baru saja mengunduhnya dan merendernya. Saat ini kami memiliki banyak aplikasi web satu halaman yang bekerja sedikit berbeda. Di Single Page Web Apps (SPA), server web hanya melayani kode frontend. Setelah kode frontend dirender di browser, kode frontend menggunakan AJAX untuk meminta data API ke server web. Setelah frontend menerima data API, itu merendernya di browser. Jadi, meskipun browser telah selesai mengunduh dan merender halaman web, halaman web tersebut masih belum siap. Anda harus menunggunya untuk menerima data API dan merendernya juga. Jadi, solusi untuk masalah ini adalah menunggu data tersedia sebelum kita melakukan apa pun dengan Selenium.







Di Selenium, ada 2 jenis menunggu:
1) Penantian implisit
2) Penantian eksplisit



1) Penantian implisit: Ini adalah yang paling mudah untuk diterapkan. Penantian implisit memberi tahu driver web Selenium untuk menunggu beberapa detik hingga DOM (model objek dokumen) siap (halaman web siap).



2) Penantian eksplisit: Ini sedikit rumit daripada menunggu implisit. Dalam menunggu eksplisit, Anda memberi tahu driver web Selenium apa yang harus ditunggu. Selenium menunggu kondisi spesifik itu terpenuhi. Setelah terpenuhi, web driver Selenium akan siap untuk mengambil perintah lain. Biasanya, waktu tunggu eksplisit adalah variabel. Itu tergantung pada seberapa cepat kondisi terpenuhi. Dalam skenario terburuk, penantian eksplisit akan menunggu selama penantian implisit.





Pada artikel ini, saya akan menunjukkan kepada Anda bagaimana menunggu (implisit dan eksplisit) halaman dimuat dengan Selenium. Jadi, mari kita mulai.

Prasyarat:

Untuk mencoba perintah dan contoh artikel ini, Anda harus memiliki,



1) Distribusi Linux (sebaiknya Ubuntu) diinstal pada komputer Anda.
2) Python 3 diinstal di komputer Anda.
3) PIP 3 diinstal pada komputer Anda.
4) Python virtualenv paket yang diinstal pada komputer Anda.
5) Mozilla Firefox atau browser web Google Chrome terpasang di komputer Anda.
6) Harus tahu cara menginstal Firefox Gecko Driver atau Chrome Web Driver.

Untuk memenuhi persyaratan 4, 5, dan 6, baca artikel saya Pengenalan Selenium dengan Python 3 di Linuxhint.com.

Anda dapat menemukan banyak artikel tentang topik lain di LinuxHint.com . Pastikan untuk memeriksanya jika Anda memerlukan bantuan.

Menyiapkan Direktori Proyek:

Untuk menjaga semuanya tetap teratur, buat direktori proyek baru selenium-tunggu/ sebagai berikut:

$mkdir -pvselenium-tunggu/pengemudi

Navigasikan ke selenium-tunggu/ direktori proyek sebagai berikut:

$CDselenium-tunggu/

Buat lingkungan virtual Python di direktori proyek sebagai berikut:

$virtualenv .venv

Aktifkan lingkungan virtual sebagai berikut:

$sumber.venv/NS/mengaktifkan

Instal Selenium menggunakan PIP3 sebagai berikut:

$pip3 instal selenium

Unduh dan instal semua driver web yang diperlukan di pengemudi/ direktori proyek. Saya telah menjelaskan proses mengunduh dan menginstal driver web di artikel saya Pengenalan Selenium dengan Python 3 . Jika Anda memerlukan bantuan, cari di LinuxHint.com untuk artikel itu.

Saya akan menggunakan browser web Google Chrome untuk demonstrasi di artikel ini. Jadi, saya akan menggunakan chromedriver biner dari pengemudi/ direktori.

Untuk bereksperimen dengan menunggu implisit, buat skrip Python baru ex01.py di direktori proyek Anda dan ketik baris kode berikut di file itu.

dariseleniumimporwebdriver
dariselenium.webdriver.umum.kunci imporKunci
pilihan=webdriver.Opsi Chrome()
pilihan.tanpa kepala = benar
peramban=webdriver.Chrome(executable_path='./driver/chromedriver',pilihan=pilihan)
peramban.implisit_tunggu(10)
peramban.Dapatkan('https://www.unixtimestamp.com/')
stempel waktu=peramban.temukan_elemen_oleh_xpath('//h3[@][1]')
mencetak('Stempel waktu saat ini: %s'%(stempel waktu.teks.membelah('')[0]))
peramban.Menutup()

Setelah selesai, simpan ex01.py skrip piton.

Baris 1 dan 2 mengimpor semua komponen Selenium yang diperlukan.

Baris 4 membuat objek Opsi Chrome.

Baris 5 mengaktifkan mode tanpa kepala untuk driver web Chrome.

Baris 7 membuat objek browser Chrome menggunakan chromedriver biner dari pengemudi/ direktori.

Baris 8 digunakan untuk memberitahu Selenium untuk menunggu secara implisit selama 10 detik menggunakan implisit_tunggu() metode peramban.

Baris 10 memuat www.unixtimestamp.com di browser.

Baris 12 menemukan elemen stempel waktu menggunakan pemilih XPath //h3[@class='text-danger'][1] dan menyimpannya di stempel waktu variabel.

Saya mendapatkan pemilih XPath dari Alat Pengembang Chrome. Seperti yang Anda lihat, stempel waktu ada di yang pertama h3 elemen dengan nama kelas bahaya teks . Ada 2 h3 elemen dengan kelas bahaya teks .

Baris 13 hanya mencetak stempel waktu dari elemen yang telah saya pilih menggunakan pemilih XPath dan disimpan di stempel waktu variabel.

Baris 14 menutup browser.

Setelah selesai, jalankan skrip Python ex01.py sebagai berikut:

$ python3 ex01.py

Seperti yang Anda lihat, stempel waktu saat ini diekstraksi dari unixtimestamp.com dan dicetak di konsol.

Bekerja dengan Tunggu Eksplisit:

Untuk bereksperimen dengan menunggu eksplisit, buat skrip Python baru ex02.py di direktori proyek Anda dan ketik baris kode berikut di file itu.

dariseleniumimporwebdriver
dariselenium.webdriver.umum.kunci imporKunci
dariselenium.webdriver.umum.oleh imporOleh
dariselenium.webdriver.mendukung.Bawang imporWebDriverTunggu
dariselenium.webdriver.mendukung impordiharapkan_kondisi
pilihan=webdriver.Opsi Chrome()
pilihan.tanpa kepala = benar
peramban=webdriver.Chrome(executable_path='./driver/chromedriver',pilihan=pilihan)
peramban.Dapatkan('https://www.unixtimestamp.com/')
mencoba:
stempel waktu=WebDriverTunggu(peramban, 10).sampai(
diharapkan_kondisi.kehadiran_dari_elemen_terletak((Oleh.XPATH, '
//h3[@][1]'
))
)
mencetak('Stempel waktu saat ini: %s'%(stempel waktu.teks.membelah('')[0]))
akhirnya:
peramban.Menutup()

Setelah selesai, simpan ex02.py skrip piton.

Baris 1-5 mengimpor semua komponen yang diperlukan dari perpustakaan Selenium.

Baris 7 membuat objek Opsi Chrome.

Baris 8 mengaktifkan mode tanpa kepala untuk driver web Chrome.

Baris 10 membuat objek browser Chrome menggunakan chromedriver biner dari pengemudi/ direktori.

Baris 12 memuat www.unixtimestamp.com di browser.

Penantian eksplisit diimplementasikan di blok try-finally (dari baris 14-20)

Baris 15-17 menggunakan create WebDriverTunggu() obyek. Argumen pertama dari WebDriverTunggu() adalah objek browser, dan argumen kedua adalah waktu maksimum yang diizinkan (skenario terburuk) untuk memenuhi kondisi, yaitu 10 detik dalam kasus ini.

Dalam sampai() memblokir, diharapkan_kondisi.kehadiran_of_element_located() metode ini digunakan untuk memastikan bahwa elemen ada sebelum mencoba memilih elemen. Di Sini, Oleh.XPATH digunakan untuk memberitahu kehadiran_of_element_located() metode yang kami gunakan pemilih XPath untuk memilih elemen. Pemilih XPath adalah //h3[@class='text-danger'][1] .

Setelah elemen ditemukan, itu disimpan di stempel waktu variabel.

Baris 18 hanya mencetak stempel waktu dari elemen yang dipilih.

Akhirnya, baris 19-20 menutup browser.

Setelah selesai, jalankan ex02.py Script Python sebagai berikut:

$ python3 ex02.py

Seperti yang Anda lihat, stempel waktu saat ini dari unixtimestamp.com dicetak di konsol.

Memilih Elemen di Explicit Waits:

Di bagian sebelumnya, saya telah menggunakan Oleh.XPATH untuk memilih elemen menggunakan pemilih XPath. Anda juga dapat memilih elemen menggunakan ID, nama tag, nama kelas CSS, pemilih CSS, dll.

Metode pemilihan yang didukung diberikan di bawah ini:

Oleh.XPATH – Memilih elemen/elemen menggunakan pemilih XPath.

Oleh.CLASS_NAME – Memilih elemen/elemen menggunakan nama kelas CSS.

Oleh.CSS_SELECTOR – Memilih elemen/elemen menggunakan pemilih CSS.

Oleh.ID – Memilih elemen berdasarkan ID

Dengan nama – Memilih elemen/elemen berdasarkan nama.

Oleh.TAG_NAME – Memilih elemen/elemen berdasarkan nama tag HTML.

Oleh.LINK_TEXT – Memilih elemen / elemen dengan teks tautan ke (jangkar) tag HTML.

Oleh.PARTIAL_LINK_TEXT – Memilih elemen/elemen dengan teks tautan parsial dari ke (jangkar) tag HTML.

Untuk informasi lebih lanjut tentang ini, kunjungi Halaman Dokumentasi Python Selenium API .

Kondisi yang Diharapkan dalam Penantian Eksplisit:

Dalam contoh tunggu eksplisit sebelumnya, saya telah menggunakan kehadiran_of_element_located() metode dari diharapkan_kondisi sebagai kondisi tunggu eksplisit untuk memastikan bahwa elemen yang saya cari memang ada sebelum memilihnya.

Ada yang lain diharapkan_kondisi Anda dapat menggunakan sebagai kondisi menunggu eksplisit. Beberapa dari mereka adalah:

title_is(judul) – memeriksa apakah judul halaman adalah judul .

title_contains(judul_sebagian) – memeriksa apakah judul halaman berisi bagian dari judul parsial_judul .

visibilitas_of(elemen) - memeriksa apakah elemen terlihat pada halaman yang merupakan elemen yang memiliki lebar dan tinggi lebih besar dari 0.

visibilitas_of_element_located(pencari) -

kehadiran_of_element_located(pencari) – Pastikan bahwa elemen terletak (oleh pencari lokasi ) ada di halaman. NS pencari lokasi adalah tupel dari (Oleh, pemilih), seperti yang saya tunjukkan dalam contoh tunggu eksplisit.

kehadiran_of_semua_elemen_lokasi() – Pastikan semua elemen cocok dengan pencari lokasi hadir di halaman. NS pencari lokasi adalah (Oleh, pemilih) tupel.

text_to_be_present_in_element(pencari, teks) – Memeriksa apakah teks hadir dalam elemen yang terletak oleh pencari lokasi . NS pencari lokasi adalah (Oleh, pemilih) tupel.

element_to_be_clickable(pencari lokasi) – Memeriksa apakah elemen terletak oleh pencari lokasi terlihat dan dapat diklik. NS pencari lokasi adalah (Oleh, pemilih) tupel.

element_to_be_selected(pencari lokasi) – Memeriksa apakah elemen terletak oleh pencari lokasi dipilih. NS pencari lokasi adalah (Oleh, pemilih) tupel.

alert_is_present() – mengharapkan dialog peringatan hadir di halaman.

Masih banyak lagi diharapkan_kondisi tersedia untuk Anda gunakan. Untuk informasi lebih lanjut tentang ini, kunjungi Halaman Dokumentasi Python Selenium API .

Kesimpulan:

Dalam artikel ini, saya telah membahas penantian implisit dan eksplisit Selenium. Saya juga telah menunjukkan kepada Anda cara bekerja dengan penantian implisit dan eksplisit. Anda harus selalu mencoba menggunakan waktu tunggu eksplisit dalam proyek Selenium Anda karena Selenium akan mencoba mengurangi waktu tunggu sebanyak mungkin. Dengan cara ini, Anda tidak perlu menunggu beberapa detik tertentu setiap kali Anda menjalankan proyek Selenium Anda. Penantian eksplisit harus menghemat banyak detik.

Untuk informasi lebih lanjut tentang Selenium, kunjungi Perpustakaan Selenium Python resmi menunggu halaman Dokumentasi .