Bagaimana cara menguji dialog konfirmasi dengan Mentimun?

86

Saya menggunakan Ruby on Rails dengan Cucumber dan Capybara.

Bagaimana saya akan menguji perintah konfirmasi sederhana ("Apakah Anda yakin?")?

Selain itu, di mana saya dapat menemukan dokumentasi lebih lanjut tentang masalah ini?

Yuval Karmi
sumber
Jika Anda menggunakan Capybara-webkit, Anda akan menemukan jawabannya di sana: stackoverflow.com/questions/6930927/…
Adrien

Jawaban:

62

Sepertinya tidak ada cara untuk melakukannya di Capybara, sayangnya. Tetapi jika Anda menjalankan pengujian dengan driver Selenium (dan mungkin driver lain yang mendukung JavaScript), Anda dapat meretasnya. Tepat sebelum melakukan tindakan yang akan memunculkan dialog konfirmasi, ganti confirmmetode untuk selalu mengembalikan nilai true. Dengan begitu, dialog tidak akan pernah ditampilkan, dan pengujian Anda dapat dilanjutkan seolah-olah pengguna telah menekan tombol OK. Jika Anda ingin mensimulasikan kebalikannya, cukup ubah menjadi false.

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Theo
sumber
Ini sepertinya tidak berfungsi lagi di Firefox 4 ... Solusi @ derek-ekins di bawah, dari apa yang dikatakan Google kepada saya, tampaknya lebih kompatibel ke depan, meskipun saya belum bisa mengonfirmasi (saya terjebak di Capybara 0.3.9).
carpeliam
1
Lihat jawaban di bawah untuk menggunakan "page.driver.browser.switch_to ..."
Thorbjørn Hermansen
134

Driver selenium sekarang mendukung ini

Dari Kapibara Anda akan mengaksesnya seperti ini:

page.driver.browser.switch_to.alert.accept

atau

page.driver.browser.switch_to.alert.dismiss

atau

 page.driver.browser.switch_to.alert.text
Derek Ekins
sumber
2
Untuk siapa pun yang mengikuti ini - harap perhatikan bahwa jawaban Derek memang berfungsi di mana saya menemukan bahwa kode dalam dokumentasi Selenium resmi tidak (mentimun / Selenium). Perhatikan kehadiran page.driver.browserdalam jawaban Derek
Peter Nixey
Peter - kode di sini dirancang khusus untuk menggunakan kapibara sedangkan kode di dokumen adalah untuk saat Anda menggunakan selenium-webdriver secara langsung - Saya menulis contoh itu juga jadi saya harap ini berfungsi!
Derek Ekins
Ahh. Ya, poin yang bagus dan saya benar-benar terlewat. Dalam hal ini terima kasih untuk kedua contoh tersebut.
Peter Nixey
39

Saya telah menerapkan dua langkah web ini di /features/step_definitions/web_steps.rb:

When /^I confirm popup$/ do
  page.driver.browser.switch_to.alert.accept    
end

When /^I dismiss popup$/ do
  page.driver.browser.switch_to.alert.dismiss
end
Dynamick
sumber
8

Jika Anda ingin secara khusus menguji pesan yang ditampilkan, berikut ini cara yang sangat hack untuk melakukannya. Saya tidak mendukungnya sebagai kode yang indah, tetapi itu menyelesaikan pekerjaan. Anda harus memuat http://plugins.jquery.com/node/1386/release , atau mengubahnya untuk melakukan cookie secara native jika Anda tidak menginginkan jQuery.

Gunakan cerita semacam ini:

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

Dan langkah-langkah ini

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
Jon Wood
sumber
2
Solusi keren! Saya membaliknya sedikit yang terasa lebih alami bagi saya: gist.github.com/727614
Mat Schaffer
Dan inilah versi lain dari kode itu yang mendukung kotak peringatan dan konfirmasi, gist.github.com/919116
Matthew O'Riordan
3

Memperbarui ini untuk rilis Kapibara saat ini. Kebanyakan pengemudi Kapibara saat ini mendukung API modal. Untuk menerima modal konfirmasi yang akan Anda lakukan

accept_confirm do  # dismiss_confirm if not accepting
  click_link 'delete'  # whatever action triggers the modal to appear
end

Ini bisa digunakan di Mentimun dengan sesuatu seperti

When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
  accept_confirm msg do
    click_button(button)
  end
end

yang akan mengklik tombol bernama dan kemudian menerima kotak konfirmasi dengan pesan pencocokan teks

Thomas Walpole
sumber
2

The capybara-webkit sopir mendukung ini juga.

mengatur ini
sumber
2
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
hainguyen
sumber
1

Prickle menambahkan beberapa metode praktis yang berguna untuk bekerja dengan popup di selenium dan webkit

Chris Bloom
sumber
0

Inti ini memiliki langkah-langkah untuk menguji dialog konfirmasi JS di Rails 2 dan 3 dengan driver Capybara.

Ini adalah adaptasi dari jawaban sebelumnya, tetapi tidak membutuhkan plugin jQuery Cookie.

Joel Cogen
sumber
0

Mencoba jawaban di atas tidak berhasil. Pada akhirnya ini berhasil untuk saya:

@browser.alert.ok
Andy Stannard
sumber