Back to Repositories

Testing Modal Dialog Dismissal Functionality in Capybara

This test suite focuses on validating the dismiss_confirm functionality in Capybara, a web-based test automation framework. The tests verify the behavior of dismissing JavaScript confirmation dialogs and handling modal interactions with different message scenarios.

Test Coverage Overview

The test suite provides comprehensive coverage for the dismiss_confirm feature, including:
  • Basic confirmation dialog dismissal
  • Message matching validation
  • Error handling for mismatched messages
  • Message content verification
The tests ensure proper interaction with JavaScript modals and verify the resulting DOM state after dismissal.

Implementation Analysis

The testing approach utilizes Capybara’s modal handling capabilities with RSpec expectations. The implementation follows a behavior-driven development pattern, using before hooks for setup and explicit message verification. Tests leverage Capybara’s session management and DOM interaction methods.

Technical Details

Key technical components include:
  • RSpec testing framework integration
  • Capybara::SpecHelper for test organization
  • JavaScript modal interaction capabilities
  • XPath assertions for DOM state verification
  • Custom modal handling methods

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Isolated test cases with clear objectives
  • Proper setup and teardown management
  • Explicit error case handling
  • Comprehensive assertion coverage
  • Clean and maintainable test structure

teamcapybara/capybara

lib/capybara/spec/session/dismiss_confirm_spec.rb

            
# frozen_string_literal: true

Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
  before do
    @session.visit('/with_js')
  end

  it 'should dismiss the confirm' do
    @session.dismiss_confirm do
      @session.click_link('Open confirm')
    end
    expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
  end

  it 'should dismiss the confirm if the message matches' do
    @session.dismiss_confirm 'Confirm opened' do
      @session.click_link('Open confirm')
    end
    expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
  end

  it "should not dismiss the confirm if the message doesn't match" do
    expect do
      @session.dismiss_confirm 'Incorrect Text' do
        @session.click_link('Open confirm')
      end
    end.to raise_error(Capybara::ModalNotFound)
  end

  it 'should return the message presented' do
    message = @session.dismiss_confirm do
      @session.click_link('Open confirm')
    end
    expect(message).to eq('Confirm opened')
  end
end