在 Capybara 中检查 table 的每一行是否有最快的方法?

Is there a fatest way to go check each line of a table in Capybara?

我正在使用 capybara 浏览一个 table,其中一列是国家名称,另一列是名称的下拉列表。

代码是这样的:

 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

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

由于大多数 Web 应用程序的异步特性,Capybara 对其大多数方法(默认情况下全部和第一个不提供)提供自动 waiting/retrying 行为。这对于大多数情况非常有用,您正在寻找您需要在页面上显示的内容,但是在像您这样的情况下,您根据页面上有或没有的内容来决定要做什么可能导致延误。

例如,在您的代码中,当您调用 line.has_css?('United Kingdom') 时,水豚正在等待 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(而不是使用 text 选项)来加快 line.has_css?('span', text: 'Austria', wait: false)因为这意味着浏览器会找到正确的跨度,而不是将每个跨度返回给 Capybara,后者必须检查文本。