我想找到包含特定文本(本例中为名称)并在其中启用按钮的第一类。
我有这样的来源
<div class="some parent class">
<div class="class" id="1">
<div class="some other name">......</div>
<div class="button enabled">......</div>
</div>
<div class="class" id="2">
<div class="name">......</div>
<div class="button disabled">......</div>
</div>
<div class="class" id="3">
<div class="name">......</div>
<div class="button enabled">......</div>
</div>
</div>
我试过了
first('.class',text: 'name')
它找到了名字但是禁用了按钮的第一堂课。然后我试过了
first('.class',text: 'name', text: 'button text')
但看起来它在文本参数之间应用OR运算符并找到id为1的类。有没有办法在文本参数之间应用AND运算符或任何其他方式来查找具有特定文本和按钮的类。 还想提一下这些类的位置可以是随机的,所以不能说简单地找到最后一堂课。
答案 0 :(得分:1)
您可以找到具有指定文本的div
标记的所有。然后遍历这些以找到第一个也包含启用按钮的那个:
all('.class', text: 'name').find { |div| div.has_css?('div.button.enabled') }
使用单个XPath表达式可能会获得更好的性能。但是,它相当笨重,不值得付出努力:
first(
:xpath,
'//div
[contains(concat(" ", @class, " "), " class ")]
[.//text()[contains(., "name")]]
[.//div
[contains(concat(" ", @class, " "), " button ")]
[contains(concat(" ", @class, " "), " enabled ")]]'
)
答案 1 :(得分:1)
如果您只想匹配所包含的文字,可以使用正则表达式find('.class', text: /name.*button text/)
选项
find('.class', text: 'name'){ |node| node.has_button?('button text', wait: 0) }
如果你想确保它包含一个实际的按钮元素并且你正在使用Capybara v2.10 +,你可以使用类似
的过滤块{{1}}