在这个问题上我已经挠了几个小时的头,最终需要放弃并询问。至少在此期间我学到了更多关于RSpec和Capybara的知识,但显然还不够。
subject { page }
describe "Help page" do
before { visit help_path }
it { should have_valid_header_and_title('Help', 'Help') }
end
失败,错误为
expected #<Capybara::Session> to have valid header and title "Help" and "Help" ./spec/features/static_pages_spec.rb:18:in `block (3 levels) in <top (required)>'
-e:1:in `load'
-e:1:in `<main>'
我有一个匹配have_valid_header_and_title的匹配器:
RSpec::Matchers.define :have_valid_header_and_title do |heading, page_title|
match do |page|
if (heading) then
expect(page.body).to have_selector('h1', text: heading)
end
expect(page.body).to have_selector('title', text: full_title(page_title))
end
end
和一个用于full_title的助手函数:
def full_title(page_title)
base_title = "Homewatch"
if page_title.empty?
base_title
else
"#{base_title} | #{page_title}"
end
end
最后,这是page.body的组成部分(使用插入调试的打印):
"<!DOCTYPE html>\n<html>\n<head>\n <title>Homewatch | Help</title>...
调试时,我看到full_title返回"Homewatch | Help“,它应该与title元素匹配,并且有一个包含"Help”的h1元素。所以它应该会通过!
我试过page.should和page.body.should而不是expect(page.body).to,我试过has_selector?这只会给出一个未定义的名称错误,以及其他各种情况。
使用rails 3.2.18、rspec-rails 3.1.0、capybara 2.4.4和capybara-webkit 1.3.1
我开始怀疑某个地方的版本不兼容。
发布于 2014-11-19 04:37:48
我想通了。它是这个logged issue的结果。
问题是title元素不会被一些web驱动程序发现(它被认为是不可见的)。在Capybara通过添加一个visible:切换到have_selector和has_selector修复了这个问题。我将我的匹配器更改为:
RSpec::Matchers.define :have_valid_header_and_title do |heading, page_title|
match do |page|
if (heading) then
expect(page.body).to have_selector('h1', text: heading)
end
Capybara.string(page.body).has_selector?('title', text: full_title(page_title), visible: false)
end
end
https://stackoverflow.com/questions/27008746
复制相似问题