#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 элементов из списка, а остальные будут динамически добавлены, когда пользователь прокручивает вниз.