我在我的Geb测试中遇到了一个问题,我试图点击选择下拉框,其中第一个选项为null(用户希望它显示空白作为第一个选项)。它是一个状态字段如下。请注意,原始html的from值为空数组。根据基于Ajax调用的“USA”选择国家来填补状态,我不得不对其进行编辑。
如何设置我的选择器以达到第二个或第三个值?我可以将值作为数组或类似的东西传递给选择器吗? “100225”美国在Firebug HTML和我的测试db xml中的值,“102722”是“Alabama”的状态值
***我想要实现的目标是:我希望能够击中其中一个独特的状态值,例如102722但是Geb只能击中第一个在选择框中始终为空的值,尽管'102722'值存在于Firebug HTML和我的测试xml db中,所以我知道它在那里。正如您所看到的,我已经为State以几种不同的方式编写了Geb选择器。这是总会出现的错误:
| java.lang.IllegalArgumentException:无法选择带有文本或值的选项:102722
注意:另请注意,Geb中值的println始终返回空值。
原始表格项目:
<div class="col-sm-3">
<label id="Country-label" class="toplabel" for="Country">Country<span class="required-indicator">*</span></label>
<g:select name="Country" id="Country" from="${dbinfo...Country.list().sort{it.orderNumber}}" class="form-control" required="" optionKey="id" value="${Instance.Country}" aria-labelledby="Country-label"/>
</div>
<div class="col-sm-2">
<label id="State-label" class="toplabel" for=State>State<span id="StateAsterisk" class="required-indicator">*</span></label>
<g:select name="State" id="State" from="${[]}" class="form-control" optionKey="id" value="${...Instance.State}" noSelection="['null':'']" aria-labelledby="State-label"/>
</div>
从Firebug呈现HTML:
<select id="Country" class="form-control" aria-labelledby="Country-label" required="" name="Country">
<option selected="selected" value="100225">United States</option>
<select aria-labelledby="State-label" class="form-control" id="State" name="State">
<option value="null"></option>
<option value="102722">Alabama</option>
<option value="102723">Alaska</option>
Geb选择器摘自test:
println $('#Country').value()
waitFor(5){$('#Country').click()}
$('#Country').value(100225) // USA
waitFor(10){$('#Country').find("option").find{ it.value() == 100225 }.click()} // USA
println $('#State').value() // --> RETURNS NULL VALUE
$('#State').find("option").find{ it.value() == 102722}.click() // --> NONE OF THESE WILL HIT
waitFor(5){$('#State').click()} // --> NONE OF THESE WILL HIT
waitFor(5){$('#State').value(102722)} // --> NONE OF THESE WILL HIT
Javascript / Ajax调用 - 根据国家/地区加载状态:
$(document).ready(function(){
$('#Country').change(function() {
var country = $(this).val();
if(country != null && country != 'null'){
loadStates(country, null, 'submitter', true);
}
});
<g:if test="${...Country}">
$('#Country').val(${...Country});
loadStates(${...Country}, "${...State?:null}", 'submitter', true);
</g:if>
var xhr = null;
function loadStates(country, state, selectId, hideShowAsterisk){
if(xhr != null){
xhr.abort();
xhr = null;
}
xhr = $.ajax({
url: '${request.contextPath}.../aj/loadStatesByCountry',
data: { country: country, selectId:selectId },
async:false,
success: function(data) {
$('#'+selectId+'State').html(data);
$('#'+selectId+'State-label').show();
if(state){
$('#'+selectId+'State').val(state);
}
if(hideShowAsterisk){
if(country == ${grailsApplication....country.usa}){
$('#'+selectId+'StateAsterisk').show();
}else{
$('#'+selectId+'StateAsterisk').hide();
}
}
xhr = null;
},
error:function(jqXHR, textStatus){
if(textStatus != 'abort'){
xhr = null;
alert("There was an error requesting the States for the selected Country");
}
}
});
}
答案 0 :(得分:0)
您是否尝试过以下操作:
waitFor(30){$("form").State = "102722"}