Salatalık ile bir onaylama diyaloğu nasıl test edilir?


Yanıtlar:


62

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, confirmher 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')

Bu artık Firefox 4 ... @ derek-ekins çözümünde işe yaramıyor gibi görünüyor, Google'ın bana söylediğine göre, daha ileriye dönük uyumlu görünüyor, ancak henüz onaylayamıyorum (Capybara'da takılı kaldım 0.3.9).
carpeliam

1
"Page.driver.browser.switch_to ..." kullanımıyla ilgili aşağıdaki cevaba bakın
Thorbjørn Hermansen

134

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

2
Bunu izleyen başka biri için - lütfen Derek'in cevabının, resmi Selenium belgelerindeki kodun (salatalık / Selenium) işe yaramadığını bulduğum yerde gerçekten işe yaradığını unutmayın. page.driver.browserDerek'in cevabındaki varlığına dikkat edin
Peter Nixey

Peter - buradaki kod, özellikle kapibara kullanımı için uyarlanmıştır, oysa dokümanlardaki kod, doğrudan selenyum-webdriver'ı kullandığınız zamanlar içindir - bu örneği de yazdım, bu yüzden çalışacağını umuyorum!
Derek Ekins

Ahh. Evet, iyi nokta ve benim tarafımdan tamamen özledim. Bu durumda her iki örnek için de teşekkür ederim.
Peter Nixey

39

Bu iki web adımını şuraya uyguladım /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

8

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

2
Harika çözüm! Biraz ters çevirdim
Mat Schaffer

Ve işte bu kodun hem uyarı hem de onay kutularını destekleyen başka bir versiyonu, gist.github.com/919116
Matthew O'Riordan

3

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.



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


0

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.


0

Yukarıdaki cevapları şanssız denedim. Sonunda bu benim için çalıştı:

@browser.alert.ok
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.