web-dev-qa-db-fra.com

Comment faire défiler une page Web à l'aide de Selenium WebDriver en python?

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.

92
user2523364

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
178
OWADVL

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

59
Cuong Tran

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)

18
lukeis
from Selenium.webdriver.common.keys import Keys
html = browser.find_element_by_tag_name('html')
html.send_keys(Keys.END)

testé, ça marche

15
LIU YUE
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.

11
premonition

Voici comment vous faites défiler la page Web:

driver.execute_script("window.scrollTo(0, 1000);")
6
sahaja nadendla

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

6
Nick Brady

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
4
Bass Dee

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
3
Vinay Verma

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
3
Splarty

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!

3
Juanse

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.

1
AlbertWolfgang

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()
0
ashishmishra