Невозможно запустить событие jQuery change () в списке выбора из WatiN - PullRequest
24 голосов
/ 15 сентября 2010

У меня есть поле выбора

 <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 () в IE.Поэтому я попытался добавить несколько вещей в тест, чтобы вызвать событие:

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

Я также попытался щелкнуть за пределами поля выбора, чтобы убрать фокус, надеясь, что это вызовет событие.

Есть идеи?

Ответы [ 6 ]

17 голосов
/ 15 сентября 2010

Вы можете вручную запустить событие:

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

Другие события JavaScript, которые вы запускаете, не изменяют значение, поэтому они не будут запускать событие change.

15 голосов
/ 11 февраля 2011

Исходя из ответа Мэтта Болла и дополнительных шагов ОП, я добавил следующий метод расширения в класс помощника по тестированию.

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 и ответ!

7 голосов
/ 30 июля 2011

Использование JQuery ID Selector может создать проблемы, когда на странице есть два элемента с одинаковым идентификатором.Следующий код должен перейти к точному соответствующему элементу WaitN

Element.DomContainer.Eval(String.Format("$({0}).change();", Element.GetJavascriptElementReference()));
1 голос
/ 02 мая 2013

«изменение» - это событие. «onchange» - это обработчик событий. WatiN's Select () содержит ошибки; в конечном итоге он запускает «onchange», как если бы это было событие, которое не помогает автору, который хочет, чтобы событие «change» сработало.

В конечном счете, чтобы обойти эту ошибку, нужно использовать JavaScript / JQuery для запуска события «change», как указано в ответе.

0 голосов
/ 24 февраля 2012

Это сработало для меня:

    public static void SelectByValueAndBlur(this SelectList selectList, string value)
    {
        selectList.Focus();
        selectList.SelectByValue(value);
        selectList.Blur();
    }
0 голосов
/ 09 сентября 2011

Это похоже на ошибку в IE fireEvent. WatiN's SelectList.Select () генерирует что-то похожее на

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

Где watin3 - это собственный HTMLSelectElement. Вызов fireEvent не запускает события, связанные с jQuery. Вы можете воспроизвести его, вручную позвонив $('#id')[0].fireEvent('onchange');

Так что вам лучше всего вручную запустить событие, как другие предлагали использовать jQuery.

...