2017-05-25 56 views
1

在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效果逃跑,并参考?

回答

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 
+0

太好了。谢谢。 。 – sawa

+1

你的回答引导我到正确的地方去寻找并提供了很大的帮助,但我想出了一个更简单的解决方案。对不起,我会将接受的答案移到我的。 – sawa

1

我找到了一种方法来做到这一点。使用page.document

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 
+0

hm'page.find(..)' - 没有工作? –

+0

它为什么会起作用? – sawa