我有一个使用KnockoutJS的应用程序,现在我正在尝试编写一些测试来测试一个表单。如果您不知道KnockoutJS,简单来说,它提供了从我的视图到数据模型的绑定。这意味着当我在输入字段中输入值时,我的底层对象会自动更新为该输入字段的值。默认情况下,这是通过更改事件完成的。
问题是,当我的WebDriver测试向字段键入时,更改事件没有触发,因此我的底层数据模型没有相应的值。这导致我的表单验证失败。
我已经尝试了网络上所有能找到的方法:
- 发送Tab键
- 点击表单字段外
- 发送JavaScript代码以触发focus和blur事件(验证发生在blur上)
- 在键入之前先点击表单字段
- 设置等待时间以防止时间问题
- 更改KnockoutJS以在afterkeydown上更新输入字段
但以上方法都没有解决我的问题。
此外,我已经验证过这不是事件冒泡的问题,因为我明确地删除了所有其他事件,只留下了KnockoutJS更改事件。
我要求的解决方案是适用于所有浏览器驱动程序(至少主要的驱动程序,例如IE,FF,Chrome,Safari),并且不需要使用jQuery。
如何解决这个问题?
这是我用来输入字段值的相关代码:
// find element
WebElement input = this.element.findElement(By.className("controls"))
.findElement(By.tagName("input"));
// to set focus?
input.click();
// erase any existing value (because clear does not send any events
for (int i = 0; i < input.getAttribute("value").length(); i++) {
input.sendKeys(Keys.BACK_SPACE);
}
// type in value
input.sendKeys(text);
// to fire change & blur? (doesnt fire change)
//input.sendKeys(Keys.TAB);
// to fire change & blur? (doesnt fire change)
driver.findElement(By.tagName("body")).click();