在WatiN ElementFactory中注册一个已存在的元素标记

时间:2010-12-29 17:00:39

标签: watin

我不满意WatiN中SelectList类的现有实现,尤其是Select方法或SelectByValue方法,它不会触发onchange事件

我想创建自己的类ZwtSelectList,它继承自SelectList并覆盖有问题的方法

[ElementTag("select")]
public class ZwtSelectList : SelectList
{
    public ZwtSelectList(DomContainer container, ElementFinder finder) : base(container, finder) { }

    public override void Select(string text)
    {
        base.Select(text);
        DomContainer.Eval(string.Format("$('#{0}').change()", Id));
    }
 }

但是当我使用

ElementFactory.RegisterElementType(typeof(ZwtSelectList));

我得到了

System.InvalidOperationException: Types SelectList and ZwtSelectList have both registered element tag 'SELECT'

有没有办法取消注册已经注册的标签?或者是一种覆盖已注册标签的方法?

2 个答案:

答案 0 :(得分:0)

目前,不支持将自己的元素注册为本机WatiN元素的替代元素。但你可以使用:

browser.Element<ZwtSelectList>(Find.Any).Select(...);

只要自定义元素继承自为该标记或标记注册的原始元素(就像您所做的那样),就不应该更改ElementFactory实现以允许为已注册的元素重新注册自定义元素使用您的SelectList)。

我建议在SourceForge上从SVN存储库获取最新代码,因为我已经解决了自WatiN RC1以来上面的示例代码的问题。

答案 1 :(得分:0)

请注意,WatiN会触发一个名为“onchange”的事件,该事件与“change”事件不同。 海报的代码确实触发了元素的“更改”事件,但是WatiN的Select()及其变体的实现不起作用。原因是WatiN 2.0的代码是错误的,并没有触发“更改”事件,而是“onchange”事件,可能没有人将其事件处理程序挂钩。

如果碰巧修复了这个bug,可以通过WatiN核心使用Select(),它可能会正常工作。