Capybara:如何通过在类中使用多个属性来查找类

时间:2016-11-16 08:58:26

标签: capybara

我想找到包含特定文本(本例中为名称)并在其中启用按钮的第一类。

我有这样的来源

 <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运算符或任何其他方式来查找具有特定文本和按钮的类。 还想提一下这些类的位置可以是随机的,所以不能说简单地找到最后一堂课。

2 个答案:

答案 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}}