如何在Capybara中获取父节点?

san*_*rew 81 ruby bdd ruby-on-rails cucumber capybara

我正在使用许多jQuery插件,它经常创建没有id或其他标识属性的DOM元素,并且在Capybara中获取它们的唯一方法(例如用于点击) - 是为了让他们的邻居(其祖先的另一个孩子)首先.但我没有找到任何地方,例如Capybara支持这样的事情:

find('#some_button').parent.fill_in "Name:", :with => name
Run Code Online (Sandbox Code Playgroud)

Pas*_*auf 106

我真的觉得jamuraa的答案很有帮助,但是在我的情况下,使用完整的xpath给了我一个字符串的噩梦,所以我很高兴地利用了在Capybara中连接find的能力,允许我混合css和xpath选择.您的示例将如下所示:

find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name
Run Code Online (Sandbox Code Playgroud)

Capybara 2.0更新:find(:xpath,".//..")很可能会导致Ambiguous match错误.在这种情况下,请first(:xpath,".//..")改用.

  • 你不需要`.// ..`来找到父 - 只需`..`就足够了,而且这也不是模棱两可的. (25认同)

jam*_*raa 38

用capybara和CSS没办法做到这一点.我过去曾使用XPath来实现这个目标,它确实有一种方法来获取父元素并得到Capybara的支持:

find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
Run Code Online (Sandbox Code Playgroud)

  • 当我执行类似的xpath查找时,我得到一个Nokogiri错误,表示该表达式无效.我在表达式中添加了一个开放方形braket前面的星号来修复表达式:`find(:xpath,'//*[@ id ="some_button"]/..')` (2认同)

B S*_*ven 29

我发现以下内容确实有效:

find(:xpath, '..')
Run Code Online (Sandbox Code Playgroud)

Capybara已更新以支持此功能.

https://github.com/jnicklas/capybara/pull/505


Ben*_*avi 10

如果你偶然发现了这个试图弄清楚如何找到任何父节点(如在祖先中)节点(如@vrish88对@Pascal Lindelauf的答案中的暗示所示):

find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')
Run Code Online (Sandbox Code Playgroud)


T. *_*ter 7

这个答案与如何操作同级元素有关,我认为这是原始问题所暗示的

您的问题假设只需稍作调整即可。如果动态生成的字段看起来像这样并且没有 id:

<div>
  <input></input>
  <button>Test</button>
</div>
Run Code Online (Sandbox Code Playgroud)

您的查询将是:

find('button', text: 'Test').find(:xpath, "..").find('input').set('whatever')
Run Code Online (Sandbox Code Playgroud)

如果动态生成的输入确实附带了一个 id 元素(尽管在 angular 中要小心这些,但它们不会根据添加和删除元素而改变),它会是这样的:

find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')
Run Code Online (Sandbox Code Playgroud)

希望有帮助。


Fot*_*ton 5

正如 @Tyler Rick Capybara 在评论中提到的,这些天有方法[ ancestor(selector)sibling(selector)