У меня есть приложение, которое использует KnockoutJS, и я пытаюсь написать несколько тестов, которые проверяют форму. Если вы не знаете KnockoutJS, короткая история для него заключается в том, что он предоставляет привязки от моего взгляда к моей модели данных. Это означает, что когда я набираю значение в поле ввода, мой базовый объект автоматически обновляется этим значением поля ввода. Это делается через событие изменения по умолчанию.
Проблема, с которой я сталкиваюсь, заключается в том, что, когда мой тест WebDriver печатает в поле, событие изменения не запускается, поэтому моя базовая модель данных не имеет соответствующих значений. Это приводит к сбою проверки моей формы, когда это не должно быть.
Я сделал все, что мог найти в Интернете, чтобы сделать эту работу. Я:
- отправил клавишу табуляции
- кликнул в поле формы
- отправить код JavaScript для запуска фокусировки и размытия (проверка происходит при размытии)
- щелкнул поле формы, прежде чем вводить
- набор ждет только в том случае, если это была временная проблема
- изменил 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();