【发布时间】:2014-12-04 15:57:04
【问题描述】:
我正在执行一项测试,该测试运行“点击添加”功能的功能使用。 用户将获得一个项目表,允许他们单击“添加”按钮将项目添加到他们的购物车。
按钮执行 ajax 调用以将商品附加到用户的购物车。成功添加项目后,该项目将显示在购物车 UI 中。购物车 UI 本质上是另一个表格。
//pseudo code
$('.addButton').on('click', function (event) {
$.ajax({
url:...,
success: updateCart
});
});
function updateCart (data) {
// use data to create tr_fragment
$("#cart-ui-target").append(tr_fragment); //new row
}
我尝试在then 语句中使用waitFor,直到#cart-ui-target 的<tr> 大小大于或等于1:
waitFor(5) {$('#cart-ui-target').find('tr').size() >= 1}
但是,有时测试会失败,但会出现以下异常:
geb.waiting.WaitTimeoutException: condition did not pass in 5.0 seconds (failed with exception)
我什至尝试以 2 秒的间隔将 waitFor 时间增加到 10 秒,但它仍然不起作用:
waitFor(10, 2) {$('#cart-ui-target').find('tr').size() >= 1}
我能做些什么来更好地等待并防止零星的失败?
更新 这是我在 phantomjs 的日志信息中看到的。
$('#cart-ui-target').find('tr').size()
| | |
| [] 0
[[[[[PhantomJSDriver: phantomjs on LINUX (113358b0-7bf1-11e4-a10e-9f2b2537fa31)] -> tag name: html]] -> css selector: #cart-ui-target]]
【问题讨论】:
-
由于
WaitTimeoutException导致测试失败时,项目是否真的出现在指定的时间? -
据我所知。确认的差距是 CI 系统(测试失败的地方)不能很好地处理快照。我们仍在努力使其正常工作。
-
我能够为 phantomjs 设置信息级别;更新的问题。
-
你可以尝试直接执行一些 javascript 来选择元素,而不是使用 Geb 的 $() 函数:
waitFor{browser.driver.executeScript("return document.querySelectorAll('#cart-ui-target tr')").size() > 0} -
有没有在测试执行前行数大于 1 的实例?如果这是问题,我会先得到 tr 的大小并对此进行测试。或者更好的是通过检查 $.active 来等待 ajax 调用完成。