黄瓜从3列表中读取数据?

时间:2013-11-11 15:26:37

标签: ruby automation selenium-webdriver cucumber bdd

我正在尝试从黄瓜的三列内联数据表中读取数据。

功能文件:

Then  I should see grades,exteriors, interiors and engines available:
  |grades            |exteriors         |  engine |
  |xdata-id-Elegance |xdata-id-NH-788p  |  12345  |
  |                  |xdata-id-NH737M   |         |
  |                  |xdata-id-NH731P   |         |
  |                  |xdata-id-R-539P   |         |

Step_definitions:

 Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
      data = table.rows_hash
      puts data['exteriors']
    end

这给了我错误只允许2行。

有没有人知道我可以访问的另一种方式,所有三列都使用表对象?

4 个答案:

答案 0 :(得分:3)

以更简单的方式为我工作,使用三列数据表:

def self.group_similar_changes(owner, target, change_type)
  # long query where it selects all rows where change_owner and change_target 
  # are the same as original        
  # also where cancelled is false
  # determine if cancelled (yaml)
  # if cancelled (do nothing)
  similar_changes = Notification.where(
    change_owner: owner, 
    change_target: target, 
    change_cancelled: false
  )
  similar_changes.each do |change|
    cancel_inverse_change(change, change.change_type)
      if change.cancelled?
        similar_changes.delete(change)
      end
    end
  end
end

def cancel_inverse_change(change, change_type)
  if change.inverse?(change_type)
    change.cancel
  end
end

def inverse?(possible_inverse_change)
  is_inverse = false
  change_types = YAML.load_file(File.join(NotificationManager::Engine.root, 'config/change_types.yaml'))
  if self.change_type == change_types[possible_inverse_change]['inverse']
    is_inverse = true
  end
  return is_inverse
end

这对我有用:

  Scenario: I am able to select a date range

    Given I am on the rejections tracker page as a superuser
    Then the date range filters work as expected
      | dateFrom   | dateTo     | variance    |
      | 12/05/2014 | null       | lesser than |
      | null       | 12/07/2014 | lesser than |
      | null       | null       | equal to    |

输出:

    Then(/^the date range filters work as expected$/) do |table|

      data = table.hashes
      date_from = []
      date_to = []
      variance = []

      data.each do |row|
        row.each do |key, value|
          if key.eql? "dateFrom"
            date_from << value
          elsif key.eql? "dateTo"
            date_to << value
          elsif key.eql? "variance"
            variance << value
          end
        end
      end

      puts date_from
      puts date_to
      puts variance
   end

答案 1 :(得分:2)

您可以使用raw获取表格,然后使用Ruby将其操作为您想要的表单。

例如,下面显示了如何获取表,然后将其转换为哈希,其中键是列标题,值是该列中值的数组。

Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
    data = table.transpose.raw.inject({}) do |hash, column| 
        column.reject!(&:empty?)
        hash[column.shift] = column
        hash    
    end

    p data['grades']
    #=> ["xdata-id-Elegance"]
    p data['exteriors']
    #=> ["xdata-id-NH-788p", "xdata-id-NH737M", "xdata-id-NH731P", "xdata-id-R-539P"]
    p data['engine']
    #=> ["12345"]
end

答案 2 :(得分:0)

rows_hash方法适用于特定类型的表。具体来说,它是一个有两列的表格,标题在左栏中。例如:

|grades   |xdata-id-Elegance|
|exteriors|xdata-id-NH-788p |
|engine   |12345            |

但是,您的数据不止一行,因此您使用的是正确类型的表格。

您可以使用常规hashes方法,它将返回一个哈希数组,然后从中提取所需的数据。例如:

Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
  data = table.hashes

  exteriors = []

  data.each do |row|
    row.each do |key, value|
      exteriors << value if key == 'exteriors'
    end
  end

  puts exteriors
end

此代码创建一个名为exteriors的空数组,然后迭代data数组中的每个值,而该数组又是原始表中非标题行的哈希值。这些散列中的每一个都使用标题作为键来表示表中某个行的值。

对于表中的每个非标题行,它然后遍历散列并用数据填充exteriors数组。

答案 3 :(得分:0)

我以稍微不同的方式使用了表格。

&#34; table.hashes&#34;将表行分成数组,这样可以很容易地访问它。

所以我们可以像这样访问第一行:

puts data[0]

将导致: {&#34;成绩&#34; =&gt;&#34; xdata-id-Elegance&#34;,&#34;外部&#34; =&gt;&#34; xdata-id-NH-788p&#34; ,&#34;引擎&#34; =&gt;&#34; 12345&#34;}

然后可以遍历对象并使用&#34; .each&#34;打印所有对象,如下所示:

data.each do |row|
puts row
end

这将基本上打印您的表中的所有值分组到数组(这是您的行)。所以上面提到了一堆结果。

现在还可以直接访问您想要的密钥,只需执行以下操作:

data.each do |row|
puts row["exteriors"]
end

仅打印该列中的值。