2015-04-01 58 views
1

我認爲那些瞭解硒工具的人現在會笑,但也許你可以分享你的知識,因爲現在真的也想笑。使用selenium和python迭代結果頁面:StaleElementReferenceException

我的代碼是這樣的:

def getZooverLinks(country): 

    global countries 
    countries = country 

    zooverWeb = "http://www.zoover.nl/" 
    url = zooverWeb + country 

    driver = webdriver.Firefox() 
    driver.get(url) 

    button = driver.find_element_by_class_name('next') 

    links = [] 

    for page in xrange(1,4): 
     WebDriverWait(driver, 60).until(lambda driver :driver.find_element_by_class_name('next')) 
     divList = driver.find_elements_by_class_name('blue2') 
     for div in divList: 
      hrefTag = div.find_element_by_css_selector('a').get_attribute('href') 
      print(hrefTag) 
      newLink = zooverWeb + hrefTag 
      links.append(newLink) 

      button.click() 
      driver.implicitly_wait(10) 

     time.sleep(60) 
    return links 

所以我想遍歷所有結果頁面,並始終得到的div具有類=「藍色2」的鏈接,然後按照「下一步」 - 鏈接到進入下一個結果頁面。 但我總是得到一個StaleElementReferenceException說: 「消息:元素不在緩存中發現 - 也許是頁面發生了變化,因爲它是擡頭」

但是頁面的佈局始終是相同的。那麼這裏有什麼問題?自頁面變化以來,點擊後的網址是否未傳遞給驅動程序?我怎樣才能做到這一點?

+0

類似的問題 - http://stackoverflow.com/questions/17972359/selenium-webdriver-with-java-element-not-found-in-the-cache-perhaps-the-page – LittlePanda 2015-04-01 14:26:49

+0

感謝您的提示。我在for循環中包含了按鈕= ...,它工作完美! – steph 2015-04-01 14:34:19

回答

1

在這個特定的網站上按照分頁有點棘手。

下面是一套東西,幫助我克服StaleElementReferenceException問題:

  • 找到迴路中的元素,因爲頁面改變
  • 使用Explicit Waits等待具體頁碼變得活躍

工作代碼:

from selenium import webdriver 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 

country = "albanie" 
zooverWeb = "http://www.zoover.nl/" 

url = zooverWeb + country 

driver = webdriver.Firefox() 
driver.get(url) 
driver.implicitly_wait(10) 

links = [] 
for page in xrange(1, 4): 
    # tricky part - waiting for the page number on the top to appear 
    if page > 1: 
     WebDriverWait(driver, 60).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, 'div.entityPagingTop strong'), str(page))) 
    else: 
     WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.CLASS_NAME, 'next'))) 

    divList = driver.find_elements_by_class_name('blue2') 
    for div in divList: 
     hrefTag = div.find_element_by_css_selector('a').get_attribute('href') 
     newLink = zooverWeb + hrefTag 
     links.append(newLink) 

    driver.find_element_by_class_name("next").click() 

print links 
+0

這工作得很好。你能告訴我你在if語句中做了什麼嗎? – steph 2015-04-01 14:38:13

+0

@StefanieBeutke是的,基本上我們正在等待當前頁碼在分頁塊中顯示爲「強」 - 這很好地表明頁面已更改。如果這是第一頁,我們不需要檢查頁碼 - 在這種情況下,我們只需等待「下一步」按鈕出現。希望這是有道理的。 – alecxe 2015-04-01 14:40:10

+0

這很酷。我不知道強大的事情。萬分感謝 – steph 2015-04-01 14:42:55

相關問題