有没有最好的方法去检查Capybara桌子的每一行?

时间:2016-12-26 19:53:25

标签: automated-tests capybara

我使用capybara来查看一个列中包含国家/地区名称的表格,以及在另一个列表中包含名称的下拉列表。

代码是这样的:

 within('tbody') do
  all('tr').each do |line|
    unless line.has_css?('United Kingdom')
      if line.has_css?('span', text: 'Austria')
        find('input[id*="_name-selectized"]').click
        find('div[data-selectable]', text: austria_person.name).click
      end
    end
  end
end

但这太慢了,我想知道是否有最快的方法来查看每一行并根据国家/地区选择一个下拉选项。

1 个答案:

答案 0 :(得分:1)

由于大多数Web应用程序的异步特性,Capybara在其大多数方法上都提供自动等待/重试行为(所有方法都是默认情况下)。这对于你正在寻找你需要在页面上的确切内容的大多数情况都是很好的,但在像你这样的情况下,你根据页面上的内容或不在页面上做什么来决定做什么可能导致延误。

例如,在您调用line.has_css?('United Kingdom')时的代码中,Capybara正在等待Capybara.default_max_wait_time以显示文本。如果您知道该行已加载且不会动态更改,那么等待就是浪费时间。幸运的是,您可以通过传递wait: false(或0)来禁用等待时间。

因此

within('tbody') do
  all('tr').each do |line|
    unless line.has_css?('United Kingdom', wait: false)
      if line.has_css?('span', text: 'Austria', wait: false)
        find('input[id*="_name-selectized"]').click
        find('div[data-selectable]', text: austria_person.name).click
      end
    end
  end
end

对你来说可能会快得多。第二个优化可能是您需要点击的项目实际上在行中,然后将这些项目作为范围,以减少必须搜索的元素数量。

within('tbody') do
  all('tr').each do |line|
    within(line) do        
      unless page.has_css?('United Kingdom', wait: false)
        if page.has_css?('span', text: 'Austria', wait: false)
          find('input[id*="_name-selectized"]').click
          find('div[data-selectable]', text: austria_person.name).click
        end
      end
    end
  end
end

如果每行有很多跨度,你也可以通过切换到XPath来检查XPath表达式中的文本(而不是使用line.has_css?('span', text: 'Austria', wait: false)选项)来加速text,因为它这意味着浏览器会找到正确的跨度,而不是将每个跨度返回到Capybara,然后必须检查文本。