提问人:Ace 提问时间:10/3/2023 最后编辑:Michael MintzAce 更新时间:10/4/2023 访问量:43
如何使用 Python Selenium 在 Facebook 主页中滚动子菜单
How To Scroll a Sub Menu in a Main Facebook Page Using Python Selenium
问:
我想在 Messenger 网页版中滚动聊天列表,但无法让它正常工作。这是我的代码:
chatList = driver.find_elements(By.XPATH,'//div[@class="x1n2onr6"]')
for chat in chatList:
driver.execute_script("arguments[0].scrollIntoView();", chat)
我尝试了各种方法,例如:
driver.execute_script(f"arguments[0].scrollTop = arguments[0].scrollHeight",list)
EventFiringWebDriver
用css selector
使用所有 div 类名按 XPATH 查找它们
答:
0赞
Isaac Stewart
10/3/2023
#1
因此,我认为这里正在发生的事情是,没有新的值可以滚动到视图中。当您在聊天列表上运行 for 循环时,它将仅在第一个实例中找到的元素上运行。
为了解决这个问题,你必须在while循环中运行一个for循环。
首先,您必须确保聊天列表是包含包含文本的子元素的区域。
from time import sleep
recheck_limit = 3
while True:
try:
# Search through a scroll wrapper and get descendants
chatList = driver.find_elements(By.XPATH,'
[GET THE SCROLL AREA]/descendant:://div[@class="x1n2onr6"]')
except NoSuchElementException:
break
try:
# check if chatlist has repeated and break loop if it has.
if last_set == chatList:
recheck_limit -= 1
sleep(0.5)
continue
if recheck_limit == 0:
break
except UnboundLocalError as em:
pass
for chat in chatList:
print(chat)
try:
driver.implicitly_wait(5)
chat = driver.execute_script("arguments[0].scrollIntoView();", chat)
except StaleElementReferenceException:
pass
# save chatlist to last_set variable (to check if repeated.)
last_set = chatList
这在过去对我有用。
评论
0赞
Ace
10/4/2023
这有效,但是有没有办法让它继续滚动直到满足某个条件,我不知道它是否崩溃,但它似乎只滚动了 2 页。非常感谢,我从早上开始就一直在努力
0赞
Isaac Stewart
10/4/2023
当它崩溃时,你会得到什么异常。您可以添加隐式等待,我将对代码进行一些编辑。
0赞
Ace
10/4/2023
没有错误,它只是在一定次数的聊天后停止。我希望它滚动到底部并继续加载更多内容。
0赞
Isaac Stewart
10/4/2023
如果您没有收到任何异常。元素的加载速度可能不够快。这将导致相同的元素被废弃并运行 (if last_set == chatList: break) 语句。
0赞
Isaac Stewart
10/4/2023
另一种选择是找到一个保证位于聊天列表末尾的元素,一旦 selenium 看到该元素,就会打破循环。
评论