2012-10-11 93 views
1

我正在用Selenium編寫代碼來導航網站(如測試我們的網站之前的做法)。我試圖在3個獨立的下拉菜單中迭代值,並檢索帶有產品數據的結束頁面。到目前爲止,我可以從第一個菜單中打印數據,並從第二個菜單打印數據,但只能打印第一個菜單創建的列表中的第一個元素......這可能很難遵循,因此考慮下面的例子:Selenium - 元素不再附加到DOM - Python

DropdownA包含的值:

甲 乙 ç d

當選擇 'A',DropdownB被填充有值:

我的目標是覆蓋整個樹和返回值:

A - 1,2,3

乙 - 2,3,4-

Ç - 3,4,5

我的腳本彈回來後:

A - 1,2,3

這裏是我的代碼示例:

from pyvirtualdisplay import Display 
from selenium import webdriver 
import time 

display = Display(visible=0, size=(1024, 768)) 
display.start() 
driver = webdriver.Firefox() 
url = 'http://www.website.com' 

driver.get(url) 
driver.find_element_by_id('ctl00_ContentPlaceHolder1_pc_selector_selMake').click() 
make_list = driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_pc_selector_selMake option') 
for raw_make in make_list: 
    if 'Select' in raw_make.text: 
     continue 
    make = raw_make.text 
    print make 
    raw_make.click() 
    time.sleep(1) 

    model_list = driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_pc_selector_selModel option') 
    for raw_model in model_list: 
     if 'Select' in raw_model.text: 
      continue 
     model = raw_model.text 

     print ' ', model 

driver.close() 
display.stop() 

確切的錯誤是:selenium.common.exceptions.StaleElementReferenceException: Message: u'Element is no longer attached to the DOM'

我很新的硒,因此,如果這是一個愚蠢的問題,原諒我。我花了更多的時間,而不是承認嘗試任何想到的事情,或者我在網上閱讀並沒有任何幫助(部分原因是因爲我遇到的大多數示例都是用Java編寫的,我不是一個Java人......)。

任何幫助,建議,解決方案,資源等,非常感謝。

在此先感謝!

+0

你能告訴哪條線發生這個錯誤嗎? – Zarkonnen

+0

錯誤發生在第一個for循環的第一行。 '如果'選擇'在raw_make.text:' – That1Guy

+0

@Zarkonnen也就是說,循環中的第二個循環。代碼在第一次通過時執行得很好。 – That1Guy

回答

3

最終,聽起來像您正在迭代的DOM元素不再存在。這怎麼可能發生,你可能會問?我相信這個問題在下面出現了:你通過調用抓住一個下拉菜單中的所有標籤:

driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_pc_selector_selMake option') 

你然後再遍歷每個標籤並點擊每個。我最好的猜測是,每次單擊它時可能會重新生成下拉列表,因此使您正在迭代的對象無效。因此,成功的第一次迭代,但其後每次迭代呈現不成功。

希望這會有所幫助!

相關問題