19 votes

Comment puis-je tester le titre de la page avec Capybara 2.0 ?

Essayer de tester que la page contient <title>My Title</title> avec :

# 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

Message d'erreur :

 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.

Je sais que j'oublie quelque chose de douloureusement évident, mais je n'arrive pas à savoir ce que c'est ? Est-ce que <title> les balises ne sont plus considérées comme des "sélecteurs" ?!? Ou... ?!?

Editer (info débogueur) :

Si je descends dans le débogueur comme le suggère intelligemment @shioyama, il est clair que le page.body contient <title>My Title</title> . La même page.body qui contient <h2>Welcome to My Title Project</h2> et passe !

Il semble trouver le <title> ... </title> mais pas My Title en son sein. Mais il trouve My Title plus loin dans la page dans <a href=\"/\" class=\"brand\">My Title</a> et/ou dans <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. 
...

Que puis-je essayer d'autre dans le débogueur pour comprendre pourquoi have_selector ?('title', text : ...) échoue ?

Alors, quelle est la bonne façon de tester un titre dans Capybara 2.0 ?

0voto

Steve Tipton Points 33

Je sais que cette question a déjà une réponse acceptée, mais pour ce que ça vaut, vous pouvez faire ce qui suit, en moins de lignes de code :

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

Cela permet d'accéder à l'élément driver natif ; de plus, comme Capybara 2.0 ignore le texte invisible (le titre est invisible sauf pour le navigateur), vous auriez besoin de cela (ou d'une solution de contournement similaire) pour satisfaire ce cas. (Voir https://github.com/jnicklas/capybara/issues/863 )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X