Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何处理Selenium中的StaleElementReferenceException?_Python_Django_Selenium - Fatal编程技术网

Python 如何处理Selenium中的StaleElementReferenceException?

Python 如何处理Selenium中的StaleElementReferenceException?,python,django,selenium,Python,Django,Selenium,我目前正在阅读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') #r

我目前正在阅读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\u 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>

待办事项清单
你的待办事项清单
{%csrf_令牌%}
{items%%中的项的%s}
{{forloop.counter}}:{{item.text}
{%endfor%}

这本书让我输入的原始代码被注释掉(减去隐式等待)。在我上一次阅读这本书时,代码没有问题,但我一直不断地遇到这个StaleElement错误,无法找到克服它的方法。有人有什么建议吗?

首先,我想指出,隐含的等待并不是很多人认为的那样。在你的代码中,看起来你把它当作一种睡眠——但事实远非如此。隐式等待只是在找不到元素的情况下,在这段时间内重试。如果第一次至少找到一个,则没有效果。设置一次就足够了,然后在整个会话期间,它将对每个元素查找有效。但在等待特殊情况下不适合使用

这里似乎发生了以下情况(种族状况):

  • 你按下回车键
  • 在更新页面之前,驱动程序会找到所有当前可用的元素
  • 您试图在元素之间循环,但页面同时被更新,使以前的查找无效
这一切都发生在几分之一秒之内

您可以在按Enter键后使用实际睡眠(不是推荐的解决方案,但用于试验),也可以等待实际操作发生/完成。(例如,您可以使用一个自定义条件来计算当前行数,并等待其更改,或者使用一个javascript来等待所有post请求完成。)