使用Selenium Webdri向下滚动页面

2024-10-02 08:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个动态页面,当用户向下滚动页面时加载产品。我想得到在显示页面上呈现的产品总数。目前,我正在使用以下代码,以达到底部,直到所有的产品都被显示。

elems = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "x")))
print len(elems)
a = len(elems)
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(4)
elem1 = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "x")))
b = len(elem1)
while b > a:
    self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(4)
    elem1 = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "x")))
    a = b
    b = len(elem1)
print b

这很有效,但我想知道是否有更好的选择?


Tags: ofselflen产品driver页面elementsall
3条回答

如果您不知道页面中可能添加了多少元素,但您只想获取所有元素,那么最好循环如下:

  • 如上所述向下滚动
  • 等几秒钟
  • 保存页面源的大小(xxx.page\u source)
  • 如果页源的大小大于上次保存的页源大小,则返回并向下滚动一些页源

我想屏幕截图的大小也可以很好地工作,这取决于你正在加载的页面,但这是在我当前的程序工作。

我想你可以把代码压缩成这样:

prior = 0
while True:
    self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    current = len(WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "x"))))
    if current == prior:
        return current
    prior = current

我把所有相同的行都移到循环中,这就需要使循环成为一个while True:,并将条件检查移到循环中(因为不幸的是,Python缺少任何do-while)。

我还抛出了sleep和print语句——我不确定它们的目的是什么,但在我自己的页面上,我发现无论我是否在滚动条之间睡眠,加载的元素数量都是相同的。此外,在我自己的例子中,我不需要知道在任何时候的计数,我只需要知道它何时耗尽了列表(但是我添加了一个返回变量,以便您可以得到最终的计数,如果您碰巧需要它的话)。如果您真的想打印中间计数,可以在循环中分配当前计数后立即打印。

您可以使用这一行代码轻松地执行此操作

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

如果你想永远向下滚动,你应该试试这个。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Firefox()
driver.get("https://twitter.com/BarackObama")

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)

我对时间没有把握。睡眠(x值)导致加载数据的时间更长。。或者更少。。 有关详细信息,请检查official Doc page

玩得开心:)

相关问题 更多 >

    热门问题