【问题标题】:Unable to fire jQuery change() event on selectlist from WatiN无法在 WatiN 的选择列表上触发 jQuery change() 事件
【发布时间】:2011-04-12 09:16:55
【问题描述】:

我有一个选择框

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

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

有什么想法吗?

【问题讨论】:

  • +1:我自己也遇到了同样的问题
  • +1:我也是。有人将此报告为错误吗?

标签: jquery watin


【解决方案1】:

您可以手动触发事件:

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

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

【讨论】:

  • 谢谢!我最终从 Watin 这样做了: Browser.Eval("$('#myselectbox').change();") 并且成功了!
【解决方案2】:

根据 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 和答案投票!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 但话又说回来,你不应该在同一页面上有两个具有相同 ID 的元素,因为这违反了 HTML 4 和 HTML 5 规范。
    • 只是想知道当页面上没有 jQuery 时如何单独使用 JavaScript 来做到这一点?我发现这个更好。
    • 例如,如果选择没有设置 ID,这将非常有用。
    • 这是唯一对我有用的东西。其他选项甚至不会触发该事件。谢谢!
    【解决方案4】:

    “改变”是事件。 “onchange”是事件处理程序。 WatiN 的 Select() 有问题;它最终会触发“onchange”,就好像它是一个事件一样,这对希望触发“change”事件的发布者没有帮助。

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

    【讨论】:

      【解决方案5】:

      这似乎是 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 一样手动触发事件。

      【讨论】:

        【解决方案6】:

        这对我有用:

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

        【讨论】:

        • 不得不这样做,因为在尝试给定的其他方式时,由于某种原因没有定义 jQuery。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        • 2018-03-05
        • 2021-02-10
        • 2017-05-28
        • 1970-01-01
        相关资源
        最近更新 更多