5 Stimmen

capybara selenium und JavaScript Destroy

Ich verwende Rails 2.3.5 und das ist, was ich getan habe. Ich habe neueste Gurke, Gurke-Rails und Capybara installiert.

rails demo
cd demo
ruby script/generate cucumber --rspec --capybara
ruby script/generate feature post title:string body:text published:boolean
ruby script/generate scaffold post title:string body:text published:boolean
rake db:migrate
rake cucumber

Alle Tests sind erfolgreich. Jetzt möchte ich mit Javascript testen.

Zur Zeit sieht das Szenario folgendermaßen aus

  Scenario: Delete post
    Given the following posts:
      |title|body|published|
      |title 1|body 1|false|
      |title 2|body 2|true|
      |title 3|body 3|false|
      |title 4|body 4|true|
    When I delete the 3rd post
    Then I should see the following posts:
      |Title|Body|Published|
      |title 1|body 1|false|
      |title 2|body 2|true|
      |title 4|body 4|true|

Ich habe @javascript am Anfang hinzugefügt.

Wenn ich jetzt Rake Cucumber ausführe, sehe ich eine Bestätigungsseite. Aber nichts passiert, bis ich klicke.

Was muss ich tun, damit automatisch auf OK geklickt wird und der Test fortgesetzt werden kann?

8voto

spas Punkte 1896

Nun, es ist eine Art Hack, aber ich denke, im Moment ist es die einzige Möglichkeit:

When /^I confirm a js popup on the next step$/ do
  page.evaluate_script("window.alert = function(msg) { return true; }")
  page.evaluate_script("window.confirm = function(msg) { return true; }")
end

Sie müssen diesen Schritt direkt vor den Schritt setzen, der das Bestätigungs-Popup auslöst (folgt dem Link). Dadurch wird das Standardverhalten von Warnung und Bestätigung so geändert, dass immer true zurückgegeben wird. Sie müssen also nicht selbst auf die Schaltfläche "OK" klicken.

2voto

David Sulc Punkte 25766

Ich habe eine Variante von Tobias' Lösung implementiert.

Ich wollte Schritte haben wie When I follow the "Delete" link for customer "Alice Angry" Ich habe also Folgendes:

When /^(.*) and (?:|I )click "OK"$/ do |step|
  click_ok_after { When step }
end

module JavascriptHelpers
  def click_ok_after
    begin
      page.evaluate_script("window.alert = function(msg) { return true; }")
      page.evaluate_script("window.confirm = function(msg) { return true; }")
    rescue Capybara::NotSupportedByDriverError
      # do nothing: we're not testing javascript
    ensure
      yield
    end
  end
end
World(JavascriptHelpers)

Die vollständige Erklärung finden Sie in dem Blogbeitrag, den ich hier geschrieben habe http://davidsulc.com/blog/2011/07/10/cucumber-tweaks/ (einschließlich einer hilfreichen Schrittdefinition für die Prüfung von Inhalten in HTML-Containern).

0voto

Tobias Cohen Punkte 19666

Vielen Dank an Steven für seine Lösung. Ich habe sie so geändert, dass sie sich besser liest:

When /^I follow "([^"]*)" and click OK$/ do |text|
  page.evaluate_script("window.alert = function(msg) { return true; }")
  page.evaluate_script("window.confirm = function(msg) { return true; }")
  When %{I follow "#{text}"}
end

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