我目前正在阅读Django / TDD书的介绍,我遇到了StaleElementReferenceException并被卡住了。我一直在谷歌上搜索StackOverflow以寻找我的错误的解决方案,但我无法解决它。我的相关代码如下:
functional_tests.py
inputbox.send_keys(Keys.ENTER)
self.browser.implicitly_wait(3)
table = self.browser.find_element_by_id('id_list_table')
#rows = table.find_elements_by_tag_name('tr')
rows_ref = lambda: table.find_elements_by_tag_name('tr')
#self.browser.implicitly_wait(3)
foundBuy = False
for row in rows_ref():
self.browser.implicitly_wait(3)
rows_text = row.text
if (rows_text == '1: Buy peacock feathers'):
foundBuy = True
break
if not (foundBuy):
self.fail('Could not find "1: Buy peacock feathers" in rows\' text')
#self.assertIn('1: Buy peacock feathers', [row.text for row in rows_ref()])
上述代码中的“rows_text = row.text”代码行发生错误。在我的原始代码中,它出现在底部注释掉的self.assertIn语句中。
home.html的
<html>
<head>
<title>To-Do lists</title>
</head>
<body>
<h1>Your To-Do list</h1>
<form method="POST">
<input name="item_text" id="id_new_item" placeholder="Enter a to-do item"/>
{% csrf_token %}
</form>
<table id="id_list_table">
{% for item in items %}
<tr><td>{{ forloop.counter }}: {{ item.text }}</td></tr>
{% endfor %}
</table>
</body>
</html>
本书输入的原始代码已注释掉(减去一个implicity_wait)。在我之前的这本书中,代码没有问题,但我一直在不停地得到这个StaleElement错误,并且无法找到一种方法来解决它。有人有什么建议吗?
答案 0 :(得分:1)
首先,我想指出隐含的等待并不是很多人认为的。在你的代码中看起来你正在使用它作为一种睡眠 - 但它远非如此。如果无法找到元素,则隐式等待只会再次尝试这个秒数。如果它第一次找到至少一个,则没有效果。设置一次就足够了,然后在整个会话期间对每个元素查找都有效。但它不适合用于等待特殊情况。
这里似乎发生的是以下(种类条件):
这一切都发生在几分之一秒内。
按Enter键后可以使用实际的睡眠状态(不是推荐的解决方案,但是可以进行实验)或者您可以等待实际操作发生/完成。 (例如,您可以使用自定义条件来计算当前行数,并等待它更改,或使用等待所有发布请求完成的javascript。)