J'utilise actuellement Selenium Webdriver pour analyser la page d'amis utilisateur Facebook et extraire tous les identifiants du script AJAX. Mais je dois faire défiler pour obtenir tous les amis. Comment puis-je faire défiler dans Selenium. J'utilise python.
Vous pouvez utiliser
driver.execute_script("window.scrollTo(0, Y)")
où Y est la hauteur (sur un moniteur FullHD, c'est 1080). (Merci à @lukeis)
Vous pouvez aussi utiliser
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
faire défiler jusqu'à le bas de la page.
Si vous voulez pour faire défiler une page avec une charge infinie, comme celles des réseaux sociaux, Facebook, etc. (grâce à @Cuong Tran)
SCROLL_PAUSE_TIME = 0.5
# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# Scroll down to bottom
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
Si vous voulez défiler vers le bas de la page infinie (comme linkedin.com ), vous pouvez utiliser ce code:
SCROLL_PAUSE_TIME = 0.5
# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# Scroll down to bottom
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
Référence: https://stackoverflow.com/a/28928684/131686
même méthode que celle montrée ici :
dans python, vous pouvez simplement utiliser
driver.execute_script("window.scrollTo(0, Y)")
(Y est la position verticale vers laquelle vous souhaitez faire défiler)
from Selenium.webdriver.common.keys import Keys
html = browser.find_element_by_tag_name('html')
html.send_keys(Keys.END)
testé, ça marche
element=find_element_by_xpath("xpath of the li you are trying to access")
element.location_once_scrolled_into_view
cela m'a aidé lorsque j'ai essayé d'accéder à un "li" qui n'était pas visible.
Voici comment vous faites défiler la page Web:
driver.execute_script("window.scrollTo(0, 1000);")
Pour mon but, je voulais faire défiler plus, en gardant la position des fenêtres à l'esprit. Ma solution était similaire et utilisée window.scrollY
driver.execute_script("window.scrollTo(0, window.scrollY + 200)")
qui ira à la position actuelle de défilement y + 200
Aucune de ces réponses n'a fonctionné pour moi, du moins pas pour faire défiler une page de résultats de recherche sur Facebook, mais j'ai découvert après de nombreux tests avec cette solution:
while driver.find_element_by_tag_name('div'):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
Divs=driver.find_element_by_tag_name('div').text
if 'End of Results' in Divs:
print 'end'
break
else:
continue
Lorsque vous travaillez avec youtube, les éléments flottants attribuent la valeur "0" à la hauteur de défilement plutôt que d'utiliser "return document.body.scrollHeight" essayez d'utiliser celui-ci "return document.documentElement. scrollHeight " ajustez le temps de pause du défilement en fonction de votre vitesse Internet, sinon il ne fonctionnera qu'une seule fois, puis s'arrêtera par la suite.
SCROLL_PAUSE_TIME = 1
# Get scroll height
"""last_height = driver.execute_script("return document.body.scrollHeight")
this dowsnt work due to floating web elements on youtube
"""
last_height = driver.execute_script("return document.documentElement.scrollHeight")
while True:
# Scroll down to bottom
driver.execute_script("window.scrollTo(0,document.documentElement.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.documentElement.scrollHeight")
if new_height == last_height:
print("break")
break
last_height = new_height
Je cherchais un moyen de faire défiler une page Web dynamique et de m'arrêter automatiquement une fois la fin de la page atteinte et de trouver ce fil.
Le message de @ Cuong Tran , avec une modification principale, était la réponse que je cherchais. Je pensais que d'autres pourraient trouver la modification utile (cela a un effet prononcé sur le fonctionnement du code), d'où ce post.
La modification consiste à déplacer l'instruction qui capture la dernière hauteur de page à l'intérieur de la boucle (pour que chaque contrôle soit comparé à la hauteur de page précédente).
Donc, le code ci-dessous:
Défile continuellement vers le bas d’une page Web dynamique (
.scrollTo()
), s’arrêtant uniquement lorsque, pour une itération, la hauteur de la page reste la même.
(Il y a une autre modification, où l'instruction break est à l'intérieur d'une autre condition (dans le cas où la page 'colle') peut être supprimée).
SCROLL_PAUSE_TIME = 0.5
while True:
# Get scroll height
### This is the difference. Moving this *inside* the loop
### means that it checks if scrollTo is still scrolling
last_height = driver.execute_script("return document.body.scrollHeight")
# Scroll down to bottom
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
# try again (can be removed)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
# check if the page height has remained the same
if new_height == last_height:
# if so, you are done
break
# if not, move on to the next loop
else:
last_height = new_height
continue
Le moyen le plus simple que j'ai trouvé pour résoudre ce problème était de sélectionner une étiquette, puis d'envoyer:
label.sendKeys(Keys.PAGE_DOWN);
Esperons que ça marche!
Ce code défile vers le bas mais ne nécessite pas d'attendre à chaque fois. Il va continuellement défiler, puis s'arrêter en bas (ou timeout)
from Selenium import webdriver
import time
driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get('https://example.com')
pre_scroll_height = driver.execute_script('return document.body.scrollHeight;')
run_time, max_run_time = 0, 1
while True:
iteration_start = time.time()
# Scroll webpage, the 100 allows for a more 'aggressive' scroll
driver.execute_script('window.scrollTo(0, 100*document.body.scrollHeight);')
post_scroll_height = driver.execute_script('return document.body.scrollHeight;')
scrolled = post_scroll_height != pre_scroll_height
timed_out = run_time >= max_run_time
if scrolled:
run_time = 0
pre_scroll_height = post_scroll_height
Elif not scrolled and not timed_out:
run_time += time.time() - iteration_start
Elif not scrolled and timed_out:
break
# closing the driver is optional
driver.close()
C'est beaucoup plus rapide que d'attendre une réponse de 0,5 à 3 secondes à chaque fois, cette réponse pouvant prendre 0,1 seconde.
faire défiler les pages de chargement. Exemple: moyen, quora, etc.
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight-1000);")
# Wait to load the page.
driver.implicitly_wait(30) # seconds
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# sleep for 30s
driver.implicitly_wait(30) # seconds
driver.quit()