sal*_*ost 13 ruby rspec ruby-on-rails capybara
我使用rspec 2.6.0和Capybara 1.1.1进行验收测试.
有如下视图:
<tr >
<td>Team 3 Name</td>
<td>true</td>
<td><a href="/teams/3">Show</a></td>
<td><a href="/teams/3/edit">Edit</a></td>
<td><a href="/teams/3">Deactivate</a></td>
</tr>
<tr >
<td>Team 4 Name</td>
<td>true</td>
<td><a href="/teams/4">Show</a></td>
<td><a href="/teams/4/edit">Edit</a></td>
<td><a href="/teams/4">Deactivate</a></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
我想写一个验收测试,说明:"团队3没有'停用'链接." 我希望以下内容失败:
within('tr', :text => 'Team 3 Name') do |ref|
page.should_not have_selector('a', :text => 'Deactivate')
end
Run Code Online (Sandbox Code Playgroud)
但它过去了.为了进一步测试正在发生的事情,我写了荒谬的:
lock = false
within('tr', :text => 'Team 3 Name') do |ref|
page.should have_selector('a', :text => 'Deactivate')
page.should_not have_selector('a', :text => 'Deactivate')
lock = true
end
lock.should be_true
Run Code Online (Sandbox Code Playgroud)
哪个也通过了.
我假设has_selector()调用的作用域不受within()块的限制,但我不确定为什么会这样.水豚文档使用这种模式,似乎没有提到任何陷阱.在内部使用以限制我的选择范围的正确方法是什么?谢谢./ Salernost
Mar*_*rry 12
我自己还在学习水豚,但你尝试过have_link
而不是have_selector
吗?我也认为你不需要|ref|
.例如:
lock = false
within('tr', :text => 'Team 3 Name') do # omit |ref|
page.should have_link('Deactivate')
page.should_not have_link('Deactivate')
lock = true
end
lock.should be_true
Run Code Online (Sandbox Code Playgroud)
与Capybara进一步讨论后,我在这里看到了几个潜在的问题:
within
可能会默默地忽略这个text
领域.您会注意到这些示例仅显示没有其他参数的CSS或XPath查找程序.within
使用text
,它可能无法在这里工作,因为你要求它看<tr>
,但文本在<td>
.page
即使你在一个within
街区,主题仍有可能仍然以整个页面为目标.这些within
例子主要是关于使用fill_in
或click
.Beware the XPath // trap下的示例是个例外.至于创建within
块,您可以为表行提供唯一的ID并使用CSS搜索它们,或者您可以编写针对第一个匹配行的特定XPath.
后者的问题是您要使用within
on <tr>
,但您用于定位的文本位于<td>
子元素内.因此,例如,此XPath应该找到包含文本的表格单元格,Team 3 Name
但之后您只处理within
第一个单元格,而不是整行.
within(:xpath, "//tr/td[normalize-space(text())='Team 3 Name'") do
Run Code Online (Sandbox Code Playgroud)
有一些方法可以使用XPath"备份"到父元素,但我不知道该怎么做,我已经读过这不是一个好习惯.我认为你最好的选择就是生成id,这样你的行就像这样开始:
<tr id="team_3">
Run Code Online (Sandbox Code Playgroud)
然后用一个简单的目标
within("tr#team_3")
Run Code Online (Sandbox Code Playgroud)
我还要推荐Mark Berry提到的最后一种方法,即为您的每个表元素添加id。
<tr id="team_3">
Run Code Online (Sandbox Code Playgroud)
然后以
within("tr#team_3")
Run Code Online (Sandbox Code Playgroud)
Capybara在通过xpath进行选择时给了我一些问题,因为它似乎无法始终如一地工作,尤其是在CI服务中。
我也想在本部分的相同答案上注明:
页面主题很有可能仍然以整个页面为目标,即使您位于一个内部块中。这些示例主要是关于使用fill_in或click。例外是“当心XPath陷阱”下的示例。
在较旧的版本中可能就是这种情况,但是在当前版本的Capybara中,page
在within
块内部调用仅检查目标页面的一部分。因此,使用Mark的上述示例:
within("tr#team_3") do
expect(page).to have_content 'Team 3 Name'
# => true
expect(page).to have_content 'Team 4 Name'
# => false
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23837 次 |
最近记录: |