从'内'块

时间:2017-05-25 03:42:20

标签: ruby rspec capybara

在Capybara中,我有几个命令要在共享一些相同父节点的节点上执行,但在少数情况下,我需要引用一个完全不同的节点。这可以这样写:

find('.the .same #part').find('#different_part1').set...
find('.the .same #part').find('.different_part2').set...
find('#a_completely_different_path').set...
find('.the .same #part').find('#different_part3').set...
find('.the .same #part').find('.different_part4').set...

我想使用within方法将它们放在一起,但对于具有完全不同路径的节点,我需要引用within块之外的上下文。我不知道该怎么做:

within('.the .same #part') do
  find('#different_part1').set...
  find('.different_part2').set...
  # find('#a_completely_different_path').set...
  find('#different_part3').set...
  find('.different_part4').set...
end

如何暂时摆脱within的影响并参考'#a_completely_different_path'

2 个答案:

答案 0 :(得分:4)

查看within的来源,

def within(*args)
  new_scope = if args.first.is_a?(Capybara::Node::Base) then args.first else find(*args) end
  begin
    scopes.push(new_scope)
    yield
  ensure
    scopes.pop
  end
end

您应该可以向Session添加一个反转功能的方法,例如。

def without
  current_scope = scopes.pop
  yield
ensure
  scopes.push(current_scope)
end

这应该允许您执行以下操作:

within('.the .same #part') do
  find('#different_part1').set...
  find('.different_part2').set...
  without { find('#a_completely_different_path').set... }
  find('#different_part3').set...
  find('.different_part4').set...
end

答案 1 :(得分:2)

我找到了办法。使用within('.the .same #part') do find('#different_part1').set... find('.different_part2').set... page.document.find('#a_completely_different_path').set... find('#different_part3').set... find('.different_part4').set... end

BETWEEN