问题: 给定表格,特定内容应与特定标题显示在同一列中。
澄清: 我无法以数字方式测试列位置,或者至少我不能用这种方式对其进行硬编码,因为列数可以根据各种其他条件而改变,我不想让我的测试变得脆弱。
示例:的
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
先谢谢
答案 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语法,但它应该足够接近你的位置。
答案 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>
是要选择的行的索引。