合并两个Capybara元素数组

时间:2015-07-14 07:58:10

标签: arrays ruby cucumber capybara

这与我昨天发布的something类似,但我与我面前的实际情况混淆了。我有两个数组需要合并到相同的索引值但我有capybara elements而不是字符串和整数。

实施例

@returned_names = page.all('#results > table.result > tbody > tr.data:first-of-type > td')
@returned_yobs = page.all('#results > table.result > tbody > tr.data:nth-child(2) > td')

# Returns
@returned_names = [#<Capybara::Element tag="td">, #<Capybara::Element tag="td">, #<Capybara::Element tag="td">]
@returned_yobs = [#<Capybara::Element tag="td">, #<Capybara::Element tag="td">, #<Capybara::Element tag="td">]

所以根据昨天的答案将这些合并在一起,我应该做的匹配索引值

@collection = @returned_names.zip(@returned_yobs).map { |r| r.join(' ') }
# Returns
["#<Capybara::Node::Element:0x000000038c50e8> #<Capybara::Node::Element:0x000000036fadf8>",
 "#<Capybara::Node::Element:0x000000038c50c0> #<Capybara::Node::Element:0x000000036fadd0>",
 "#<Capybara::Node::Element:0x000000038c5020> #<Capybara::Node::Element:0x000000036fada8>"]

到目前为止,它看起来正在做正确的事情。我需要将其转换为其文本值的数组,但是当我这样做时

@collection.map { |t| t.text }

我收到错误

undefined method `text' for #<String:0x00000001938310>

我猜我不能从这里映射,因为我现阶段没有可枚举的对象?

有没有办法让@collection回到可枚举的对象,以便我可以映射文本值?

2 个答案:

答案 0 :(得分:1)

Array#join将每个对象(即节点)转换为字符串。这应该有效:

@returned_names.zip(@returned_yobs).map { |name, yob| "#{name.text} #{yob.text}" }

答案 1 :(得分:0)

怎么样:

@collection.each { |capybara_element| }.map(&:text)

或更详细但会做同样的事情:

@text_collection = []
@collection.each do |element|
  @text_collection.push(element.text)
end