迭代Select选项时的Python Selenium StaleElementReferenceException

时间:2016-12-12 18:20:41

标签: jquery python selenium

我的任务是在网页上提供一个selenium测试(使用Python),我没有编写源代码(我对Web开发知之甚少,但据我所知,它是用D3和JQuery)。该网站生成图表,并有一些带有选项的下拉菜单。我正在尝试使用这些选项创建每个可能的图形。为此,我从下拉菜单WebElement中创建一个Select对象,并在下拉列表中提取每个选项的文本。稍后,我使用此文本以递归方式遍历每个下拉列表并输入每个有效选项以生成图形。但是,我有时(并不总是,似乎相对随机)在尝试提取此选项列表时遇到StaleElementReferenceException,这是因为下面的代码(它发生在options.append(op.get_attribute("text"))行)。我一直在寻找关于这个例外的先前问题和文档,我还没有找到答案而不是帮助我。

#find all of the options 
# create list of string options before, so as to avoid StaleElementReferenceException's
# as much as possible
el = driver.find_element(By.ID,node.element)
d = Select(el)
options = [] 
for op in d.options:
    try:
        options.append(op.get_attribute("text"))
    except StaleElementReferenceException:
        print >>sys.stderr, 'StaleElementReferenceException getting text from \'' + node.element + '\' element'

任何输入都非常有用!谢谢。

编辑:以下是其中一个下拉菜单的HTML代码段示例:

<select class="dropdown" id="datatype" name="datatype" style="display: none;">
    <option value="solar_radiation" selected="selected">solar radiation</option>
    <option value="windspeed">windspeed</option>
    <option value="airtemperature">airtemperature</option>
    ...
</select>

2 个答案:

答案 0 :(得分:1)

我怀疑d = Select(el)

如果您只想获取所有文本,也许您可​​以这样做:

optionNodes = driver.find_element_by_id("datatype").find_elements_by_tag_name("option")
options = []
for op in optionNodes:
    options.append(op.get_attribute("text"))

如果上面的代码不起作用(虽然很奇怪),也许你可以尝试执行脚本,例如:

driver.execute_script("return Array.apply(null, document.getElementById('datatype').options).map(function (option) {return option.text})");

答案 1 :(得分:1)

一个肮脏的解决方法是使用索引迭代选项列表,并在遇到异常时重新填充列表

el = driver.find_element(By.ID,node.element)
select = Select(el)
options = select.options
options_texts = []
for i in range len(options)):
try:
    options_texts.append(options[i].get_attribute("text"))
except StaleElementReferenceException:
    el = driver.find_element(By.ID,node.element)
    select = Select(el)
    options = select.options