18

我正在尝试测试排序是否适用于我正在测试的应用程序。我添加了 2 个条目“a”和“b”。我想测试 a 出现在 b 之前。html如下:

<ul id="attendee-list" class="bars">
<div>
    <li id="attendee-812202" class="bar border link attendee">
    <a class="expandable clearfix" href="#!/person/812202/">
</div>
     <div class="description">
     <p class="title">a</p>
     <p class="subtitle"></p>
     <p class="subtitle"></p>
</div>
</a>
</li>
</div>
<div>
     <li id="attendee-812206" class="bar border link attendee">
     <a class="expandable clearfix" href="#!/person/812206/">
     <div class="description">
     <p class="title">b</p>
<p class="subtitle"></p>
<p class="subtitle"></p>
</div>
</a>
</li>
</div>
</ul>

所以我尝试过的是以下内容:

  find("ul.bars li:nth-child(1) a div.description p.title").should have_content("a")
  find("ul.bars li:nth-child(2) a div.description p.title").should have_content("b")

但是我得到一个模棱两可的匹配错误。有谁知道我在这里做错了什么,或者可能是另一种验证方法?

4

1 回答 1

36

问题

问题是li:nth-child(1). 这表示要找到一个li是其父级的第一个子级的。由于每个li都包含在 a 中div,因此两个li元素都是第一个子元素 - 即两个标题都由选择器返回ul.bars li:nth-child(1) a div.description p.title(因此是模棱两可的匹配)。

解决方案 1 - 查找所有

我认为最简单的解决方案是使用 css-selector 返回所有标题,然后使用 Capybara 检查第一个和第二个标题。

# Get all titles
titles = page.all("ul.bars li a div.description p.title")

# Make sure that the first and second have the correct content
titles[0].should have_content("a")
titles[1].should have_content("b")

解决方案 2 - Xpath

如果您不想获取所有内容(可能页面上太多),另一种解决方案是尝试 xpath。它不是很漂亮,但你可以这样做:

page.find(:xpath, '(//ul[@class="bars"]/div/li/a/div[@class="description"]/p[@class="title"])[1]').should have_content("a")
page.find(:xpath, '(//ul[@class="bars"]/div/li/a/div[@class="description"]/p[@class="title"])[2]').should have_content("b")
于 2013-07-30T13:30:33.233 回答