Saya ingin mengikis semua data halaman yang diimplementasikan oleh gulir yang tak terbatas. Kode python berikut berfungsi.
for i in range(100):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
Ini berarti setiap kali saya gulir ke bawah, saya harus menunggu 5 detik, yang umumnya cukup bagi halaman untuk menyelesaikan pemuatan konten yang baru dibuat. Tapi, ini mungkin tidak efisien waktu. Halaman mungkin selesai memuat konten baru dalam 5 detik. Bagaimana saya bisa mendeteksi apakah halaman selesai memuat konten baru setiap kali saya gulir ke bawah? Jika saya dapat mendeteksi ini, saya dapat menggulir ke bawah lagi untuk melihat lebih banyak konten setelah saya tahu halaman selesai memuat. Ini lebih efisien waktu.
python
selenium
execute-script
apogne
sumber
sumber
Jawaban:
The
webdriver
akan menunggu halaman untuk beban secara default melalui.get()
metode.Karena Anda mungkin mencari beberapa elemen spesifik seperti yang dikatakan @ user227215, Anda harus menggunakan
WebDriverWait
untuk menunggu elemen yang terletak di halaman Anda:Saya telah menggunakannya untuk memeriksa peringatan. Anda dapat menggunakan metode tipe apa pun lainnya untuk menemukan locator.
EDIT 1:
Saya harus menyebutkan bahwa
webdriver
akan menunggu halaman dimuat secara default. Itu tidak menunggu memuat frame di dalam atau untuk permintaan ajax. Itu berarti ketika Anda menggunakan.get('url')
, browser Anda akan menunggu sampai halaman dimuat sepenuhnya dan kemudian pergi ke perintah selanjutnya dalam kode. Tetapi ketika Anda memposting permintaan ajax,webdriver
jangan menunggu dan itu adalah tanggung jawab Anda untuk menunggu waktu yang sesuai untuk halaman atau bagian dari halaman untuk memuat; jadi ada modul bernamaexpected_conditions
.sumber
browser.find_element_by_id('IdOfMyElement')
menyebabkan aNoSuchElementException
dinaikkan. The dokumentasi mengatakan untuk lulus tuple yang terlihat seperti ini:(By.ID, 'IdOfMyElement')
. Lihat jawaban sayaclick()
), membaca teks dari dll. Saya berada di bawah kesan yang salah bahwa itu hanya menyebabkan menunggu, setelah itu kamu masih harus menemukan elemen. Jika Anda menunggu, kemudian menemukan elemen setelahnya, selenium akan error karena mencoba mencari elemen sementara menunggu lama masih diproses (mudah-mudahan itu masuk akal). Intinya adalah, Anda tidak perlu menemukan elemen setelah menggunakan WebDriverWait - itu sudah menjadi objek.Mencoba meneruskan
find_element_by_id
ke konstruktor untukpresence_of_element_located
(seperti yang ditunjukkan dalam jawaban yang diterima ) menyebabkanNoSuchElementException
dimunculkan. Saya harus menggunakan sintaks dalam komentar fragles ' :Ini cocok dengan contoh dalam dokumentasi . Berikut ini tautan ke dokumentasi untuk oleh .
sumber
EC.presence_of_element_located((By.XPATH, "//*[@title='Check All Q1']"))
By
objek.Temukan 3 metode di bawah ini:
readyState
Memeriksa halaman readyState (tidak dapat diandalkan):
id
Membandingkan id halaman baru dengan yang lama:
staleness_of
Menggunakan
staleness_of
metode:Untuk lebih jelasnya, periksa blog Harry .
sumber
self.driver.execute_script('return document.readyState;')
tidak dapat diandalkan? Tampaknya berfungsi dengan baik untuk kasus penggunaan saya, yang sedang menunggu file statis untuk dimuat di tab baru (yang dibuka melalui javascript di tab lain, bukan .get ()).Seperti yang disebutkan dalam jawaban dari David Cullen , saya selalu melihat rekomendasi untuk menggunakan baris seperti berikut:
Sulit bagi saya untuk menemukan di suatu tempat semua kemungkinan pelacak yang dapat digunakan dengan
By
, jadi saya pikir akan bermanfaat untuk memberikan daftar di sini. Menurut Web Scraping with Python oleh Ryan Mitchell:sumber
Dari selenium / webdriver / support / wait.py
sumber
Di samping catatan, alih-alih menggulir ke bawah 100 kali, Anda dapat memeriksa apakah tidak ada lagi modifikasi pada DOM (kami dalam kasus bagian bawah halaman menjadi malas-malas AJAX)
sumber
Sudahkah Anda mencoba
driver.implicitly_wait
. Ini seperti pengaturan untuk driver, jadi Anda hanya memanggilnya sekali dalam sesi dan pada dasarnya memberitahu pengemudi untuk menunggu jumlah waktu yang diberikan sampai setiap perintah dapat dieksekusi.Jadi, jika Anda menetapkan waktu tunggu 10 detik, perintah itu akan dieksekusi sesegera mungkin, tunggu 10 detik sebelum menyerah. Saya telah menggunakan ini dalam skenario gulir-turun yang sama, jadi saya tidak melihat mengapa itu tidak berfungsi dalam kasus Anda. Semoga ini bisa membantu.
Untuk dapat memperbaiki jawaban ini, saya harus menambahkan teks baru. Pastikan untuk menggunakan huruf kecil 'w' dalam
implicitly_wait
.sumber
Bagaimana menempatkan WebDriverWait di loop Sementara dan menangkap pengecualian.
sumber
Di sini saya melakukannya menggunakan formulir yang agak sederhana:
sumber
Anda dapat melakukannya dengan sangat sederhana dengan fungsi ini:
dan ketika Anda ingin melakukan sesuatu setelah pemuatan halaman selesai, Anda dapat menggunakan:
sumber