我正在编写代码来使用Selenium浏览网站(在测试我们的网站之前进行实践)。我正在尝试在3个单独的下拉菜单中迭代值,并检索包含产品数据的结束页。
到目前为止,我能够打印第一个菜单中的数据和第二个菜单中的相关数据,但仅限于第一个菜单创建的列表中的第一个元素......这可能很难理解,所以考虑这个例子:
DropdownA包含值:
一个 乙 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家伙......)。
非常感谢任何帮助,建议,解决方案,资源等。
提前致谢!
答案 0 :(得分:3)
最终,它听起来像你正在迭代的DOM元素不再存在。你可能会问,怎么会发生这种情况?我相信问题出现在以下问题中:您通过调用以下方式获取下拉列表中的所有标记:
driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_pc_selector_selMake option')
然后,您将迭代每个标记并单击每个标记。我最好的猜测是每次点击时都可以重新生成下拉列表,从而使您正在迭代的对象无效。因此成功的第一次迭代,但此后的每次迭代都呈现不成功。
希望这有帮助!