Back to Repositories

Testing Element ID Selection Workflow in Capybara

This test suite validates Capybara’s find_by_id functionality, focusing on element identification and visibility handling in web applications. The tests ensure robust element location by ID across various scenarios including visibility states and error handling.

Test Coverage Overview

The test suite provides comprehensive coverage of the find_by_id method functionality in Capybara.

Key areas tested include:
  • Basic element location by ID
  • String/Symbol ID parameter handling
  • Non-existent element error handling
  • Visibility state detection and filtering

Implementation Analysis

The testing approach employs RSpec’s expectation syntax with Capybara’s session-based testing pattern. Tests verify both successful cases and error scenarios, utilizing before hooks for test setup and context blocks for organizing visibility-specific tests.

Technical implementation includes:
  • Session-based testing architecture
  • Dynamic element visibility verification
  • Error state validation

Technical Details

Testing tools and configuration:
  • RSpec testing framework
  • Capybara test helper integration
  • HTML fixture loading (‘/with_html’ path)
  • Session-scoped test execution

Best Practices Demonstrated

The test suite exemplifies several testing best practices in web automation.

Notable practices include:
  • Isolated test cases with clear assertions
  • Proper setup and context organization
  • Comprehensive error scenario coverage
  • Explicit visibility handling

teamcapybara/capybara

lib/capybara/spec/session/find_by_id_spec.rb

            
# frozen_string_literal: true

Capybara::SpecHelper.spec '#find_by_id' do
  before do
    @session.visit('/with_html')
  end

  it 'should find any element by id' do
    expect(@session.find_by_id('red').tag_name).to eq('a')
  end

  it 'casts to string' do
    expect(@session.find_by_id(:red).tag_name).to eq('a')
  end

  it 'should raise error if no element with id is found' do
    expect do
      @session.find_by_id('nothing_with_this_id')
    end.to raise_error(Capybara::ElementNotFound)
  end

  context 'with :visible option' do
    it 'finds invisible elements when `false`' do
      expect(@session.find_by_id('hidden_via_ancestor', visible: false).text(:all)).to match(/with hidden ancestor/)
    end

    it "doesn't find invisible elements when `true`" do
      expect do
        @session.find_by_id('hidden_via_ancestor', visible: true)
      end.to raise_error(Capybara::ElementNotFound)
    end
  end
end