如何测试与水豚2.0网页标题?(How can I test the page title with

2019-06-21 07:43发布

试图测试页面包含<title>My Title</title>与:

# spec/features/reports_spec.rb
require 'spec_helper'

feature "Archive Management" do
  subject { page }

  describe "Index Page" do
    before(:all) { 10.times { FactoryGirl.create(:randomreport) } }
    after(:all) { Report.delete_all }

    describe "when no search terms present" do
      before { visit reports_path }

      it { should have_selector('title', text: 'My Title') } # <= Fails w/Capybara 2.0
      it { should have_selector('title') }                   # <= passes
      it { should have_text('My Title') }                    # <= passes
      it { should have_selector('h2', text: "Welcome") }     # <= passes
    end
  end
end

错误信息:

 Failure/Error: it { should have_selector('title', text: base_title) }
 Capybara::ExpectationNotMet:
   expected to find css "title" with text "My Title" but there were no matches. Also found "", which matched the selector but not all filters.

我知道我可以俯瞰非常明显,但无法弄清楚它是什么? 是<title>标签不再被认为是“选择”?!? 要么...?!?

编辑(调试信息):

如果我下拉到如此巧妙的@shioyama建议调试器很明显的是,page.body包含<title>My Title</title> 包含相同page.body <h2>Welcome to My Title Project</h2>和传递!

这似乎找到<title> ... </title>标签而不是My Title内它。 但它确实找到My Title后面的页面中<a href=\"/\" class=\"brand\">My Title</a>和/或<h2>Welcome to The My Title Project</h2>

(rdb:1) p page
#<Capybara::Session>
(rdb:1) p page.body
"<!DOCTYPE html>\n<html>\n<head>\n<title>My Title</title>\n
<meta content='research, report, technology' name='keywords'>\n<meta 
content='Some Project' name='description'>\n<link href=\"/assets/application.css\"
...
</head>\n<body>\n<header class='navbar navbar-fixed-top 
navbar-inverse'>\n<div class='navbar-inner'>\n<div class='container'>\n
<a href=\"/\" class=\"brand\">My Title</a>\n<div class='pull-right'>\n
<ul class='nav'>\n<li><a href=\"/about\">About</a></li>\n<li><a href=\"/help\">Help</a>
</li>\n</ul>\n<form accept-charset=\"UTF-8\" action=\"/reports\" 
class=\"navbar-search\" method=\"get\"><div style=\"margin:0;padding:0;display:inline\">
<input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /></div>\n
<input class=\"search-query\" id=\"query\" name=\"query\" 
placeholder=\"Search\" type=\"text\" />\n</form>\n\n</div>\n</div>\n</div>\n</header>\n\n
<div class='container'>\n<div class='hero-unit center'>\n<h1>My Title</h1>\n
<h2>Welcome to The My Title Project</h2>\n<p>Lorem ipsum dolor sit amet, consectetur 
adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
...

还有什么更好的尝试在调试器来找出原因have_selector(“标题”,文:......)?失败?

那么,什么是测试在水豚2.0标题的正确方法?

Answer 1:

我有同样的问题,当我升级到2.0水豚,并设法通过创建使用下面的自定义的RSpec匹配来解决这些问题Capybara.string

规格/支持/ utilities.rb

RSpec::Matchers::define :have_title do |text|
  match do |page|
    Capybara.string(page.body).has_selector?('title', text: text)
  end
end

现在,在规格文件,其中subject { page }我可以使用:

it { should have_title("My Title") }
it { should_not have_title("My Title") }

顺便说一句,在这个问题上的对话是让我这个答案非常有帮助的,所以谢谢!

更新1:

如果你不想创建一个自定义的RSpec匹配,这要归功于这个StackOverflow的答案被用户dimuch现在我知道,你可以打电话have_selector直接page.source (化名page.body )来测试不可见的DOM元素:

it "should show the correct title" do
  page.source.should have_selector('title', text: 'My Title')
end

或者subject { page }

its(:source) { should have_selector('title', text: 'My Title') }

更新2:

从水豚2.1,还有内置have_title / has_title? 的匹配,否定了这个答案自定义的RSpec匹配的需要。 此外, its(:source) { ... }在更新1所述的试验似乎水豚2.1下断裂; 我已经证实了have_title / has_title? 如预期,因此它可能是最好的语法如下去,如果你打算升级:

subject { page }

it { should have_title("My Title") }
it { should_not have_title("My Title") }

当使用expect的内语法it / scenario块:

expect(page).to have_title("My Title")
expect(page).to_not have_title("My Title")


Answer 2:

水豚2.1改变了查询标题元素的支持。 因此,使用在有选择查询在以这种方式在HTML文档的头部标题元素会失败“page.should have_selector(‘标题’,:文本=>‘一些文本’)从我了解的首选方法。在水豚2.1新的API是用“page.should have_title(‘一些文本’)”查询标题元素应该工作。



Answer 3:

我从1.x版本升级到水豚> 2.0时,碰到了同样的问题

问题是,水豚忽略它的匹配不可见的文本。 解决这个问题最彻底的方法是使用:visible => false的发现者选项。

it { should have_selector('title', text: 'My Title', visible: false) }

另一个(全局)选项设置:

Capybara.ignore_hidden_elements = false



Answer 4:

我用“shared_examples_for”时,可能的,因为其他的变化只有这个问题。 我还注意到,当我把

 <title>My Title</title> 
在页面(它不属于,也不会渲染)的机构,测试通过。 不是一件好事!

这工作:

 it{should have_title("My Title")} 

(水豚2.1.0,2.3.0 launchy,引入nokogiri 1.5.9,rspec的2.13)



Answer 5:

我看到这里可能存在两个问题:

  1. <title>标签存在的页面上,但文字My Title是其他地方的页面上,而不是在标签内。 这可以解释为什么其他的测试都通过了:有一个<title>标签在页面上这样have_selector('title')通过,且有My Title页面上的文本,以便have_text(base_title)通过。
  2. <title>标签包含文字My Title以及其他东西,这也可以解释,你看到的结果:有一个<title>标签在页面上这样have_selector('title')通过,并有文字My Title所以have_text(base_title)也通过,但是该text在选项have_selector是严格的,因此如果它发现一个字符串,它不完全等于它会失败My Title

可以检查使用XPath选择这两种可能性后者: should have_xpath("//title[contains(.,'#{base_title}')]") 如果通过,那么你很可能在你的标题文字一些空白或换行被绊倒have_selector了(我认为它忽视那些,但我可能是错的)。

希望帮助。



Answer 6:

我知道这有一个公认的答案了,但对于它的价值,你能做到以下几点,以较少的代码行:

title = first("head title").native.text
expect(title).to == "What you expect it to match"

这将允许访问本地驱动器元件, 此外,由于水豚2.0忽略不可见的文本(标题是不可见的,除了浏览器),你会需要这个(或类似的解决方法)来满足这种情况。 (见https://github.com/jnicklas/capybara/issues/863 )



文章来源: How can I test the page title with Capybara 2.0?