Unable to fire jQuery change() event on selectlist from WatiN

心不动则不痛 提交于 2019-11-27 03:52:23

问题


I have a select box

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

And jquery

 $('#myselectbox').change(function() {
    ...
 });

And a WatiN test

 SelectList list = Browser.SelectList(Find.ById("myselectbox"));
 list.Select("First option");

In IE, this changes the select box, but doesn't fire the jquery event handler. I am aware of the many issues surrounding the change() event handler in IE. So I have tried adding a number of things to the test to force the event to fire:

 list.Blur();
 list.Keypress('\r');
 list.Click();

I also tried to click outside the select box to remove the focus, hoping this would fire the event.

Any ideas?


回答1:


You could manually fire the event:

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

The other JavaScript events you're firing don't change the value, so they won't fire the change event.




回答2:


Going off of Matt Ball's answer and the OP's additional steps, I added the following extension method to a test helper class.

using WatiN.Core;

namespace Some.Test.Project
{
    public static class WatiNExtensions
    {
        public static void ForceChange(this Element e)
        {
            e.DomContainer.Eval("$('#" + e.Id + "').change();");
        }
    }
}

Now, so far anyway, I've succeeded in doing:

SelectList list = Browser.SelectList(Find.ById("myselectbox"));
list.Select("First option");
list.ForceChange();

OK, it's a minor convenience at best, but I'm finding it useful. Anyway, upvotes from me for the OP and the answer!




回答3:


Using the JQuery ID Selector can create problems when there are two elements on a page with the same ID. The following code should drill down to the exact corresponding WaitN element

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



回答4:


"change" is the event. "onchange" is the event handler. WatiN's Select() is buggy; it ultimately is firing "onchange" as if it was an event, which doesn't help the poster who wants the "change" event to fire.

Ultimately one has to use JavaScript/JQuery to fire the "change" event, as stated in the answer, to get around this bug.




回答5:


It seems like a bug in IE's fireEvent. WatiN's SelectList.Select() generates something similar to

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

Where watin3 is the native HTMLSelectElement. The fireEvent call does not fire jQuery attached events. You can repro it by manually calling $('#id')[0].fireEvent('onchange');

So your best bet is to manually fire the event like others suggested using jQuery.




回答6:


This worked for me:

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


来源:https://stackoverflow.com/questions/3712825/unable-to-fire-jquery-change-event-on-selectlist-from-watin

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!