Как проскроллить элемент в selenium

В Дискорде есть список участников с полосой прокрутки, когда мы ее опускаем вниз участники на странице обновляются. Мне нужно парсить всех участников канала, Но у меня не получается скроллить этот элемент. введите сюда описание изображения


Ответы (3 шт):

Автор решения: Volkodaff

Ответ на похожий вопрос уже был дан - ТУТ.

Задача решается разными способами:

  • Вызов JavaScriptExecutor
  • Нажатие ctrl+end
  • Использование Java Robot class

Примеры

→ Ссылка
Автор решения: Rolles

Я сделал для вас рабочее решение, но оно достаточно костыльное.

Import

import time
from selenium import webdriver

Code

pathToWebdriver = ''
driver = webdriver.Chrome(executable_path=pathToWebdriver)

channelUrl = ''
driver.get(channelUrl)
time.sleep(5)


def getOnline():
    online = driver.find_elements_by_xpath('//*[@id="members-697179618699903006"]/div/h2/span')
    data = online[0].text
    data = data.split('—')
    return data[1]


def getOffline():
    while True:
        xpath = "//span[@class='roleColor-rz2vM0']"
        elements = driver.find_elements_by_xpath(xpath)
        rangeOfList = len(elements)
        driver.execute_script('arguments[0].scrollIntoView()',
                              elements[rangeOfList - 1])

        offline = driver.find_elements_by_xpath(
            '//*[@id="members-697179618699903006"]/div/h2/span')

        if offline != []:
            data = offline[0].text
            data = data.split('—')
            return data[1]


def main():
    users = []
    usersCount = int(getOnline()) + int(getOffline())
    while True:
        xpath = "//span[@class='roleColor-rz2vM0']"
        elements = driver.find_elements_by_xpath(xpath)
        rangeOfList = len(elements)
        for element in elements:
            print(element.text)
            if element.text not in users:
                users.append(element.text)
        driver.execute_script('arguments[0].scrollIntoView()',
                              elements[rangeOfList - 1])
        time.sleep(1)
        if len(users) == usersCount:
            break
    print(users)


if __name__ == '__main__':
    main()
→ Ссылка
Автор решения: Lyutenkov

Я решил свой вопрос. Я получал скроллбар и скроллил его таким образом на 1500 пикселей вниз.

Потом я обходил в цикле всех видимых участников сервера и если селениум не может найти его на странице, я скроллил список пользователей и искал участников заново по data-list-item-id:

user = driver.find_element_by_xpath(f'//div[@data-list-item-id="members-802881024991690792___{i}"]')

element_list = driver.find_element_by_xpath("/html/body/div/div[2]/div/div[2]/div/div/div/div[2]/div[2]/div[2]/div/div")

driver.execute_script("arguments[0].scrollTop = arguments[0].scrollTop + 1500", element_list)
→ Ссылка