使用Selenium Webdriver向下滚动页面

Sah*_*heb 7 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
Run Code Online (Sandbox Code Playgroud)

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

Ayo*_*oub 8

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

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
Run Code Online (Sandbox Code Playgroud)

如果你想向下滚动,你应该试试这个.

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)
Run Code Online (Sandbox Code Playgroud)

不能肯定time.sleep(x值)原因加载数据我需要更长的时间..以下..了解更多信息请查看官方文档页面

玩得开心 :)


Art*_*are 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
Run Code Online (Sandbox Code Playgroud)

我通过将所有相同的行移至循环中来消除所有相同的行,这需要将循环设为 awhile True:并将条件检查移至循环中(因为不幸的是,Python 缺少 any do-while)。

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