Тестирование Selenium - события, похоже, не запускаются
Я использую встроенный Glassfish для развертывания моего веб-приложения и тестирования его с помощью удаленного управления Arquillian. Пока все шло хорошо, мы обнаружили проблему при попытке использовать функцию предложений в приложении. Он в основном состоит из текстового поля, которое предлагает список возможных совпадающих элементов, если набрано 3 или более символов.
<div class="uiModuleSelectingConcepts suggestion_${cc.id}">
<div class="searchBox">
<fieldset>
<input type="text"
class="sample"
value="${cc.attrs.input_label}"
placeholder="${cc.attrs.input_label}"/>
<i></i>
</fieldset>
</div>
<a4j:outputPanel id="suggestion_component_container"
styleClass="suggestionsWrapper"
layout="block">
<div class="suggestionsList_${cc.id}">
</div>
</a4j:outputPanel>
</div>
Некоторые события добавляются, поэтому эти предложения правильно отображаются, как показано ниже (в следующем коде параметр inputNode) - это само текстовое поле, где пользователь вводит... там, где мы добавляем события):
this.addEventHandlers = function (inputNode, suggestionCallback, params) {
var parent = this;
inputNode
/*
* keypress event.
*/
.keypress(function(event) {
if (event.keyCode === 13) {
event.preventDefault();
}
})
/*
* keyup event.
*/
.keyup(function(event) {
switch (event.keyCode) {
/**
* Up arrow.
*/
case 38:
event.stopPropagation();
event.preventDefault();
var suggestionsWrapper = parent._params.list;
var currentSelectedValue = null;
if (suggestionsWrapper.find(".suggestionItem").length) {
if (suggestionsWrapper.find(".suggestionItem:first").hasClass("focused")) {
suggestionsWrapper.find(".focused").removeClass("focused");
suggestionsWrapper.find(".suggestionItem:last").addClass("focused");
//currentSelectedValue = suggestionsWrapper.find(".suggestionItem:last").val();
} else {
suggestionsWrapper.find(".focused").removeClass("focused").prev().addClass("focused");
};
//set the selected value to input.
//console.debug("Current Valiue", suggestionsWrapper.find(".focused"));
var e = suggestionsWrapper.find(".focused");
if (e.length > 0) {
//console.debug("Current e", e);
currentSelectedValue = typeof e === 'undefined' ? null : e.attr('data-suggest');
//console.debug("Current Valiue", currentSelectedValue);
if (currentSelectedValue != null) {
jQuery(this).val(Encoder.htmlDecode(currentSelectedValue));
}
}
}
parent._blur = false;
break;
/**
* Down arrow.
*/
case 40:
var suggestionsWrapper = parent._params.list;
var currentSelectedValue = null;
if (suggestionsWrapper.find(".suggestionItem").length) {
if (suggestionsWrapper.find(
".suggestionItem:last").hasClass("focused")) {
suggestionsWrapper.find(".focused").removeClass("focused");
suggestionsWrapper.find(".suggestionItem:first").addClass("focused");
} else {
suggestionsWrapper.find(".focused").removeClass("focused").next().addClass("focused");
};
//console.debug("Current Valiue", suggestionsWrapper.find(".focused"));
var e = suggestionsWrapper.find(".focused");
//console.debug("Current e", e);
if (e.length > 0) {
currentSelectedValue = typeof e === 'undefined' ? null : e.attr('data-suggest');
//console.debug("Current Valiue", currentSelectedValue);
if (currentSelectedValue != null) {
jQuery(this).val(Encoder.htmlDecode(currentSelectedValue));
}
}
}
parent._blur = false;
break;
/**
* ENTER key
*/
case 13:
event.stopPropagation();
event.preventDefault();
var suggestionsWrapper = parent._params.list;
var oConcept = suggestionsWrapper.find(".focused");
if (typeof oConcept !== "undefined") {
oConcept.trigger("click");
}
parent._blur = true;
parent._cleanSuggestions();
jQuery(this).blur();
break;
/**
* ESC key event.
*/
case 27:
event.stopPropagation();
event.preventDefault();
var sValue = jQuery(this).attr("data-default");
sValue = jQuery.trim(sValue);
if (sValue === jQuery(this).attr("data-default")) {
jQuery(this).addClass("sample").blur();
}
parent._blur = true;
parent._cleanSuggestions();
jQuery(this).val("");
jQuery(this).blur();
break;
default:
var suggestionsWrapper = parent._params.list;
//var typeRight = jQuery(this).parents(".tabContent").attr("id");
var sValue = jQuery.trim(jQuery(this).val());
//var oThisInput = jQuery(this);
if (sValue.length > MEDIA.configuration.SUGGESTION_LIMIT) {
suggestionsWrapper.find(".suggestionItem").remove();
global.uiDelay( function() {
parent.displayLoading();
suggestionCallback(sValue, MEDIA.util.getTrueFalseValue(parent._params.retrieveOnlyClasses) ? suggestOnlyConcepts : "");
}, 1000);
} else {
parent.writeMore();
}
parent._blur = true;
break;
};
}).keydown(function(event) {
switch (event.keyCode) {
case 38: // up
event.stopPropagation();
event.preventDefault();
break;
case 40: // down
event.stopPropagation();
event.preventDefault();
break;
default:
break;
};
}).focus(function() {
jQuery(this).val("");
parent._blur = true;
// when suggestions lose focus
}).blur(function() {
if (parent._blur) {
jQuery(this).val("");
parent._cleanSuggestions();
}
});
};
Когда приложение развернуто нормально (без целей тестирования, без селена), оно работает как положено, и при вводе чего-либо отображаются предложения. Однако при использовании Selenium, независимо от того, что напечатано в поле, ничего не происходит. Мы испробовали множество возможностей и комбинаций с.keyDown(), .keyPress(), .keyUp() с их char, keyCode и нативными вариантами. Также.type(), .typeKeys().... все безрезультатно. Казалось бы, по каким-то причинам события игнорируются (забавно то, что если мы вручную набираем текст в браузере selenium, открывающемся для тестирования приложения, то выводятся подсказки -do- display. Они этого не делают только тогда, когда это селен. печатать).
Любая помощь будет принята с благодарностью. Не уверен, что я понял, мы были бы рады уточнить.
Привет.
1 ответ
Я использовал эту простую тестовую страницу и jQuery 1.7.2 (вход в первое поле должен быть скопирован в другое):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
</head>
<body>
<input type="text" id="myInput" />
<input type="text" id="yourInput" />
<script>
$("#myInput").keyup(function(event) {
$("#yourInput").val(this.value);
});
</script>
</body>
</html>
Позвольте мне изложить досадную правду в самом начале: с WebDriver все работает хорошо и гладко.
WebDriver driver = new InternetExplorerDriver();
driver.get("the path to the file");
driver.findElement(By.id("myInput")).sendKeys("Hello.");
driver.quit();
Во всяком случае, то, что я смог заставить его работать в Selenium RC, тоже:
sele.focus("id=myInput");
sele.keyPressNative(String.valueOf(KeyEvent.VK_H));
sele.keyPressNative(String.valueOf(KeyEvent.VK_E));
sele.keyPressNative(String.valueOf(KeyEvent.VK_L));
sele.keyPressNative(String.valueOf(KeyEvent.VK_L));
sele.keyPressNative(String.valueOf(KeyEvent.VK_O));
Это отчасти отстой, но это лучшее, что я придумал, где работает событие.