Geb测试:无法根据Ajax调用选择下拉值

时间:2015-06-01 17:50:06

标签: javascript jquery html ajax geb

我在我的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");
                        }
                    }
       });
    }

1 个答案:

答案 0 :(得分:0)

您是否尝试过以下操作:

waitFor(30){$("form").State = "102722"}