使用Capybara或Xpath查找表中给定列中是否存在内容?

时间:2011-11-02 16:08:09

标签: ruby xpath rspec capybara

问题: 给定表格,特定内容应与特定标题显示在同一列中。

澄清: 我无法以数字方式测试列位置,或者至少我不能用这种方式对其进行硬编码,因为列数可以根据各种其他条件而改变,我不想让我的测试变得脆弱。

示例:

Name || Phone Number || Address
==============================================================
 ... || ...          || ...
 Joe || 555-787-7878 || 42 Nowhere Lane, Mulberry, California
 ... || ...          ||

代码如下:

<table>
  <tr>
    <th>Name</th>
    <th>Phone Number</th>
    <th>Registered</th>
    <th>Address</th>
  </tr>
  <tr>
    ...
  </tr>

  <tr>
    <td>Joe</td>
    <td>555-377-7347</td>
    <td>Yes</td>
    <td>42 Nowhere Lane1, Mulberry1, California</td>
  </tr>
  <tr>
    <td>Jerry</td>
    <td>555-787-7878</td>
    <td>Yes</td>
    <td>50 Nowhere Lane, Mulberry, California</td>
  </tr>

  <tr>
    <td>Tom</td>
    <td>555-678-0987</td>
    <td>No</td>
    <td>43 Nowhere Lane2, Mulberry2, California</td>
  </tr>
  <tr>
    ...
  </tr>
</table>

方案: 我想确保正确的地址(42无处...)出现在标题为“地址”的列中。

我该怎么做?

解决方案可能就像一个像样的xpath查询一样简单,说实话,也许我甚至不需要任何特别“Capybara”相关的东西!

我遇到了类似的一个,但在这里我需要检查'Jerry'是否注册。请帮助我如何自动使用ruby / capybara

先谢谢

2 个答案:

答案 0 :(得分:1)

我认为您首先必须获取Address的位置,然后使用该信息从数据表中获取值。

类似于:

var x = count(/table/tr/th[.='Address']/preceding-sibling::*)+1.
var address = /table/tr/td[position()=${x}]

或者将它组合成类似的东西:

/table/tr/td[position()=(count(/table/tr/th[.='Address']/preceding-sibling::*)+1.)]

注意:我没有运行这些语句,所以我不知道它们是否是有效的xpath语法,但它应该足够接近你的位置。

参考:Find position of a node using xPath

答案 1 :(得分:1)

我认为@Snekse非常接近。以下是一些经过测试的表达式。以下内容返回与值为th的{​​{1}}对应的表格单元格:

Address

这可用于获取单元格的值:

/table/tr/td[(count(../../tr/th[.='Address']/preceding-sibling::*)+1)]

...然后您可以使用它来执行最终测试:

42 Nowhere Lane, Mulberry, California

如果地址匹配,这将返回单元格本身。它将返回一个空节点集,如果不存在这样的节点,它将在布尔上下文中计算为false。

您可能还需要指定要测试的行,这可以通过稍微修改表达式的开头来完成:

/table/tr/td[(count(../../tr/th[.='Address']/preceding-sibling::*)+1)]
                               [.='42 Nowhere Lane, Mulberry, California']

...其中/table/tr[$n]/<rest_of_expression> 是要选择的行的索引。