2012-10-11 99 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') 

你然后再遍历每个标签并点击每个。我最好的猜测是,每次单击它时可能会重新生成下拉列表,因此使您正在迭代的对象无效。因此,成功的第一次迭代,但其后每次迭代呈现不成功。

希望这会有所帮助!

相关问题