Ответ 1
Вы можете вручную запустить событие:
$('#myselectbox').change();
Другие события JavaScript, которые вы запускаете, не изменяют значение, поэтому они не будут запускать событие change
.
У меня есть поле выбора
<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();
Я также попытался щелкнуть за пределами поля выбора, чтобы удалить фокус, надеясь, что это запустит событие.
Любые идеи?
Вы можете вручную запустить событие:
$('#myselectbox').change();
Другие события JavaScript, которые вы запускаете, не изменяют значение, поэтому они не будут запускать событие change
.
Отключение ответа 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 и ответа!
Использование JQuery ID Selector может создавать проблемы при наличии двух элементов на странице с тем же идентификатором. Следующий код должен быть развернут до соответствующего соответствующего элемента WaitN
Element.DomContainer.Eval(String.Format("$({0}).change();", Element.GetJavascriptElementReference()));
"change" - это событие. "onchange" - это обработчик событий. WatiN Select() не работает; он в конечном счете стреляет "onchange", как если бы это было событие, которое не помогает плакату, который хочет, чтобы произошло событие "изменения".
В конечном счете, нужно использовать JavaScript/JQuery для запуска события "изменения", как указано в ответе, чтобы обойти эту ошибку.
Кажется, что ошибка в 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.
Это сработало для меня:
public static void SelectByValueAndBlur(this SelectList selectList, string value)
{
selectList.Focus();
selectList.SelectByValue(value);
selectList.Blur();
}