Selenium Python脚本,InvalidElementStateException

时间:2018-10-17 14:36:27

标签: python-2.7 selenium selenium-webdriver robotframework

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

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")

1 个答案:

答案 0 :(得分:0)

当SE找到一个元素,但是不久之后,某个东西(一个JS函数)对其进行了更改-将该对象从DOM中删除/重新排列,或者对其属性进行了重大更改,因此出现异常,因此不再将其作为同一元素进行跟踪。
这是因为SE建立了DOM的内部缓存,该缓存可能与实际的缓存不同步。因此名称为“陈旧的”-埃尔。已以某种状态缓存,但其实际形式现在有所不同。

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

常见的解决方案是:

  • 在您知道会导致此问题的事件发生之前睡几秒钟
  • 在使用元素之前重新获取它(如果您将对它的引用存储在WebElement对象中,对于robotframework而言并非如此)
  • 具有重试机制来处理可能会导致执行的元素
  • 吞下异常并继续前进(我已经在几个地方做到了,这里的元素只是一个操作已执行的确认-SE曾经显示/发现过一次,之后我不在乎是什么DOM中发生了变化)