如何使用 Python Selenium 在 Facebook 主页中滚动子菜单

How To Scroll a Sub Menu in a Main Facebook Page Using Python Selenium

提问人:Ace 提问时间:10/3/2023 最后编辑:Michael MintzAce 更新时间:10/4/2023 访问量:43

问:

我想在 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)

  • EventFiringWebDrivercss selector

  • 使用所有 div 类名按 XPATH 查找它们

python selenium-webdriver 网络自动化

评论


答:

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 看到该元素,就会打破循环。