Cucumber로 확인 대화 상자를 테스트하는 방법은 무엇입니까?


86

Cucumber 및 Capybara와 함께 Ruby on Rails를 사용하고 있습니다.

간단한 확인 명령 ( "확실합니까?")을 테스트하려면 어떻게해야합니까?

또한이 문제에 대한 추가 문서는 어디에서 찾을 수 있습니까?


Capybara-webkit을 사용하는 경우 여기에서 답을 찾을 수 있습니다. stackoverflow.com/questions/6930927/…
Adrien

답변:


62

안타깝게도 카피 바라에서는 할 방법이없는 것 같습니다. 그러나 Selenium 드라이버 (및 JavaScript를 지원하는 다른 드라이버)로 테스트를 실행하는 경우 해킹 할 수 있습니다. 확인 대화 상자를 표시하는 작업을 수행하기 직전에 confirm메서드를 재정 의하여 항상 true를 반환합니다. 이렇게하면 대화 상자가 표시되지 않으며 사용자가 확인 버튼을 누른 것처럼 테스트를 계속할 수 있습니다. 반대로 시뮬레이션하려면 false를 반환하도록 변경하면됩니다.

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')

이것은 Firefox 4에서 더 이상 작동하지 않는 것 같습니다 ... Google이 알려주는 아래 @ derek-ekins 솔루션은 아직 확인할 수는 없지만 앞으로 호환되는 것 같습니다 (Capybara에 붙어 있습니다 0.3.9).
carpeliam 2011

1
사용은 아래 답변을 참조하십시오 "page.driver.browser.switch_to을 ..."
Thorbjørn Hermansen이

134

셀레늄 드라이버는 이제이를 지원합니다.

Capybara에서 다음과 같이 액세스 할 수 있습니다.

page.driver.browser.switch_to.alert.accept

또는

page.driver.browser.switch_to.alert.dismiss

또는

 page.driver.browser.switch_to.alert.text

2
이것을 따르는 다른 사람을 위해-Derek의 답변은 공식 Selenium 문서의 코드가 (오이 / Selenium)하지 않은 곳에서 실제로 작동합니다. 의 존재 참고 page.driver.browser데릭의 대답
피터 Nixey

Peter-여기에있는 코드는 카피 바라를 사용하기 위해 특별히 조정 된 반면, 문서의 코드는 셀레늄 웹 드라이버를 직접 사용할 때를위한 것입니다. 저도 그 예제를 작성 했으므로 작동하기를 바랍니다!
Derek Ekins 2011-08-01

아. 예, 좋은 지적이며 완전히 놓쳤습니다. 이 경우 두 가지 예를 모두 감사합니다.
Peter Nixey

39

다음 두 웹 단계를 구현했습니다 /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

표시되는 메시지를 구체적으로 테스트하려면 여기에 특히 해키 방법이 있습니다. 나는 그것을 아름다운 코드로지지하지는 않지만 작업을 완료합니다. http://plugins.jquery.com/node/1386/release 를로드 하거나 jQuery를 원하지 않는 경우 기본적으로 쿠키를 수행하도록 변경해야합니다.

이 종류의 이야기를 사용하십시오.

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

그리고이 단계

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
멋진 솔루션! 좀 더 자연스럽게 느껴지도록 약간 뒤집 었습니다. gist.github.com/727614
Mat Schaffer

여기에 경고 및 확인 상자를 모두 지원하는 코드의 또 다른 버전이 있습니다. gist.github.com/919116
Matthew O'Riordan

3

Capybara의 현재 릴리스를 위해 이것을 업데이트합니다. 오늘날 대부분의 Capybara 드라이버는 모달 API를 지원합니다. 확인 모달을 수락하려면

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

이것은 오이에서 다음과 같이 사용할 수 있습니다.

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

이름이 지정된 버튼을 클릭 한 다음 메시지와 일치하는 텍스트가있는 확인 상자를 수락합니다.



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

이 요점 에는 Capybara 드라이버를 사용하여 Rails 2 및 3에서 JS 확인 대화 상자를 테스트하는 단계가 있습니다.

이전 답변의 변형이지만 jQuery Cookie 플러그인이 필요하지 않습니다.


0

운없이 위의 답변을 시도했습니다. 결국 이것은 나를 위해 일했습니다.

@browser.alert.ok
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.