Selenium

Bagaimana Menunggu Halaman dimuat dengan Selenium

Bagaimana Menunggu Halaman dimuat dengan 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 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. Oleh itu, 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 untuk 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 terpenuhi, 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 bagaimana menunggu (tersirat dan tersurat) sehingga halaman dimuat dengan Selenium. Oleh itu, mari kita mulakan.

Prasyarat:

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

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 -pv selenium-tunggu / pemacu

Navigasi ke selenium-tunggu / direktori projek seperti berikut:

$ cd selenium-tunggu /

Buat persekitaran maya Python dalam direktori projek seperti berikut:

$ virtualenv .venv

Aktifkan persekitaran maya seperti berikut:

sumber $ .venv / bin / 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.

Bekerja dengan Tunggu Tersirat:

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

dari pemacu web import selenium
dari selenium.pemacu laman web.biasa.kunci import Kekunci
pilihan = pemacu web.Pilihan Chrome ()
pilihan.tanpa kepala = Betul
penyemak imbas = pemacu web.Chrome (executable_path = "./ driver / chromedriver ", options = pilihan)
penyemak imbas.secara implisit_wait (10)
penyemak imbas.dapatkan ("https: // www.cap unixtimest.com / ")
cap waktu = penyemak imbas.cari_element_by_xpath ("// h3 [@ class = 'text-bahaya'] [1]")
cetak ('Cap waktu semasa:% s'% (cap waktu.teks.berpisah (") [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 tersirat_tunggu () kaedah penyemak imbas.

Baris 10 memuatkan www.cap unixtimest.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 di konsol.

Bekerja dengan Tunggu Eksplisit:

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

dari pemacu web import selenium
dari selenium.pemacu laman web.biasa.kunci import Kekunci
dari selenium.pemacu laman web.biasa.oleh import Oleh
dari selenium.pemacu laman web.sokongan.ui import WebDriverWait
dari selenium.pemacu laman web.sokong import dijangka_kondisi
pilihan = pemacu web.Pilihan Chrome ()
pilihan.tanpa kepala = Betul
penyemak imbas = pemacu web.Chrome (executable_path = "./ driver / chromedriver ", options = pilihan)
penyemak imbas.dapatkan ("https: // www.cap unixtimest.com / ")
cuba:
cap waktu = WebDriverWait (penyemak imbas, 10).sehingga (
jangkaan_kondisi.kehadiran_of_element_located ((Oleh.XPATH, "
// h3 [@ class = 'text-bahaya'] [1] "))
)
cetak ('Cap waktu semasa:% s'% (cap waktu.teks.berpisah (") [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.cap unixtimest.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 waktu maksimum yang dibenarkan (senario terburuk) untuk memenuhi syarat, iaitu 10 saat dalam kes ini.

Di dalam sehingga () sekatan, jangkaan_kondisi.kehadiran_of_elemen_lokasi () kaedah digunakan untuk memastikan bahawa elemen itu 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 cap unixtimestamp.com dicetak di 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.NAMA - 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 a (sauh) teg HTML.

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

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

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 tersebut 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_element_located (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 sama ada elemen yang terletak di pencari kelihatan dan boleh diklik. The pencari ialah (Oleh, pemilih) tupel.

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

alert_is_present () - mengharapkan dialog amaran hadir di halaman.

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

Kesimpulan:

Dalam artikel ini, saya telah membincangkan penantian Selenium yang tersirat dan eksplisit. Saya juga telah menunjukkan kepada anda cara bekerja dengan penantian yang tersirat dan eksplisit. 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 halaman Dokumentasi menunggu Selenium Python Library.

Cara Menunjukkan Kaunter FPS dalam Permainan Linux
Permainan Linux mendapat dorongan utama ketika Valve mengumumkan sokongan Linux untuk klien Steam dan permainan mereka pada tahun 2012. Sejak itu, ban...
Cara memuat turun dan Mainkan Sid Meier's Civilization VI di Linux
Pengenalan permainan Civilization 6 adalah konsep moden mengenai konsep klasik yang diperkenalkan dalam siri permainan Age of Empires. Idea itu cukup ...
Cara Memasang dan Memainkan Doom di Linux
Pengenalan Doom Seri Doom berasal dari tahun 90an selepas pembebasan Doom yang asal. Ini adalah hit seketika dan sejak saat itu dan seterusnya siri pe...