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

fre*_*edw 24 jquery watin

我有一个选择框

 <select id="myselectbox">
   <option value='a'>First option</option>
   <option value='b'>Second option</option>
 </select>
Run Code Online (Sandbox Code Playgroud)

和jquery

 $('#myselectbox').change(function() {
    ...
 });
Run Code Online (Sandbox Code Playgroud)

还有一个WatiN测试

 SelectList list = Browser.SelectList(Find.ById("myselectbox"));
 list.Select("First option");
Run Code Online (Sandbox Code Playgroud)

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

 list.Blur();
 list.Keypress('\r');
 list.Click();
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Mat*_*all 17

您可以手动触发事件:

$('#myselectbox').change();
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!我最后从Watin做了这个:Browser.Eval("$('#myselectbox').change();")这就是诀窍! (2认同)

Rex*_*ler 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();");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

SelectList list = Browser.SelectList(Find.ById("myselectbox"));
list.Select("First option");
list.ForceChange();
Run Code Online (Sandbox Code Playgroud)

好吧,这是一个很小的便利,但我发现它很有用.无论如何,我为OP和答案赞成!


Abs*_*abs 7

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

Element.DomContainer.Eval(String.Format("$({0}).change();", Element.GetJavascriptElementReference()));
Run Code Online (Sandbox Code Playgroud)

  • 但话说回来,你不应该在同一页面上有2个具有相同ID的元素,因为这与HTML 4和HTML 5规范相对应. (2认同)