因此,在运行完全相同的测试时,我经常会收到此错误。
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元素(例如搜索字段)时。我正在使用SeleniumLibrary和自定义库的混合,通过ROBOT自动化框架来运行它。
我已经读到它听起来很简单,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")
答案 0 :(得分:0)
当SE找到一个元素,但是不久之后,某个东西(一个JS函数)对其进行了更改-将该对象从DOM中删除/重新排列,或者对其属性进行了重大更改,因此出现异常,因此不再将其作为同一元素进行跟踪。
这是因为SE建立了DOM的内部缓存,该缓存可能与实际的缓存不同步。因此名称为“陈旧的”-埃尔。已以某种状态缓存,但其实际形式现在有所不同。
问题很普遍,有一个特定的SO标签-https://stackoverflow.com/questions/tagged/staleelementreferenceexception(我自己对此感到惊讶)。
常见的解决方案是:
WebElement
对象中,对于robotframework而言并非如此)