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

一曲冷凌霜 提交于 2019-11-28 10:43:22

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.

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!

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

"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.

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.

This worked for me:

    public static void SelectByValueAndBlur(this SelectList selectList, string value)
    {
        selectList.Focus();
        selectList.SelectByValue(value);
        selectList.Blur();
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!