2017-12-18 6 views
0

Selen-WebDriverRails BDD konnte nicht sichtbar XPath "/ html" (Capybara :: ElementNotFound)

finden, wenn ich versuche, Integrationstest ich an dieser Behauptung nicht zu tun:

@user = FactoryBot.create(:user) 
@client = FactoryBot.create(:client, user: @user) 
@event = FactoryBot.create(:event, client: @client) 
visit client_path(@client) 
click_link "Bill" 

und diese erhalten

Fehler
And an invoice is created to the client     # features/step_definitions/new_invoice_steps.rb:9 
    Unable to find visible xpath "/html" (Capybara::ElementNotFound) 
    ./features/step_definitions/new_invoice_steps.rb:12:in `"an invoice is created to the client"' 
    features/new_invoice.feature:15:in `And an invoice is created to the client' 

Hier ist der Link Code

<%= link_to "Bill", bill_client_path(@client), method: :post%> 
Diese

ist die Methode, die ich nennen, die in der Client-Controller ist

def bill 

#some code here 

    respond_to do |format| 
    if invoice.save 
     flash[:success] = 'Invoice was successfully created.' 
     format.html { redirect_to invoice} 
     format.json { render :show, status: :created, location: invoice } 
    else 
     format.html { render :new } 
     format.json { render json: invoice.errors, status: :unprocessable_entity } 
    end 
    end 
    end 

Als ich kurz nach dem Link klicken Sie byebug und Typ stoppen current_url es gab mir diese

"http://www.example.com/clients/1/bill" 

, die nicht über eine Sicht, weil die Rechnungsmethode zur Rechnungsansicht umgeleitet werden soll. Capybara ist auf dieser Seite festgefahren und hat mir natürlich eine leere Seite gegeben. Warum Capybara nicht die zweite Umleitung bekommen? Wie repariere ich das?

Prüfprotokoll

Started POST "/clients/1/bill" for 127.0.0.1 at 2017-12-18 15:54:55 +0100 
Processing by ClientsController#bill as HTML 
    Parameters: {"id"=>"1"} 
    [1m[36mUser Load (0.7ms)[0m [1m[34mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?[0m [["id", 1], ["LIMIT", 1]] 
    [1m[36mClient Load (0.9ms)[0m [1m[34mSELECT "clients".* FROM "clients" WHERE "clients"."user_id" = ? AND "clients"."id" = ? LIMIT ?[0m [["user_id", 1], ["id", 1], ["LIMIT", 1]] 
    [1m[36mEvent Exists (0.4ms)[0m [1m[34mSELECT 1 AS one FROM "events" WHERE "events"."client_id" = ? AND "events"."billed" IS NULL LIMIT ?[0m [["client_id", 1], ["LIMIT", 1]] 
No template found for ClientsController#bill, rendering head :no_content 
Completed 204 No Content in 210ms (ActiveRecord: 2.0ms) 
+0

Welchen Treiber verwenden Sie mit Capybara? Welche Capybara Konfigurationseinstellungen verwenden Sie? Was machst du bevor du auf den Link klickst? Zeigen Sie auch den Stacktrace, der zu Ihrem Fehler gehört. Siehe - https://stackoverflow.com/help/how-to-ask. Wahrscheinlich liegt es daran, dass Ihr POST-Link als GET interpretiert wird, weil er nicht "capybara/rails" benötigt oder ein Fehler in Ihrem JS verhindert, dass der UJS-Code initialisiert wird. Unmöglich ohne mehr Informationen zu erzählen. –

+0

Weitere Informationen hinzugefügt – power96

+0

Wenn Sie tatsächlich 'Selen-Webdriver' für diesen Test verwenden (es öffnet Firefox oder Chrome Browserfenster, etc.) dann ist es höchstwahrscheinlich, dass Sie einen Fehler in Ihrem JS haben, der verhindert, dass Schienen ujs richtig initialisiert werden Der click_link erzeugt ein GET und nicht einen POST. Überprüfen Sie Ihr test.log, um den Typ der Anfrage zu überprüfen. –

Antwort

0

Sie DatabaseCleaner gem benötigen, da Transaktions Leuchten mit Selen nicht funktionieren. Wenn Sie Framework Ruby on Rails die database_cleaner gem fügen sich auf die Testgruppe Ihrer Gemfile und setzen Sie den folgenden Code in spec/rails_helper.rb

RSpec.configure do |config| 
    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    # If you're not using ActiveRecord, or you'd prefer not to run each of your 
    # examples within a transaction, remove the following line or assign false 
    # instead of true. 

    config.use_transactional_fixtures = false 

    # Use transactions by default 
    config.before do 
    DatabaseCleaner.strategy = :transaction 
    end 

    # For the javascript-enabled tests, switch to truncation 
    config.before :each, driver: :selenium do 
    DatabaseCleaner.strategy = :truncation 
    end 

    config.before do 
    DatabaseCleaner.start 
    end 

    config.after :each, driver: :selenium do 
    load "#{Rails.root}/db/seeds.rb" 
    end 

    config.after do 
    DatabaseCleaner.clean 
    end 
end 

In Spec-Datei verwenden 'beschreiben' mit speziellen Treiber:

describe 'something', type: :feature, driver: :selenium do 
    ... 
end 
Verwandte Themen