2014-02-13 102 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

    相關問題