使用Selenium Webdriver向下滚动页面

时间:2014-02-13 11:38:29

标签: python selenium selenium-webdriver

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

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

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

3 个答案:

答案 0 :(得分:8)

您可以使用以下代码行轻松执行此操作

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)

确定time.sleep(x值)导致加载数据我需要更长时间..或更少.. 有关详细信息,请查看official Doc page

玩得开心:)

答案 1 :(得分:2)

我认为你可以将你的代码压缩到这个:

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 )。

我还抛出了睡眠和打印陈述 - 我不确定它们的用途是什么,但在我自己的页面上,我发现无论是否在卷轴之间睡眠,都会加载相同数量的元素。此外,在我自己的情况下,我不需要在任何时候知道计数,我只需要知道它何时耗尽了列表(但我添加了一个返回变量,这样你可以获得最终计数,如果你碰巧需要它。如果你真的想要打印中间计数,你可以在循环中分配后立即打印当前。

答案 2 :(得分:1)

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

  • 如上所述向下滚动
  • 等几秒钟
  • 保存页面源的大小(xxx.page_source)
  • 如果页面源的大小大于保存的最后一页源大小,则循环返回并向下滚动一些

我认为截图大小也可以正常工作,具体取决于您正在加载的页面,但这在我当前的程序中有效。