Ruby on Rails ile Cucumber ve Capybara kullanıyorum.
Basit bir onaylama komutunu ("Emin misiniz?") Test etmeye nasıl başlayabilirim?
Ayrıca, bu konuyla ilgili daha fazla dokümanı nerede bulabilirim?
Ruby on Rails ile Cucumber ve Capybara kullanıyorum.
Basit bir onaylama komutunu ("Emin misiniz?") Test etmeye nasıl başlayabilirim?
Ayrıca, bu konuyla ilgili daha fazla dokümanı nerede bulabilirim?
Yanıtlar:
Ne yazık ki bunu Capybara'da yapmanın bir yolu yok gibi görünüyor. Ancak, testlerinizi Selenium sürücüsüyle (ve muhtemelen JavaScript'i destekleyen diğer sürücülerle) çalıştırıyorsanız, onu kırabilirsiniz. Onay iletişim kutusunu açacak eylemi gerçekleştirmeden hemen önce, confirm
her zaman doğruya dönmek için yöntemi geçersiz kılın . Bu şekilde iletişim kutusu hiçbir zaman görüntülenmez ve kullanıcı OK düğmesine basmış gibi testleriniz devam edebilir. Tersini simüle etmek istiyorsanız, bunu yanlış olarak değiştirmeniz yeterlidir.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Selenyum sürücüsü artık bunu destekliyor
Capybara'dan şu şekilde erişebilirsiniz:
page.driver.browser.switch_to.alert.accept
veya
page.driver.browser.switch_to.alert.dismiss
veya
page.driver.browser.switch_to.alert.text
page.driver.browser
Derek'in cevabındaki varlığına dikkat edin
Görüntülenen mesajı özel olarak test etmek istiyorsanız, işte bunu yapmanın özellikle karmaşık bir yolu. Güzel kod olarak onaylamıyorum ama işi hallediyor. Http://plugins.jquery.com/node/1386/release'i yüklemeniz veya jQuery istemiyorsanız yerel olarak tanımlama bilgileri yapacak şekilde değiştirmeniz gerekir.
Bu tür bir hikaye kullanın:
Given I am on the menu page for the current booking
And a confirmation box saying "The menu is £3.50 over budget. Click Ok to confirm anyway, or Cancel if you want to make changes." should pop up
And I want to click "Ok"
When I press "Confirm menu"
Then the confirmation box should have been displayed
Ve bu adımlar
Given /^a confirmation box saying "([^"]*)" should pop up$/ do |message|
@expected_message = message
end
Given /^I want to click "([^"]*)"$/ do |option|
retval = (option == "Ok") ? "true" : "false"
page.evaluate_script("window.confirm = function (msg) {
$.cookie('confirm_message', msg)
return #{retval}
}")
end
Then /^the confirmation box should have been displayed$/ do
page.evaluate_script("$.cookie('confirm_message')").should_not be_nil
page.evaluate_script("$.cookie('confirm_message')").should eq(@expected_message)
page.evaluate_script("$.cookie('confirm_message', null)")
end
Capybara'nın mevcut sürümleri için bunu güncelleme. Günümüzde çoğu Capybara sürücüsü, modal API'yi desteklemektedir. Onaylama şeklini kabul etmek için yaparsınız
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
Bu, Salatalıkta aşağıdaki gibi bir şeyle kullanılabilir:
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
bu, adlandırılmış düğmeyi tıklayacak ve ardından metin eşleşen mesaj içeren bir onay kutusunu kabul edecektir.
Kapibara-webkit sürücüsü de bunu destekler.
Scenario: Illustrate an example has dialog confirm with text
#
When I confirm the browser dialog with tile "Are you sure?"
#
=====================================================================
my step definition here:
And(/^I confirm the browser dialog with title "([^"]*)"$/) do |title|
if page.driver.class == Capybara::Selenium::Driver
page.driver.browser.switch_to.alert.text.should eq(title)
page.driver.browser.switch_to.alert.accept
elsif page.driver.class == Capybara::Webkit::Driver
sleep 1 # prevent test from failing by waiting for popup
page.driver.browser.confirm_messages.should eq(title)
page.driver.browser.accept_js_confirms
else
raise "Unsupported driver"
end
end
Bu temelde , herhangi bir Capybara sürücüsü ile Rails 2 ve 3'teki JS onaylama iletişim kutusunu test etme adımları vardır.
Bu, önceki bir cevabın uyarlamasıdır, ancak jQuery Cookie eklentisine ihtiyaç duymaz.
Yukarıdaki cevapları şanssız denedim. Sonunda bu benim için çalıştı:
@browser.alert.ok