我正在测试一个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&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()
}
}
答案 0 :(得分:0)
我没有花很多时间试图让无头火狐工作,因为我读过很多这样的问题。我决定尝试使用PhantomJS,而且到目前为止它一直在按预期工作。
要设置PhantomJSDriver,您需要:
'com.github.detro.ghostdriver:phantomjsdriver:1.1.0'
以下是我在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
}
很抱歉,这并没有直接回答“为什么”某些测试有问题的问题,但希望能解决它!