Как получить список элементов, которые динамически обновляются при прокрутке?

#python #selenium #selenium-chromedriver #discord.py

Вопрос:

Я пытаюсь просмотреть список участников в discord, но этот список возвращает только 22 участника (membersidebar), я думаю, что мне нужно прокрутить вручную, чтобы этот список был полным, но я не знаю как, это мой код на Python:

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ActionChains
from selenium.webdriver.support.select import Select
import time

driver = webdriver.Chrome("H:ProgsMz's FlashProgGoogle Chromechromedriver_x86_v93.exe", options=o)

driver.get("https://discord.com/channels/753059977689694218/753059977689694222")

email = driver.find_element_by_name("email")
email.send_keys('abc@example.com')
password = driver.find_element_by_name("password")
password.send_keys('pa$word')
password.send_keys(Keys.RETURN)

membersSideBar = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "clickable-1JJAn8")))

for i in membersSideBar:
    time.sleep(2)
    driver.execute_script("arguments[0].scrollIntoView();", i)
    i.click()
 

Комментарии:

1. Я знаю, как это сделать в ruby, но не знаю, как это сделать в Python. Но если я напишу код, я думаю, вы могли бы сделать то же самое на Python. Но вы должны указать имя пользователя и пароль, чтобы увидеть раздел «Участники».

2. @Rajagopalan Меня не волнует язык Ruby, C#, NodeJS и т. Д., Я просто хочу знать механизм для этого, я могу создать одноразовую учетную запись для вас, чтобы протестировать, но, возможно, будет проще, если вы покажете мне, как это сделать на Ruby.

3. Хорошо, спасибо. Но проясни мне кое-что. Вы находите разделение что-то вроде с overflow атрибутом класса for? <div style="overflow:scroll; height:250px;">

4. Извини, я не понимаю.

5. Вы прокручиваете веб — страницу или прокручиваете таблицу?

Ответ №1:

Попробуйте что-нибудь подобное и подтвердите:

Установите переменную для отслеживания membersSideBar .

В While курсе locate the Element и держи scrolling to the ith Element .

При прокрутке membersSideBar обновляется новый список элементов.

И если больше не будет найдено элементов, list out of bound будет выдано исключение, поэтому поместите блок кода в try and except блок.

 i = 0
try:
    while True:
        membersSideBar = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "clickable-1JJAn8")))
        driver.execute_script("arguments[0].scrollIntoView(true);", membersSideBar[i])
        time.sleep(2)
        i  = 1
except:
    pass
 

Комментарии:

1. Я пробовал это, но из-за странной выборки результатов 1-й результат возвращает 22 элемента, затем при прокрутке он меняется на случайные 33, 27, 36 и т. Д., Поэтому элементы повторяются или игнорируются, возможно, это проблема только с разногласиями, мне нужно найти способ узнать, где я нахожусь, не повторять или игнорировать какой-либо элемент.

2. Хорошо, попробуйте использовать разные локаторы. Получите локатор, который выделяет все строки этой таблицы.

3. Я уверен, что локатор правильный, дело в списках, которые динамически обновляются при прокрутке, вы не можете легко получить весь список, вы можете попробовать это с боковой панелью Youtube, на которой отображаются связанные элементы, если вы отключите Интернет или прекратите прокрутку, вы не получите больше элементов, я думаю, это называется «ленивая загрузка»; веб-сайты, у которых длинный список элементов, и для повышения начальной скорости загрузки он заполнит только первые 10 или 20 элементов из списка, а остальные будут динамически добавлены, когда пользователь прокручивает вниз.