我正在使用嵌入式 glassfish 来部署我的 Web 应用程序并使用 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- 显示。只有当它是 selenium 时它们才不会打字)。
任何帮助将不胜感激。不确定我是否完全有道理,我们很乐意澄清。
问候。