在我的带有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>
答案 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 answer的normalize-space()
没有text()
参数的示例,这个XPath有效:
//li[contains(@class,'active') and a[normalize-space()='Inbox' and i[contains(@class,'fa-folder-open')]]]
请注意,它必须查找'Inbox'
,而不是' Inbox'
。 normalize-space()
剥离前导和尾随空格(包括导致问题的换行符),因此必须从正在查找的文本中删除前导空格。