【问题标题】:Scrolling down a page with Selenium Webdriver使用 Selenium Webdriver 向下滚动页面
【发布时间】:2014-02-13 11:38:28
【问题描述】:

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

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

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

【问题讨论】:

  • 大概有一个端点在合适的滚动发生时被调用......你能以滚动以外的方式操作它吗?
  • @Erki M. 我想这个问题与你们所指的问题有点不同。另外,我需要一个 Python 解决方案。 [我对 Java 中的硒一无所知]。我尝试在那篇文章中使用javascript。但它不起作用。错误:“WebDriverException:消息:u'html 未定义'”

标签: python selenium selenium-webdriver


【解决方案1】:

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

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 value) 会导致加载数据需要更长时间.. 或更少.. 更多信息请查看official Doc page

玩得开心:)

【讨论】:

  • 终于,在这方面工作了一段时间。我有这个确切的脚本,但没有循环使用它,但那里仍然有一个sleep(3),我猜它只会到第一页的底部,已经显示了什么......所以,谢谢@阿尤布!顺便说一句,有些网站可能足够大,您可能会永远加载(即 twitter),因此创建更小的 while 语句 while i in range(0,100,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)。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      相关资源
      最近更新 更多