如果没有姓名,身份证或标签文本,如何在Capybara中复选框?

时间:2016-01-22 05:34:46

标签: ruby capybara

我是新手。请指教。如何选择我的复选框?

<ul class="phrases-list" style="">
<li>
<input type="checkbox" class="select-phrase">
<span class="prase-title"> Dog - Wikipedia, the free encyclopedia </span>
<a href="en.wikipedia.org">(en.wikipedia.org)</a>
<div class="prase-desc hidden">The domestic dog (Canis lupus familiaris or Canis familiaris) is a domesticated...</div>
</li>

以下内容对我不起作用:

When /I check box "([^\"]+)"$/ do |label|
      page.check(label)
end  
步骤:我勾选“狗 - 维基百科,免费百科全书”

2 个答案:

答案 0 :(得分:0)

如果您可以更改html,请将输入和span包装在标签元素

<ul class="phrases-list" style="">
<li>
  <label>
    <input type="checkbox" class="select-phrase">
    <span class="prase-title"> Dog - Wikipedia, the free encyclopedia </span>
  </label>
  <a href="en.wikipedia.org">(en.wikipedia.org)</a>
  <div class="prase-desc hidden">The domestic dog (Canis lupus familiaris or Canis familiaris) is a domesticated...</div>
</li>

其中包含点击“狗 - 维基百科...”的额外好处...&#34;文本也会触发复选框。通过该更改,您的步骤应该按照书面形式工作如果你不能修改html那么事情变得更加困难 像

这样的东西
find('span', text: label).find(:xpath, './preceding-sibling::input').set(true)

应该有用,虽然我很好奇你是如何使用JS中的这些复选框而没有将它们绑定到任何特定值

答案 1 :(得分:0)

假设您无法更改HTML。在这种情况下,通过XPath查询元素可能最简单。例如:

# Here's the XPath query
q = "//span[contains(text(), 'Dog - Wikipedia')]/preceding-sibling::input"

# Use the query to find the checkbox.  Then, check the checkbox.
page.find(:xpath, q).set(true)

好的 - 它没有它看起来那么糟糕!让我们分析一下这个XPath,这样我们就能理解它在做什么:

//span

第一部分说&#34;搜索整个HTML文档并发现所有&#34; span&#34;元素。当然,可能有很多&#34; span&#34; HTML文档中的元素,因此我们需要对此进行限制:

//span[contains(text(), 'Dog - Wikipedia')]

现在我们只搜索&#34; span&#34;包含文本的元素&#34; Dog - Wikipedia&#34;。据推测,该文本将唯一地标识所需的&#34; span&#34;页面上的元素(如果没有,则只搜索更多文本)。

此时,我们有&#34; span&#34;与所需&#34;输入相邻的元素&#34;元件。所以,我们可以查询&#34;输入&#34;元素使用&#34;前兄弟::&#34; XPath Axis

//span[contains(text(), 'Dog - Wikipedia')]/preceding-sibling::input