3 Stimmen

Capybara und before(:all) in rspec

Hier ist meine vollständige Spezifikation:

require 'spec_helper'

describe "Idea page", js: true do

  subject { page }

  before(:all) do
    create(:idea)
    visit root_path
    click_link "Log In"
  end

  context "Single idea" do
    before do
      page.find(:xpath, '//*[@id="accordion"]/div/div[1]/a').click
    end

    it { should have_selector('a',text:'Claim') }
    it "should have a button for reporting the idea"
    it "should have a button for opening all links"

    describe "Claiming" do
      before do
        click_link "Claim"
      end
      it {should have_selector('a', text:'Claimed')}
    end

  end
end

Ohne (:all) (d.h., wenn es sich nur um before im ersten Block), öffnet sich der Browser, klickt auf den Login-Link, geht auf die richtige Seite und klickt auf den Link. Schön.

Aber dann wird das Ganze noch einmal wiederholt, bevor versucht wird, den zweiten Link ("Claim") anzuklicken, was sowohl zeitaufwändig als auch fehleranfällig ist. Also habe ich versucht, dies zu beheben mit before(:all) .

Aber jetzt öffnet er einfach Firefox, wartet einen Moment und schließt ihn dann wieder, ohne etwas zu tun. Test fehlgeschlagen sagen:

Failures:

  1) Idea page Single idea 
     Failure/Error: page.find(:xpath, '//*[@id="accordion"]/div/div[1]/a').click
     Capybara::ElementNotFound:
       Unable to find xpath "//*[@id=\"accordion\"]/div/div[1]/a"
     # ./spec/features/ideas_spec.rb:15:in `block (3 levels) in <top (required)>'

  2) Idea page Single idea Claiming 
     Failure/Error: page.find(:xpath, '//*[@id="accordion"]/div/div[1]/a').click
     Capybara::ElementNotFound:
       Unable to find xpath "//*[@id=\"accordion\"]/div/div[1]/a"
     # ./spec/features/ideas_spec.rb:15:in `block (3 levels) in <top (required)>'

Offensichtlich, denn die Browser-Seite war leer.

Was vermisse ich? Ich danke Ihnen.

Edita: Vielleicht gibt es etwas Grundlegendes, das ich nicht verstehe. Mit before(:each) Das versucht der Test zu erreichen:

1) Loggen Sie sich in die Webapp ein und vergewissern Sie sich, dass es eine Schaltfläche "Claim" gibt.

2) Melden Sie sich bei der Webapplikation an. wieder , öffnen Sie das Akkordeon wieder und klicken Sie jetzt auf die Schaltfläche "Antrag", um zu sehen, was passiert.

Der Anfang eines jeden Schrittes ist also genau derselbe, der Browser macht immer wieder dasselbe. Ist das so gewollt?

Wenn ja, warum erhalte ich Fehler, wenn ich dies tue? Genauer gesagt, mit before(:each) Ich verstehe das:

Failures:

  1) Idea page Single idea Claiming 
     Failure/Error: it {should have_selector('a', text:'Claimed')}
     Selenium::WebDriver::Error::UnhandledAlertError:
       Modal dialog present
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/command_processor.js:10287:in `nsCommandProcessor.execute'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/driver_component.js:7328:in `Dispatcher.executeAs/<'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/driver_component.js:7488:in `Resource.handle'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/driver_component.js:7435:in `Dispatcher.dispatch'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/driver_component.js:10119:in `WebDriverServer/<.handle'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1935:in `unknown'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:2261:in `ServerHandler.handleResponse'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1168:in `Connection.process'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1616:in `RequestReader._handleResponse'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1464:in `RequestReader._processBody'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1333:in `RequestReader.onInputStreamReady'
     # ./spec/features/ideas_spec.rb:26:in `block (4 levels) in <top (required)>'

Obwohl ich sehe, dass der Browser auf die Schaltfläche klickt und sie auf "Beansprucht" stellt, wird kein modales Dialogfeld angezeigt.

Bearbeiten 2: Ich nehme alles zurück! Dort war doch einen modalen Dialog! Ich habe das JS so korrigiert, dass es nicht mehr angezeigt wird, und der Test funktioniert jetzt. Ich denke immer noch, es ist seltsam, dass der Rahmen hat, um die ganze Sequenz von Grund auf jeden Schritt zu wiederholen (scheint wie eine Verschwendung von Arbeit), aber egal. Vielen Dank an Sie!

2voto

Daniel Evans Punkte 6678

Dies liegt daran, dass die Testdaten, einschließlich der Capybara-Sitzungsdaten (wie z. B. der eingeloggte Zustand) und das Modell, das von create(:idea) zwischen den Specs ausgelöscht werden.

Sie möchten mit before(:each) no :all auch wenn es mehr Zeit in Anspruch nimmt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X