【问题标题】:How to deal with this StaleElementReferenceException in Selenium?如何处理 Selenium 中的这个 StaleElementReferenceException?
【发布时间】:2017-05-09 16:35:28
【问题描述】:

我目前正在阅读 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 错误,并且无法找到解决它的方法。有人有什么建议吗?

【问题讨论】:

    标签: python django selenium


    【解决方案1】:

    首先我想指出,隐式等待并不是很多人想象的那样。在您的代码中,您似乎将其用作一种睡眠 - 但远非如此。如果找不到元素,隐式等待只是在此秒数内再次尝试。如果第一次找到至少一个,则没有效果。设置一次就足够了,然后在整个会话期间对每个元素查找都有效。但不适合用于等待特殊情况。

    这里似乎发生了以下情况(一种竞争条件):

    • 按 Enter 键
    • 在更新页面之前,驱动程序会查找所有当前可用的元素
    • 您尝试遍历元素,但页面同时更新,使您之前的发现无效。

    这一切都在几分之一秒内发生。

    您可以在按下 Enter 键后使用实际的睡眠(不是推荐的解决方案,但为了试验它有效),或者您可以等待实际操作发生/完成。 (例如,您可以使用自定义条件来计算当前行数,并等待它发生变化,或者使用 JavaScript 等待所有发布请求完成。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 2011-06-18
      • 2018-09-14
      相关资源
      最近更新 更多