2010-05-13 2 views
5

Я использую рельсы 2.3.5, и это то, что я сделал. У меня есть последний огурец, огурцы и капибара.capybara selenium и JavaScript Destroy

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 

Все испытания проходят. Теперь я хочу протестировать с помощью Javascript.

В это время это как сценарий выглядит

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| 

Я добавил @javascript в верхней части.

Теперь, когда я запускаю грабли огурца, я вижу страницу подтверждения. Но ничего не происходит, пока я не щелкнул.

Что нужно сделать, чтобы щелкнуть OK, и тест продолжается.

ответ

8

Ну его вид хака, но я думаю, что сейчас его единственный путь:

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 

Вы должны поставить этот шаг прямо перед той, которая запускает подтверждения всплывающего окна (ниже по ссылке) , Он изменит стандартное предупреждение и подтвердит поведение, чтобы всегда возвращать true. Поэтому вам не нужно нажимать кнопку «ОК» самостоятельно.

+0

Ненависть к этому нужно, но это работает! –

0

Благодаря Стивену за его решение, вот как я изменил его так, что он читает немного лучше:

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 
2

Я реализовал вариацию на решение Тобиаса.

Я хотел бы иметь шаги, как When I follow the "Delete" link for customer "Alice Angry", так что я следующее:

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) 

Полное объяснение можно найти в блоге я писал об этом здесь http://davidsulc.com/blog/2011/07/10/cucumber-tweaks/ (включая полезные определения шага для проверки содержания в контейнерах HTML).