无法从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(); }