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

24

我有一个选择框

 <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事件处理程序。我意识到了围绕change()事件处理程序的许多问题。因此,我尝试添加了许多东西来强制事件触发:

 list.Blur();
 list.Keypress('\r');
 list.Click();
我还尝试了在选择框之外单击以取消焦点,希望这样会触发事件。 有任何想法吗?

我也试图在选择框之外单击,取消焦点,希望这样可以触发事件。你有什么想法吗?


+1:我自己也遇到了同样的问题 - Mayo
+1:我也是。有人已经报告这个问题了吗? - Marnix van Valen
6个回答

17
你可以手动触发该事件:
$('#myselectbox').change();

你触发的其他JavaScript事件并没有改变值,因此它们不会触发change事件。


2
谢谢!我最终使用Watin完成了这个操作:Browser.Eval("$('#myselectbox').change();"),这样就解决了问题! - fredw

15

根据Matt Ball的答案和原帖作者的附加步骤,我将以下扩展方法添加到测试助手类中。

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

好的,这只是一个小的便利,但我发现它很有用。无论如何,我对原帖和答案给予了赞同!


7

当页面上有两个具有相同ID的元素时,使用JQuery ID选择器可能会导致问题。以下代码应该会定位到确切对应的WaitN元素。

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

2
但是再说,您不应该在同一页上使用相同ID的2个元素,因为这违反了HTML 4和HTML 5规范。 - René
只是想知道如何在页面上没有jQuery的情况下仅使用JavaScript来完成这个操作?我发现这个更好。 - rahoolm
如果该选择器没有设置ID,那么这非常有帮助。 - Daniel Benedykt
这是唯一能为我工作的东西。其他选项甚至都没有触发事件。谢谢! - JustPlainBill

1
"change"是事件。"onchange"是事件处理程序。 WatiN的Select()存在缺陷;它最终会像触发事件一样触发"onchange",这并不能帮助想要触发"change"事件的用户。
最终,必须使用JavaScript / JQuery来触发"change"事件,就像答案中所述,以解决此问题。

0
这对我有用:
    public static void SelectByValueAndBlur(this SelectList selectList, string value)
    {
        selectList.Focus();
        selectList.SelectByValue(value);
        selectList.Blur();
    }

不得不这样做是因为尝试其他方法时,由于某种原因jQuery未定义。 - rball

0

看起来是IE的fireEvent中的一个bug。WatiN的SelectList.Select()生成了类似于

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接