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

时间:2010-09-14 20:53:10

标签: jquery watin

我有一个选择框

 <select id="myselectbox">
   <option value='a'>First option</option>
   <option value='b'>Second option</option>
 </select>

和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();

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

有什么想法吗?

6 个答案:

答案 0 :(得分:17)

您可以手动触发事件:

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

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

答案 1 :(得分:15)

关于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和答案赞不绝口!

答案 2 :(得分:7)

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

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

答案 3 :(得分:1)

“改变”是事件。 “onchange”是事件处理程序。 WatiN的Select()是错误的;它最终正在发射“onchange”,好像它是一个事件,这对那些想要“改变”事件的海报无法解雇。

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

答案 4 :(得分:0)

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

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

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

来重新启动它

所以你最好的选择是手动触发事件,就像其他建议使用jQuery一样。

答案 5 :(得分:0)

这对我有用:

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