capybara-webkit flakiness没有看到旋转器始终存在?

时间:2015-09-23 01:57:43

标签: capybara capybara-webkit

我有一个带有导轨后端的单页角应用程序。页面上有链接触发状态转换(导航到页面),这些toStates抛出一个微调器,因为后台有一个api调用。最初,测试结果令人难以置信,因为有时api调用会立即发生,有时会有一点延迟,而且水豚会在实际存在之前断言页面上有东西。

为了解决这个问题,我做了这个,以便我的测试环境有一个硬编码的微调器延迟,导致所有api调用微调器持续至少1000ms。

所以,我做了一个capybara帮助方法让我知道测试应该向前推进,断言实际上是在页面上的东西并准备好进行测试:

Private Sub CommandButton1_Click()
    Dim i As Integer, j As Integer, k As Integer
    With Me.ListBox1
        .ColumnCount = 10
        .ColumnWidths = "15;15;15;15;15;15;15;15;15;15"
        k = 10 ' determines exit condition
        For i = 1 To 10
            For j = 1 To 10
                If j = 1 Then
                    .AddItem j ' if it is the number 1, use AddItem method
                Else
                    .List(.ListCount - 1, j - 1) = j ' else use the List method
                End If
                If k = j Then Exit For
            Next
            k = k - 1
        Next
    End With
End Sub

所以我可以这样做:

def with_spinner_expectations
  expect(page).to_not have_selector('.spinner')
  yield
  expect(page).to have_selector('.spinner')
  expect(page).to_not have_selector('.spinner')
end

所以,测试会期望没有微调器,然后单击元素将转换到新状态,并在该状态的控制器初始化时,进行api调用 - 显示微调器,然后在1秒后,它消失了。

然而,每运行5-10个规格,就会失败,说没有选择器' .spinner' .........

我甚至遇到过这样的问题,我每次都会访问一个引发微调器的网址。

with_spinner_expectations
  page.find('.thing-that-triggers-a-state-change').click
end

......它会在大部分时间内通过,但每隔一段时间,它就会失败,声称没有旋转器。

如果有人可以帮助指导我如何使这些测试不那么脆弱,我将非常感激。

1 个答案:

答案 0 :(得分:0)

我在一个角色应用程序中工作,该应用程序在api调用期间也使用微调器并使用类似这样的方法:

def check_page_done
  begin
    (0..30).each do |i|
      if page.has_css?('#loading-bar-spinner', :wait => 2) then sleep 2 else break end
      puts 'Loading spinner never finished' if i == 30
    end
  rescue Exception => msg
    puts msg
    retry
  end
end

该方法将等待2秒钟以显示微调器,然后继续前进。如果确实找到了加载微调器,它会等待另一个旋转器。如果微调器只是继续运行一整分钟,那么我们就会断开,所以我们不会无限期地卡住。

异常处理就在那里,因为有时我遇到了可怕的陈旧元素异常,在这种情况下很容易被忽略,因为我们只是处理一个微调器。

我在许多其他辅助方法中使用此方法,以及在我知道常规水豚探测器可能不够的步骤之间。

您是否也尝试过观看实际的测试执行?也许旋转器确实不会经常出现。