我有一个选择框
<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();
我还尝试在选择框外面单击以移除焦点,希望这会触发事件。
有什么想法吗?
答案 0 :(得分:17)
您可以手动触发事件:
$('#myselectbox').change();
您正在触发的其他JavaScript事件不会更改该值,因此它们不会触发change
事件。
答案 1 :(得分:15)
关于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和答案赞不绝口!
答案 2 :(得分:7)
当页面上有两个具有相同ID的元素时,使用JQuery ID Selector会产生问题。以下代码应深入到相应的WaitN元素
Element.DomContainer.Eval(String.Format("$({0}).change();", Element.GetJavascriptElementReference()));
答案 3 :(得分:1)
“改变”是事件。 “onchange”是事件处理程序。 WatiN的Select()是错误的;它最终正在发射“onchange”,好像它是一个事件,这对那些想要“改变”事件的海报无法解雇。
最终必须使用JavaScript / JQuery触发“更改”事件,如答案中所述,以解决此错误。
答案 4 :(得分:0)
这似乎是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一样。
答案 5 :(得分:0)
这对我有用:
public static void SelectByValueAndBlur(this SelectList selectList, string value)
{
selectList.Focus();
selectList.SelectByValue(value);
selectList.Blur();
}