Bagaimana Menunggu Halaman dimuat dengan Selenium

How Wait Page Load With Selenium



Walaupun automasi web atau pengikisan web dengan pemacu web Selenium, anda mungkin menghadapi masalah seperti elemen yang ingin anda pilih tidak tersedia atau butang yang ingin anda tekan tidak siap untuk diklik dan sebagainya.

Sebab ini berlaku ialah pemacu web Selenium mesti memuat turun halaman web dan selesai membuat halaman sebelum anda dapat melakukan apa-apa di atasnya. Pada masa lalu, pelayan laman web menghasilkan kandungan laman web, dan penyemak imbas hanya memuat turunnya dan membuatnya. Hari ini kita mempunyai banyak aplikasi web satu halaman yang berfungsi sedikit berbeza. Dalam Aplikasi Web Halaman Tunggal (SPA), pelayan laman web hanya melayani kod frontend. Setelah kod frontend diberikan pada penyemak imbas, kod frontend menggunakan AJAX untuk meminta data API ke pelayan web. Sebaik sahaja frontend menerima data API, itu akan menjadikannya di penyemak imbas. Jadi, walaupun penyemak imbas selesai memuat turun dan membuat halaman web, halaman web masih belum siap. Anda mesti menunggunya untuk menerima data API dan memberikannya juga. Jadi, penyelesaian untuk masalah ini adalah menunggu data tersedia sebelum kita melakukan apa-apa dengan Selenium.







Di Selenium, terdapat 2 jenis penantian:
1) Penantian tersirat
2) Penantian yang jelas



1) Penantian tersirat: Ini adalah yang paling mudah dilaksanakan. Penantian yang tersirat memberitahu pemacu web Selenium menunggu beberapa saat sehingga DOM (model objek dokumen) siap (halaman web siap).



2) Penantian yang jelas: Ini agak rumit daripada penantian yang tersirat. Dalam penantian eksplisit, anda memberitahu pemandu web Selenium apa yang harus ditunggu. Selenium menunggu syarat khusus itu dipenuhi. Setelah dipenuhi, pemacu web Selenium akan siap untuk mengambil perintah lain. Biasanya, masa menunggu eksplisit berubah-ubah. Ia bergantung pada seberapa cepat keadaan dipenuhi. Dalam senario terburuk, penantian eksplisit akan menunggu selagi menunggu tersirat.





Dalam artikel ini, saya akan menunjukkan kepada anda cara menunggu (tersirat dan tersurat) sehingga halaman dimuat dengan Selenium. Jadi, mari kita mulakan.

Prasyarat:

Untuk mencuba perintah dan contoh artikel ini, anda mesti mempunyai,



1) Sebaran Linux (sebaiknya Ubuntu) dipasang di komputer anda.
2) Python 3 dipasang pada komputer anda.
3) PIP 3 dipasang pada komputer anda.
4) Python virtualenv pakej yang dipasang di komputer anda.
5) Penyemak imbas web Mozilla Firefox atau Google Chrome yang dipasang di komputer anda.
6) Mesti tahu cara memasang Pemacu Firefox Gecko atau Pemacu Web Chrome.

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

Anda boleh menemui banyak artikel mengenai topik lain di LinuxHint.com . Pastikan anda memeriksanya jika anda memerlukan bantuan.

Menyiapkan Direktori Projek:

Untuk memastikan semuanya teratur, buat direktori projek baru selenium-tunggu / seperti berikut:

$mkdir -pvselenium-tunggu/pemandu

Navigasi ke selenium-tunggu / direktori projek seperti berikut:

$CDselenium-tunggu/

Buat persekitaran maya Python dalam direktori projek seperti berikut:

$virtualenv .venv

Aktifkan persekitaran maya seperti berikut:

$sumber.venv/saya/aktifkan

Pasang Selenium menggunakan PIP3 seperti berikut:

$ pip3 memasang selenium

Muat turun dan pasang semua pemacu web yang diperlukan di pemandu / direktori projek. Saya telah menerangkan proses memuat turun dan memasang pemacu web dalam artikel saya Pengenalan Selenium dengan Python 3 . Sekiranya anda memerlukan bantuan, cari di LinuxHint.com untuk artikel itu.

Saya akan menggunakan penyemak imbas web Google Chrome untuk demonstrasi dalam artikel ini. Jadi, saya akan menggunakan kromedriver binari dari pemandu / direktori.

Untuk bereksperimen dengan penantian tersirat, buat skrip Python baru ex01.py di direktori projek anda dan taipkan baris kod berikut dalam fail tersebut.

dariseleniummengimportpemacu laman web
dariselenium.pemacu laman web.biasa.kunci mengimportKekunci
pilihan=pemacu laman web.Pilihan Chrome()
pilihan.tanpa kepala = Betul
penyemak imbas=pemacu laman web.Chrome(jalan yang boleh dilaksanakan='./drivers/chromedriver',pilihan=pilihan)
penyemak imbas.secara tersirat_tunggu(10)
penyemak imbas.dapatkan('https://www.unixtimestamp.com/')
cap waktu=penyemak imbas.cari_elemen_by_xpath('// h3 [@] [1]')
mencetak('Cap masa semasa:% s'%(cap waktu.teks.berpecah('')[0]))
penyemak imbas.tutup()

Setelah selesai, simpan ex01.py Skrip Python.

Baris 1 dan 2 mengimport semua komponen Selenium yang diperlukan.

Baris 4 membuat objek Pilihan Chrome.

Baris 5 membolehkan mod tanpa kepala untuk pemacu web Chrome.

Baris 7 membuat objek penyemak imbas Chrome menggunakan kromedriver binari dari pemandu / direktori.

Baris 8 digunakan untuk menyuruh Selenium menunggu secara tidak langsung selama 10 saat menggunakan secara implisit_wait () kaedah penyemak imbas.

Baris 10 memuatkan www.unixtimestamp.com di penyemak imbas.

Baris 12 menemui elemen cap waktu menggunakan pemilih XPath // h3 [@ class = 'text-bahaya'] [1] dan menyimpannya di cap waktu pemboleh ubah.

Saya mendapat pemilih XPath dari Alat Pembangun Chrome. Seperti yang anda lihat, cap waktu adalah yang pertama h3 unsur dengan nama kelas bahaya teks . Terdapat 2 h3 unsur dengan kelas bahaya teks .

Baris 13 hanya mencetak cap waktu dari elemen yang telah saya pilih menggunakan pemilih XPath dan disimpan di cap waktu pemboleh ubah.

Baris 14 menutup penyemak imbas.

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

$ python3 ex01.py

Seperti yang anda lihat, cap waktu semasa diekstrak dari unixtimestamp.com dan dicetak pada konsol.

Bekerja dengan Tunggu Eksplisit:

Untuk bereksperimen dengan penantian eksplisit, buat skrip Python baru ex02.py di direktori projek anda dan taipkan baris kod berikut dalam fail tersebut.

dariseleniummengimportpemacu laman web
dariselenium.pemacu laman web.biasa.kunci mengimportKekunci
dariselenium.pemacu laman web.biasa.oleh mengimportOleh
dariselenium.pemacu laman web.sokongan.bawang besar mengimportWebDriverWait
dariselenium.pemacu laman web.sokongan mengimportjangkaan_kondisi
pilihan=pemacu laman web.Pilihan Chrome()
pilihan.tanpa kepala = Betul
penyemak imbas=pemacu laman web.Chrome(jalan yang boleh dilaksanakan='./drivers/chromedriver',pilihan=pilihan)
penyemak imbas.dapatkan('https://www.unixtimestamp.com/')
cuba:
cap waktu=WebDriverWait(penyemak imbas, 10).sehingga(
jangkaan_kondisi.kehadiran_dari_lemen_berlokasi((Oleh.XPATH, '
// h3 [@] [1] '
))
)
mencetak('Cap masa semasa:% s'%(cap waktu.teks.berpecah('')[0]))
akhirnya:
penyemak imbas.tutup()

Setelah selesai, simpan ex02.py Skrip Python.

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

Baris 7 membuat objek Pilihan Chrome.

Baris 8 membolehkan mod tanpa kepala untuk pemacu web Chrome.

Baris 10 membuat objek penyemak imbas Chrome menggunakan kromedriver binari dari pemandu / direktori.

Baris 12 memuatkan www.unixtimestamp.com di penyemak imbas.

Penantian eksplisit dilaksanakan dalam blok cubaan akhirnya (dari baris 14-20)

Baris 15-17 menggunakan mencipta WebDriverWait () objek. Hujah pertama mengenai WebDriverWait () adalah objek penyemak imbas, dan argumen kedua adalah masa maksimum yang dibenarkan (senario terburuk) untuk memenuhi syarat, iaitu 10 saat dalam kes ini.

Di dalam sehingga () blok, dijangka_kondisi.presensi_of_elemen_lokasi () kaedah digunakan untuk memastikan bahawa elemen tersebut ada sebelum cuba memilih elemen tersebut. Di sini, Oleh.XPATH digunakan untuk memberitahu kehadiran_of_elemen_lokasi () kaedah yang kami telah menggunakan pemilih XPath untuk memilih elemen. Pemilih XPath adalah // h3 [@ class = 'text-bahaya'] [1] .

Setelah elemen dijumpai, ia disimpan di cap waktu pemboleh ubah.

Baris 18 hanya mencetak cap waktu dari elemen yang dipilih.

Akhirnya, baris 19-20 menutup penyemak imbas.

Setelah selesai, jalankan ex02.py Skrip Python seperti berikut:

$ python3 ex02.py

Seperti yang anda lihat, cap waktu semasa dari unixtimestamp.com dicetak pada konsol.

Memilih Elemen dalam Penantian Eksplisit:

Pada bahagian sebelumnya, saya telah menggunakan Oleh.XPATH kerana memilih elemen menggunakan pemilih XPath. Anda juga boleh memilih elemen menggunakan ID, nama tag, nama kelas CSS, pemilih CSS, dll.

Kaedah pemilihan yang disokong diberikan di bawah:

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 mengikut ID

Oleh.NAME - Memilih elemen / elemen mengikut nama.

Oleh.TAG_NAME - Memilih elemen / elemen dengan nama tag HTML.

Oleh.LINK_TEXT - Memilih elemen / elemen dengan teks pautan dari ke (sauh) teg HTML.

Oleh.PARTIAL_LINK_TEXT - Memilih elemen / elemen dengan teks pautan separa dari ke (sauh) teg HTML.

Untuk maklumat lebih lanjut mengenai perkara ini, kunjungi Halaman Dokumentasi API Python Selenium .

Keadaan yang Diharapkan dalam Penantian Eksplisit:

Dalam contoh menunggu eksplisit sebelumnya, saya telah menggunakan kehadiran_of_elemen_lokasi () kaedah jangkaan_kondisi sebagai syarat menunggu eksplisit untuk memastikan bahawa elemen yang saya cari memang ada sebelum memilihnya.

Ada yang lain jangkaan_kondisi anda boleh gunakan sebagai keadaan menunggu yang jelas. Sebahagian daripadanya adalah:

title_is (tajuk) - memeriksa sama ada tajuk halaman tajuk .

tajuk_contains (sebahagian_title) - memeriksa sama ada tajuk halaman mengandungi bahagian tajuk separa_title .

keterlihatan_of (elemen) - memeriksa sama ada unsur dapat dilihat pada halaman yang elemennya mempunyai lebar dan tinggi lebih besar dari 0.

visibility_of_element_located (pencari) -

kehadiran_of_elemen_lokasi (pencari) - Pastikan bahawa elemen terletak (oleh pencari ) terdapat di halaman. The pencari adalah tuple dari (Oleh, pemilih), seperti yang telah saya tunjukkan dalam contoh menunggu eksplisit.

kehadiran_pada_semua_elemen_lokasi () - Memastikan bahawa semua elemen dipadankan dengan pencari hadir di halaman. The pencari ialah (Oleh, pemilih) tupel.

text_to_be_present_in_element (pencari, teks) - Memeriksa sama ada teks terdapat dalam elemen yang terletak oleh pencari . The pencari ialah (Oleh, pemilih) tupel.

element_to_be_clickable (pencari) - Memeriksa apakah elemen yang terletak di pencari kelihatan dan boleh diklik. The pencari ialah (Oleh, pemilih) tupel.

element_to_be_selected (pencari) - Memeriksa apakah elemen yang terletak di pencari dipilih. The pencari ialah (Oleh, pemilih) tupel.

alert_is_present () - harapkan dialog amaran hadir di halaman.

Terdapat banyak lagi jangkaan_kondisi tersedia untuk anda gunakan. Untuk maklumat lebih lanjut mengenai perkara ini, kunjungi Halaman Dokumentasi API Python Selenium .

Kesimpulan:

Dalam artikel ini, saya telah membincangkan penantian tersirat dan eksplisit Selenium. Saya juga telah menunjukkan cara bekerja dengan penantian yang tersirat dan tersurat. Anda harus selalu berusaha menggunakan penantian eksplisit dalam projek Selenium anda kerana Selenium akan berusaha mengurangkan waktu menunggu sebanyak mungkin. Dengan cara ini, anda tidak perlu menunggu jumlah detik tertentu setiap kali anda menjalankan projek Selenium anda. Penantian eksplisit akan menjimatkan banyak saat.

Untuk maklumat lebih lanjut mengenai Selenium menunggu, lawati Perpustakaan Selenium Python rasmi menunggu halaman Dokumentasi .