我目前正在阅读一本 Django/TDD 简介书籍,但遇到了 StaleElementReferenceException 并陷入困境。我一直在谷歌上搜索并在 StackOverflow 中寻找解决我的错误的方法,但我无法解决它。我的相关代码如下:
功能测试.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 语句中。
首页.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>
本书让我输入的原始代码已被注释掉(减去隐式等待)。在我之前阅读这本书时,代码工作没有问题,但我一直收到这个 StaleElement 错误,并且无法找到解决它的方法。有人有什么建议吗?
首先我想指出,隐式等待并不是很多人想象的那样。在您的代码中,看起来您正在将其用作一种睡眠 - 但事实远非如此。如果找不到元素,隐式等待只会在这段时间内再次尝试。如果第一次至少找到一个,则没有效果。设置一次就足够了,然后在整个会话期间对每个元素查找都有效。但不宜用于等待特殊情况。
这里似乎发生了以下情况(某种竞争条件):
- 你按回车键
- 在页面更新之前,驱动程序会查找所有当前可用的元素
- 您尝试循环遍历元素,但页面同时更新,使您之前的查找无效。
这一切都发生在不到一秒的时间内。
您可以在按 Enter 键后使用实际睡眠(不是推荐的解决方案,但为了实验它有效),或者您可以等待实际操作发生/完成。 (例如,您可以使用自定义条件来计算当前行数,并等待行数发生变化,或者使用 JavaScript 等待所有发布请求完成。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)