【问题标题】:Selenium Python Script, InvalidElementStateExceptionSelenium Python 脚本,InvalidElementStateException
【发布时间】:2019-03-22 06:52:26
【问题描述】:

因此,在运行完全相同的测试时,我经常会遇到此错误。

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=69.0.3497.100)
(Driver info: chromedriver=2.41.578706 (5f725d1b4f0a4acbf5259df887244095596231db),platform=Mac OS X 10.12.6 x86_64)

唯一的问题是它似乎在代码的不同区域发生不一致。这是在尝试访问我的 ReactJS 页面的 DOM 元素(例如搜索字段)时。我通过 ROBOT 自动化框架运行它,混合使用 SeleniumLibrary 和自定义库。

我读到这听起来很简单,xPath 在 DOM 上已经过时了,但这并不能帮助我弄清楚为什么它几乎在任何时候都会发生不一致的错误。

编辑:这似乎发生在:

def filter_modality(self, filter):
    filter_value = '//span[@title="{}"]//parent::li'.format(filter)

    self.selib.click_element(filter_locator)
    self.selib.wait_until_page_contains_element('//*[@class="multi-selector-options open"]')

    self.selib.wait_until_element_is_visible(filter_value)
    self.selib.click_element(filter_value )
    self.selib.wait_until_page_contains_element('//div...[@class="option selector-item active"]',
                                                error=("Could not select filter: {}".format(filter_value )))

    #I get the stale element message from or after executing this click_element
    self.selib.click_element(filter_locator)
    self.selib.wait_until_page_does_not_contain_element('//*[@class="multi-selector-options open"]', 
                                                        error="Filter dropdown did not disappear after selection")

【问题讨论】:

  • 你的测试用例中有没有等待方法?如果您将部分代码分享给我们,那就太好了。
  • 您能否发布一个示例,说明是哪一行机器人代码导致了此问题?您是否使用一个关键字获得对元素的引用,然后尝试在第二个关键字中对该元素执行某些操作?
  • 我发布了一个 sn-p。我通常以这种风格做事,因为页面有时会有点慢。但是无论加载速度如何,我都看不到页面可以重新创建任何元素或类似的东西导致我引用的元素变得陈旧。再一次,这个问题是不一致的,这使得它更加令人沮丧。

标签: python-2.7 selenium selenium-webdriver robotframework


【解决方案1】:

当 SE 找到一个元素时出现异常,但不久之后某些东西(一个 JS 函数)改变了它 - 从 DOM 中删除/重新排列它,或者显着改变了它的属性,所以它不再被跟踪为同一个元素.
这是因为 SE 构建了 DOM 的内部缓存,这可能与实际缓存不同步;因此名称“陈旧” - el。以某种状态缓存,但它的实际形式现在不同了。

问题很常见,它有一个特定的 SO 标签 - https://stackoverflow.com/questions/tagged/staleelementreferenceexception(我自己对此感到惊讶)。

常见的解决方案有:

  • 在您知道会导致问题的事件之前睡几秒钟
  • 在使用之前重新获取元素(如果您将对其的引用存储在 WebElement 对象中,robotframework 并非如此)
  • 在使用您知道可能导致执行的元素时具有重试机制
  • 吞下异常并继续前进(我已经在几个地方完成了它,其中元素只是确认操作已执行 - 它已被 SE 显示/找到一次,之后我不在乎它是在 DOM 中更改)

【讨论】:

  • 我理解异常的含义,但我只是不明白为什么它会不一致地发生。感谢那个页面,我不知道这个错误有一个特定的。另外,对于您的观点: 1. 我真的很讨厌需要添加硬编码睡眠的想法,所以如果可能的话会避免这种情况 2. 我如何重新获得一个元素?由于我似乎只是在检查给定的 xPath 是否仍然存在或不存在,所以我假设它会重新遍历 DOM 以查看它是否存在,而不是保存它的缓存。 3. 由于不一致,很难确定到底发生在哪里。
猜你喜欢
  • 2018-05-26
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2019-05-17
  • 2017-10-12
  • 2015-06-05
  • 2020-10-20
  • 2013-08-14
相关资源
最近更新 更多