【问题标题】:Stale reference exception for EventFiringWebDriver listenerEventFiringWebDriver 侦听器的过时引用异常
【发布时间】:2012-01-12 04:56:50
【问题描述】:

我收到过时的引用异常(元素不再 有效),我正在使用 c# - Webdriver 进行自动化。

我将 Selenium 用于自动化框架。在那我用过 Selenium 事件的 EventFiringWebDriver 类。倾听每一个 InternetExplorerWebdriver 的事件(如 Click() 或 SendKeys())。在 EventFiringWebDriver 类的事件,例如 (ElementClicked,ElementValueChanged) 我已经实现了逻辑 将 WebElementEventArgs 对象的属性记录到基于 XML 的日志中 文件。所以在执行结束时我可以看到 以 XSLT 格式执行每个测试用例并跟踪功能 错误。

代码:-

public class SeleniumEventListener : EventFiringWebDriver
{
     public SeleniumEventListener(IWebDriver webDriver):base(webDriver)
     {
             ElementClicked += new EventHandler<WebElementEventArgs>SeleniumEventListener_ElementClicked);
//more events handled here..
 }
   void SeleniumEventListener_ElementValueChanged(object sender,WebElementEventArgs e)
 {
           LogPassedStep(e)
   }
   private LogPassedStep(e)
   {
          string title = e.Element.value;
            string status = "clicked"

         //XML based logging here.
   }

}

在我使用 selenium 自动化的应用程序中。我有一些文字 框和按钮,EventFiringWebDriver 类 XMLLogging 有效 通过测试用例执行正确地为文本框但是 对于按钮或链接,有时它会给出“元素没有 更长时间有效”过时的引用异常(一些按钮是 类型 Expand collapse 这会导致 DOM 发生变化,并且在我的应用程序中 我有一个任务页面,它会定期刷新 陈旧的引用异常经常出现)

Webdriver 点击在整个执行过程中正常工作,但 EventFiringWebDriver 无法识别对象和过时引用 异常来了

请帮助我.. 或者请建议我获取详细信息的方法 网页对象(如按钮,链接),以便我可以实现 日志功能(我使用的是 C#-webdriver)/

【问题讨论】:

    标签: c# selenium webdriver


    【解决方案1】:

    StaleElementReferenceException 表示您正在访问元素的属性,该属性不再存在。 您需要在 DOM 更改之前为元素收集所有需要的属性值。

    所以如果你想:

    1. 在页面上查找元素
    2. 使元素消失(例如打开另一个页面)
    3. 记录该元素的名称

    你需要:

    1. 在页面上查找元素
    2. 在变量中存储元素的名称 (my_elements_name)
    3. 使元素消失(例如打开另一个页面)
    4. 使用my_elements_name 变量而不是元素本身记录该元素的名称。

    在 python 中它看起来像这样:

    from selenium.webdriver import Firefox
    
    
    browser = Firefox()
    browser.get('http://google.com')
    
    element = browser.find_element_by_id('lst-ib')
    element_name = element.get_attribute('name')
    
    browser.get('http://en.wikipedia.org')
    
    # this will raise 'StaleElementReferenceException':
    print element.get_attribute('name')
    
    # and this will work:
    print element_name
    # prints out: 'q'
    

    【讨论】:

    • 这种方法会增加不必要的代码。因为对于我在执行过程中处理的每个元素,我都必须添加额外的代码。在 EventListener 类的事件中,我必须编写 XML 日志记录逻辑只有一次。
    • 我使用 EventDriver 类的目的是获取 XML 格式的详细执行报告。所以我们还有其他选择吗..
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2012-05-29
    相关资源
    最近更新 更多