2

我正在编写代码来使用 Selenium 浏览网站(作为测试我们网站之前的练习)。我正在尝试迭代 3 个单独的下拉菜单中的值并检索带有产品数据的结束页面。

到目前为止,我能够打印第一个菜单中的数据和第二个菜单中的关联数据,但仅限于第一个菜单创建的列表中的第一个元素......这可能很难理解,所以考虑这个例子:

DropdownA 包含值:

A B C D

选择“A”时,DropdownB 将填充值:

1 2 3

我的目标是覆盖整个树并返回值:

A - 1,2,3

B - 2,3,4

C - 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'

我对 Selenium 很陌生,所以如果这是一个愚蠢的问题,请原谅我。我花费的时间比我愿意承认尝试任何想到的任何事情都多,或者我在网上阅读过并且没有任何帮助(部分原因是我遇到的大多数示例都是用 Java 编写的,而且我我不是 Java 人...)。

非常感谢任何帮助、建议、解决方案、资源等。

提前致谢!

4

1 回答 1

3

最终,听起来您正在迭代的 DOM 元素不再存在。你可能会问,这怎么可能发生?我认为问题出现在以下方面:您通过调用以下命令来获取下拉列表中的所有标签:

driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_pc_selector_selMake option')

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

希望这可以帮助!

于 2012-10-11T16:29:27.047 回答