Capybara: Wie teste ich den Titel einer Seite?


Antworten:


102

Seit der Version 2.1.0 von Capybara gibt es in der Sitzung Methoden, um mit dem Titel umzugehen. Du hast

page.title
page.has_title? "my title"
page.has_no_title? "my not found title"

So können Sie den Titel wie folgt testen:

expect(page).to have_title "my_title"

Laut github.com/jnicklas/capybara/issues/863 funktioniert Folgendes auch mit Capybara 2.0 :

expect(first('title').native.text).to eq "my title"

14

Dies funktioniert unter Rails 3.1.10, Capybara 2.0.2 und Rspec 2.12 und ermöglicht den Abgleich von Teilinhalten:

find('title').native.text.should have_content("Status of your account::")

1
Vielen Dank! Ich habe dies tatsächlich verwendet, um Capybara zu patchen, siehe meine Antwort unten.
Jake

13

Sie sollten in der Lage sein, nach dem titleElement zu suchen , um sicherzustellen, dass es den gewünschten Text enthält:

page.should have_xpath("//title", :text => "My Title")

Ich erhalte einen Fehler / Fehler: page.should have_xpath ("// title", "home") falsche Anzahl von Argumenten (3 für 2)
Nerian

Und der Code lautet: Szenario "Der Benutzer ist angemeldet und kann seine Homepage sehen" besuchen Sie die Seite ('/'). Sollte have_xpath ("// title", "home") enden
Nerian

Hoppla, ich habe vergessen, dass der zweite Parameter ein Hash sein soll ... Überprüfen Sie meine überarbeitete Antwort.
Dylan Markow

Ich wollte das nicht wirklich als Antwort posten, obwohl ich denke, dass es sein könnte (ich weiß, dass es nicht sehr rubinrot ist). page.should have_content('<title>Your Title</title>')
Tass

8
Dieser Code funktioniert nicht mehr mit Capybara 2: github.com/jnicklas/capybara/issues/863
Mic92

3

Ich habe dies meinem Spezifikationshelfer hinzugefügt:

class Capybara::Session
  def must_have_title(title="")
    find('title').native.text.must_have_content(title)
  end
end

Dann kann ich einfach verwenden:

it 'should have the right title' do
  page.must_have_title('Expected Title')
end

Das ist eine schöne Ergänzung zum Spezifikationshelfer!
jpw

2

Das Testen des Titels jeder Seite kann mit RSpec viel einfacher durchgeführt werden.

require 'spec_helper'

describe PagesController do
  render_views

  describe "GET 'home'" do
    before(:each) do
      get 'home'
      @base_title = "Ruby on Rails"
    end

    it "should have the correct title " do
      response.should have_selector("title",
                                :content => @base_title + " | Home")
    end
  end
end

2
Das ist einfacher als page.should have_xpath ("// title" ,: text => "My Title")?
Mike Blyth

1
Das Rendern von Ansichten in Controller-Tests ist nicht meine Sache. Ich stimme für die Verwendung von Integrationstests (und Capybara) zur Überprüfung des Pastetentitels.
Grimmo

2
Capybara 2 akzeptiert nur: Text nicht: Inhalt als Parameter. Der Inhalt eines Titel-Tags kann nicht mit der neuesten Capybara überprüft werden: github.com/jnicklas/capybara/issues/863
Mic92

2

Um den Titel einer Seite mit Rspec und Capybara 2.1 zu testen, können Sie verwenden

  1. expect(page).to have_title 'Title text'

    Eine andere Option ist

  2. expect(page).to have_css 'title', text: 'Title text', visible: false
    Seit Capybara 2.1 ist die Standardeinstellung Capybara.ignore_hidden_elements = trueund da das Titelelement unsichtbar ist, benötigen Sie die Option visible: falsefür die Suche, um nicht sichtbare Seitenelemente einzuschließen.


0

Sie müssen nur die festlegen , subjectum pagedann für die Seite eine Erwartung schreiben titleMethode:

subject{ page }
its(:title){ should eq 'welcome to my website!' }

Im Zusammenhang:

require 'spec_helper'

describe 'static welcome pages' do
  subject { page }

  describe 'visit /welcome' do
    before { visit '/welcome' } 

    its(:title){ should eq 'welcome to my website!'}
  end
end

-1

it { should have_selector "title", text: full_title("Your title here") }

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.