期望css“标题”与水豚文本

时间:2012-04-22 15:52:35

标签: rspec capybara

我在铁轨中使用水豚代替webrat。我已经安装了水豚并在Gemfile中使用了宝石'capybara'。当我使用

page.should have_selector("title", :text => "anything title")

它给出了错误

Failure/Error: page.should have_selector("title", :text => "anything title")
expected css "title" with text "anything title" to return something

测试文件如下:

require 'spec_helper'

describe "Test pages" do  
  describe "Home page" do    
    it "should have the content 'Demo App'" do
    visit '/test_pages/home'      
    page.should have_selector("title", :text => "anything title")               
  end
 end
end

5 个答案:

答案 0 :(得分:12)

不确定您使用的是哪个版本的宝石,但我遇到了类似的实例,其中使用:text失败但是当我使用时:内容它通过了测试。我在Ubuntu Lucid Lynx上使用rails 3.2.3,rspec-rails 2.9.0,capybara 1.1.2和therubyracer gems。

尝试替换

page.should have_selector("title", :text => "anything title")

page.should have_selector("title", :content => "anything title")

答案 1 :(得分:4)

这里的问题是浏览器会将<title>标记视为不可见。 (感谢您DreadPirateShawn链接到此主题的issue

获得标题没有“干净”的方式,但是通过一些黑客攻击你仍然可以通过以下方式测试标题的价值:

first('head title').native.text.should == "WhateverYourTitleNeedsToBe"

请勿使用:content符号,因为在较旧版本的Capybara中,无效标记将被忽略,并且看起来好像您的测试已通过。较新的版本将为您提供一个很好的错误消息,如:

  

引发ArgumentError:    无效键:内容,应为以下之一:text,:visible,:between,:count,:maximum,:minimum

答案 2 :(得分:1)

我有一个类似的问题,只是为了让你知道,使用:Capybara不支持内容,它应该是:text。

问题:内容是Capybara无法识别它然后被忽略并显示为PASSED,但这是一种错误的行为。

因此,如果您使用Capybara,请将每个:content切换为:text以查看测试是否真的通过,可能没有注意到错误。

答案 3 :(得分:0)

我遇到了同样的问题。根据经验,我发现了以下内容:

page.should have_selector("title", :text => "AnyTitle")

将期望您的html输出包含如下标记:

<title text="AnyTitle"/>

但是,如果您使用:content而不是:text,如下所示

page.should have_selector("title", :content => "AnyTitle")

然后它会期望您的html输出包含如下标记

<title>AnyTitle</title>

因此,如果生成的html呈现包含<title text="AnyTitle"/>标记,则应使用:text 否则,如果生成的html呈现包含<title>AnyTitle</title>标记,则可能需要使用:content。

P.S。我的宝石环境: 水豚-2.0.2, 轨-3.2.12, RSpec的护栏-2.12.2, webrat-0.7.3 如果删除webrat,那么单独的Capybara就无法识别“:conetnt”关键字。

但修复它的干净方法是: 摆脱webrat并安装一个稳定的Capybara-1.1.2,即Gemfile中的

#gem webrat
gem 'capybara', '1.1.2'

请参阅prusswan's answer

答案 4 :(得分:0)

这样做:

expect(page).to have_title("some title")