2014-02-13 60 views
7

我有一个动态页面,当用户向下滚动页面时加载产品。我想获取显示页面上呈现的产品总数。目前我正在使用下面的代码,直到显示所有产品。使用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 

这是工作得很好,只是我想知道是否有这样做的更好的选择吗?

+0

大概有一个终端会在适当的滚动发生时被调用......您可以用滚动以外的其他方式操作它吗? –

+0

可能重复[滚动元素到视图与硒](http://stackoverflow.com/questions/3401343/scroll-element-into-view-with-selenium) –

+0

@Erki M.我想这个问题有点不同从你们所指的那一个。另外我需要一个Python解决方案。 [我对Java的硒并无任何想法]。我试图在该帖子中使用JavaScript。但它不起作用。错误:“WebDriverException:消息:u'html未定义'” – Saheb

回答

1

我想你可以下来凝结您的代码如下:

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)。我也不知道他们的目的是什么,但是在我自己的页面上,我发现相同数量的元素加载我是否在卷轴之间进行睡眠。此外,在我自己的情况下,我不需要知道任何点的计数,我只需要知道它何时已经用尽了列表(但我添加了一个返回变量,因此如果碰巧遇到了最终计数如果你真的想要打印任何中间计数,你可以在循环中分配它之后立即打印当前的电流

1

如果你不知道有多少元素可以被添加到页面中,但你只想得到上述

  • 等待几秒钟
  • 保存S作为描述

    • 向下滚动:所有的人,这可能是件好事正是如此循环IZE页面源(xxx.page_source)
    • 如果网页的源文件的大小比最后保存的网页源代码的大小,环较大的背,然后向下滚动一些更

    我猜想截图大小可能工作这也取决于你正在加载的页面,但这是在我目前的程序中工作。

  • 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

    玩得开心:)

    +0

    最后,一直在这一段时间工作。我有这个确切的脚本,但没有在循环中,但仍然有一个“睡眠(3)”,我想这只是第一页的底部,已经显示了......所以,谢谢@Ayoub!顺便说一下,有些网站可能足够大,以至于你可能会永久加载(即Twitter),所以在范围(0,100,1):或者其他情况下做一个更小的while语句可能会更聪明! – ntk4

    +0

    不客气@ ntk4我很高兴我帮你:) – Ayoub

    相关问题