Как проскроллить элемент в 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)