Geb - 无头模式下的不一致行为

时间:2014-06-19 22:12:26

标签: grails gsp spock geb headless-browser

我正在测试一个grails应用程序,并由Hudson运行测试。在本地计算机上运行时,测试通过100%的时间。 数据库始终在测试初始化​​时重置。

我在设置动态表单的值时遇到问题。在我的.gsp中,我有以下内容:

                <g:xEditableRefData owner="${license}" field="isPublic" config='YN'/>

这是生成“编辑”链接。单击时会出现一个下拉列表,允许用户在是或否之间进行选择(邮件末尾的屏幕截图):

以下是生成的代码:

<span data-url="/demo/ajax/genericSetRel"
      data-source="/demo/ajax/sel2RefdataSearch/YN?format=json&amp;oid=License%3A1"
      data-name="isPublic" data-type="select" data-pk="License:1"
      class="xEditableManyToOne editable editable-click editable-empty" id="License:1:isPublic">Edit
</span>

点击时:

<span class="editable-inline editable-container">
<div>
    <div class="editableform-loading" style="display: none;"></div>
    <form class="form-inline editableform" style="">
        <div class="control-group">
            <div>
                <div class="editable-input">
                    <select class="input-medium">
                        <option value="RefdataValue:1">Yes</option>
                        <option value="RefdataValue:2">No</option>
                    </select>
                </div>
                <div class="editable-buttons">
                    <button class="btn btn-primary editable-submit" type="submit">
                        <i class="icon-ok icon-white"></i>
                    </button>
                    <button class="btn editable-cancel" type="button">
                        <i class="icon-remove"></i>
                    </button>
                </div>
            </div>
            <div class="editable-error-block help-block" style="display: none;"></div>
        </div>
    </form>
</div>
</span>

我的Page类中有以下方法用于设置编辑/下拉列表的值:

editIsPublic { option ->
        $("span", 'data-name': "isPublic").click()
        try {
            waitFor { $("form.editableform") }
        } catch (geb.waiting.WaitTimeoutException e) {
            throw new RequiredPageContentNotPresent()
        }
       $("select.input-medium").value(option)
        $("button.editable-submit").click()
    }

这在我的本地机器上总是成功的,但是当在Hudson上无头运行时我会失败大约80%。当它失败时,测试不会停止,但是下拉列表的值不正确,并且不会抛出任何异常。我也考虑过传递箭头键而不是设置值,但由于其他原因,这不是一个好的选择。任何想法为什么上面的代码不适用于哈德森?有没有其他方法可以设置值?

更新

现在添加很多waitFor语句似乎解决了这个问题。我已经定义了以下闭包,我将它用于所有交互式的东西。

 waitElement {run ->
        try{
            waitFor{run()}
        } catch (geb.waiting.WaitTimeoutException e) {
            throw new RequiredPageContentNotPresent()
        }
    }

1 个答案:

答案 0 :(得分:0)

我没有花很多时间试图让无头火狐工作,因为我读过很多这样的问题。我决定尝试使用PhantomJS,而且到目前为止它一直在按预期工作。

要设置PhantomJSDriver,您需要:

  1. 按照docs
  2. 下载/安装PhantomJS
  3. 将PhantomJSDriver添加到测试依赖项'com.github.detro.ghostdriver:phantomjsdriver:1.1.0'
  4. 设置指向PhantomJS二进制文件的系统属性
  5. 在GebConfig文件中设置PhantomJSDriver
  6. 以下是我在GebConfig中添加的一个简单示例:

    System.setProperty("phantomjs.binary.path", "path/to/phantomjs/binary")
    driver = {
        def pjsDriver = new PhantomJSDriver()
        // set window size manually because the default size is very small
        pjsDriver.manage().window().size = new Dimension(1680, 1050)
        pjsDriver
    }
    

    很抱歉,这并没有直接回答“为什么”某些测试有问题的问题,但希望能解决它!