编写XPath以使用Bootstrap测试Rails中的特定导航链接

时间:2014-02-20 02:43:14

标签: ruby-on-rails xpath capybara

在我的带有Bootstrap 2.3导航列表的Rails 3.2.16应用程序中,我想编写一个测试,确认特定项目是活动的,并且它具有正确的图标。我正在使用rspec 2.14.1和capybara 2.1.0。

我认为这样做的方法是使用水豚has_xpath测试,但我需要检查的类(“活动”和“fa-folder-open”)以及实际文本(“收件箱“)位于HTML层次结构的不同级别。

鉴于此HTML:

<ul class="nav nav-list" role="navigation">
  <li class="active">
    <a href="/messages/my/inbox">
      <i class="fa fa-folder-open fa-fw">
      </i> Inbox</a>
  </li>
  <li class="">
    <a href="/messages/my/draft">
      <i class="fa fa-folder fa-fw">
      </i> Draft</a>
  </li>
</ul>

是否有一个XPath会确认带有“收件箱”文本的链接是“活动的”并且具有“fa-folder-open”图标?

修改

我将示例HTML复制到XPath tester上方,其中“格式”按钮不仅做了一些漂亮的格式化,而且删除了结束</i>标记。原始HTML不是很漂亮:

<ul class="nav nav-list" role="navigation">
  <li class="active">
    <a href="/messages/my/inbox">
      <i class="fa fa-folder-open fa-fw"></i> Inbox
</a>  </li>
  <li class="">
    <a href="/messages/my/draft">
      <i class="fa fa-folder fa-fw"></i> Draft
</a>  </li>
</ul>

2 个答案:

答案 0 :(得分:0)

尝试:

expect(page).to have_xpath("//li[contains(@class, 'active')//i[contains(text()='Inbox' and contains(@class, 'fa-folder-open')]")

答案 1 :(得分:0)

Nicolas的回答有助于建议我使用contains

This SO answer帮助我看到我可以嵌套括号来查找嵌套节点。

www.xpathtester.com进行了一些试验和错误,我想出了这个XPath:

//li[contains(@class,'active') and a[text()=' Inbox' and i[contains(@class,'fa-folder-open')]]]

修改

上面的我的XPath没有处理原始HTML(参见编辑过的问题)。 XPath没有找到“收件箱”文本,可能是由于<\a>标记之前的换行符。感谢this answernormalize-space()没有text()参数的示例,这个XPath有效:

//li[contains(@class,'active') and a[normalize-space()='Inbox' and i[contains(@class,'fa-folder-open')]]]

请注意,它必须查找'Inbox',而不是' Inbox'normalize-space()剥离前导和尾随空格(包括导致问题的换行符),因此必须从正在查找的文本中删除前导空格。