无法从WatiN在selectlist上触发jQuery change()事件

我有一个选择框

 First option Second option  

和jquery

  $('#myselectbox').change(function() { ... }); 

还有一个WatiN测试

  SelectList list = Browser.SelectList(Find.ById("myselectbox")); list.Select("First option"); 

在IE中,这会更改选择框,但不会触发jquery事件处理程序。 我知道围绕IE中的change()事件处理程序的许多问题。 所以我尝试在测试中添加一些东西来强制事件发生:

  list.Blur(); list.Keypress('\r'); list.Click(); 

我还试图在选择框外面单击以移除焦点,希望这会触发事件。

有任何想法吗?

您可以手动触发事件:

 $('#myselectbox').change(); 

您正在触发的其他JavaScript事件不会更改该值,因此它们不会触发change事件。

关于Matt Ball的答案和OP的附加步骤,我将以下扩展方法添加到测试助手类中。

 using WatiN.Core; namespace Some.Test.Project { public static class WatiNExtensions { public static void ForceChange(this Element e) { e.DomContainer.Eval("$('#" + e.Id + "').change();"); } } } 

到目前为止,无论如何,我已经成功地做到了:

 SelectList list = Browser.SelectList(Find.ById("myselectbox")); list.Select("First option"); list.ForceChange(); 

好吧,这是一个很小的便利,但我发现它很有用。 无论如何,我对OP和答案赞不绝口!

当页面上有两个具有相同ID的元素时,使用JQuery ID Selector会产生问题。 以下代码应深入到相应的WaitN元素

 Element.DomContainer.Eval(String.Format("$({0}).change();", Element.GetJavascriptElementReference())); 

“改变”就是这个事件。 “onchange”是事件处理程序。 WatiN的Select()是错误的; 它最终正在解雇“onchange”,就好像它是一个事件,这对那些希望“改变”事件发生的海报没有帮助。

最终,必须使用JavaScript / JQuery触发“更改”事件,如答案中所述,以解决此错误。

这似乎是IE的fireEvent中的一个错误。 WatiN的SelectList.Select()生成类似的东西

 var newEvt = document.createEventObject(); newEvt.button = 1; watin3.fireEvent('onchange', newEvt); 

watin3是本机HTMLSelectElement。 fireEvent调用不会触发jQuery附加事件。 您可以通过手动调用$('#id')[0].fireEvent('onchange');调用它$('#id')[0].fireEvent('onchange');

因此,最好的办法是像其他人建议使用jQuery一样手动触发事件。

这对我有用:

  public static void SelectByValueAndBlur(this SelectList selectList, string value) { selectList.Focus(); selectList.SelectByValue(value); selectList.Blur(); }