当前位置: 首页 > 知识库问答 >
问题:

如何处理Selenium中的这个StaleElementReferenceException?

夹谷宜民
2023-03-14
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()])

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错误,无法找到克服它的方法。有人有什么建议吗?

共有1个答案

赵智
2023-03-14

首先,我想指出,隐含的等待并不是许多人所想的那样。在您的代码中,它看起来像是在使用它作为一种睡眠--但远非如此。如果找不到元素,隐式等待只需在此时间内再试一次。如果它第一次找到至少一个,它没有影响。设置一次就足够了,然后在整个会话期间对每个元素查找都有效。但不适用于特殊条件下的等待。

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

  • 按Enter键
  • 在更新页面之前,驱动程序会查找所有当前可用的元素
  • 尝试遍历元素,但页面同时更新,使以前的查找无效。
 类似资料:
  • 我试图将我的fetch查询的响应状态打印到控制台(以便以后处理那些边缘情况)。但是,唯一有效的console.log调用是“违规”函数中的调用。当帐户存在于HIBP数据库中时,我没有收到任何错误,但是当帐户不在数据库中时,我收到“请求失败:类型错误:响应. json不是json的函数”错误。我做错了什么?我从Google Web Dev文章中获得了错误处理代码。

  • 本文向大家介绍如何在Java中处理Selenium中的代理?,包括了如何在Java中处理Selenium中的代理?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助PROXY类在Java中使用Selenium处理代理。

  • 本文向大家介绍如何使用python处理Selenium中的帧?,包括了如何使用python处理Selenium中的帧?的使用技巧和注意事项,需要的朋友参考一下 我们可以处理Selenium中的帧。框架是一个HTML元素,用于将文档保留在页面中的另一个文档中。HTML具有<frame>或<iframe>标记,用于将框架嵌入文档中。 Selenium中有多个API可用于框架。它们在下面列出- swit

  • 问题内容: 我使用 Selenium来 启动浏览器。如何处理要求浏览器接受证书的网页(URL)? 我重复我的问题: 当我启动 使用Selenium(Python编程语言)的浏览器(Internet Explorer,Firefox和Google Chrome)时,如何自动接受网站的证书? 问题答案: 对于Firefox,您需要将 选项设置为 : 对于Chrome,您需要添加参数 argument:

  • 问题内容: 我必须处理打印对话框(在浏览器中单击ctrl-p时出现的对话框)。我尝试了: 但这没用。我也抓不到它的窗口句柄,因为它不是窗口… 是否可以处理这些对象?如何处理? 问题答案: 不幸的是,WebDriver无法处理这些(或任何其他浏览器或OS对话框)。此外,它们在浏览器/系统/语言设置中的外观往往有所不同,因此可能没有明确的答案。您需要检测并处理所有可能的情况,以使其在任何地方都有效。您

  • 问题内容: 在这种情况下有一个under 。而且我必须选择外表去内在,并写在内在的身体上。 接下来,我必须从内部到外部出来,然后单击“确定”按钮(位于外部)。 以下是我的代码 以下是我的问题: 我的测试代码可以正常工作到第4行,即写到正文中,但是我想从内到外显示它未找到该元素。 我尝试使用索引,父母,亲戚,但没有运气。 注意: 如果我不选择内部框架()。我可以单击“确定”按钮。 问题答案: 在We