我使用嵌入式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和native变种的许多可能性和组合。此外,.type(),. typeKeys()....所有这些都无济于事。由于某些原因,事件似乎被忽略了(有趣的是,如果我们在浏览器中手动输入一些文本来打开selenium来测试应用程序,建议 - 显示。他们只是不在它的硒做了打字)。
非常感谢任何帮助。不确定我是否完全有道理,我们很乐意澄清。
问候。
答案 0 :(得分:0)
我使用了这个简单的测试页面和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));
这有点糟透了,但这是我提出的事件最好的地方。