Die Kombination cucumber/webrat/Selenium macht mir viel Spaß! Es ist sogar möglich während einer Selenium-Sitzung den ruby-debugger zu starten und mit dem Browser zu interagieren. Auf einer Ubuntu-Maschine könnte man folgende Steps definieren:
Given I follow the link "id=vorgangslink" And I follow the link "id=p2show" And I follow the link "id=formlink_1" And I type "ein" into "id=answer_7" And I wait 1 second And the debugger is started Then I should see "ein String"
Wobei der Debugger dann so aufgerufen wird:
1 2 3 |
Given /^the debugger is started$/ do debugger end |
Im konkreten Lauf klappt das prima. Wenn man das Gleiche unter OsX tut, wirft das System einem allerdings eine Fehlermeldung um die Ohren, wenn man das selenium-Objekt anspricht, um den Browser zu steuern:
Given I follow the link "id=vorgangslink"
And I follow the link "id=p2show"
And I follow the link "id=formlink_1"
And I type "ein" into "id=answer_7"
And I wait 1 second
/opt/local/lib/ruby/gems/1.8/gems/cucumber-0.3.3/lib/cucumber/ast/step_invocation.rb:33
status!(:passed)
(rdb:1) selenium.type_keys("id=answer_7", "hey")
NameError Exception: undefined local variable or method `selenium' for #<Cucumber::Ast::StepInvocation:0x36c9f28>
(rdb:1) list
[28, 37] in /opt/local/lib/ruby/gems/1.8/gems/cucumber-0.3.3/bin/...
28 unless @skip_invoke || options[:dry_run] || exception ...
29 @skip_invoke = true
30 begin
...
(rdb:1)
Der Grund liegt darin, dass der OsX-Debugger im Gegensatz zu Linux am Ende eines Blockes bereits in den umliegenden Kontext wechselt, und damit das selenium-Objekt vergisst. Sorgt man durch Anfügen eines nichtstuenden Ausdrucks (hier true) dafür, das das debugger-Kommando nicht das letztze im Block ist, ist alles gut:
1 2 3 4 |
Given /^the debugger is started$/ do debugger true end |
