class Capybara::Accessible::Auditor

Public Class Methods

disable() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 30
def disable
  @disabled = true
end
disabled?() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 38
def disabled?
  @disabled
end
enable() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 34
def enable
  @disabled = false
end
exclusions() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 10
def exclusions
  @exclusions ||= []
end
exclusions=(rules) click to toggle source
# File lib/capybara/accessible/auditor.rb, line 6
def exclusions=(rules)
  @exclusions = rules
end
log_level() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 18
def log_level
  @log_level ||= :error
end
log_level=(level) click to toggle source
# File lib/capybara/accessible/auditor.rb, line 14
def log_level=(level)
  @log_level = level
end
new(driver) click to toggle source
# File lib/capybara/accessible/auditor.rb, line 43
def initialize(driver)
  @driver = driver
end
severe_rules() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 26
def severe_rules
  @severe_rules ||= []
end
severe_rules=(rules) click to toggle source
# File lib/capybara/accessible/auditor.rb, line 22
def severe_rules=(rules)
  @severe_rules = rules
end

Public Instance Methods

audit!() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 47
def audit!
  return if Auditor.disabled?
  if failures?
    log_level_response[Capybara::Accessible::Auditor.log_level].call(failure_messages)
  end
end

Private Instance Methods

audit_rules() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 74
def audit_rules
  File.read(File.expand_path("../../../vendor/google/accessibility-developer-tools/axs_testing.js", __FILE__))
end
excluded_rules() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 94
def excluded_rules
  codes = Capybara::Accessible::Auditor.exclusions
  codes.map { |code| mapping[code]}
end
failure_messages() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 69
def failure_messages
  result = run_script(perform_audit_script + @driver.accessible.create_report_script)
  "Found at #{page_url} \n\n#{result}"
end
failures?() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 63
def failures?
  failures = run_script(perform_audit_script + @driver.accessible.failures_script)

  Array(failures).any?
end
log_level_response() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 56
def log_level_response
  @log_level_response ||= {
    warn: ->(messages) { puts messages },
    error: ->(messages) { raise Capybara::Accessible::InaccessibleError, failure_messages }
  }
end
mapping() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 104
def mapping
  @mapping ||= {
    'AX_ARIA_01' => 'badAriaRole',
    'AX_ARIA_02' => 'nonExistentAriaLabelledbyElement',
    'AX_ARIA_03' => 'requiredAriaAttributeMissing',
    'AX_ARIA_04' => 'badAriaAttributeValue',
    'AX_TEXT_01' => 'controlsWithoutLabel',
    'AX_TEXT_02' => 'imagesWithoutAltText',
    'AX_TITLE_01' => 'pageWithoutTitle',
    'AX_IMAGE_01' => 'elementsWithMeaningfulBackgroundImage',
    'AX_FOCUS_01' => 'focusableElementNotVisibleAndNotAriaHidden',
    'AX_FOCUS_02' => 'unfocusableElementsWithOnClick',
    'AX_COLOR_01' => 'lowContrastElements',
    'AX_VIDEO_01' => 'videoWithoutCaptions',
    'AX_AUDIO_01' => 'audioWithoutControls'
    # 'AX_TITLE_01' => 'linkWithUnclearPurpose', # This has a duplicate name
    # 'AX_ARIA_05' => '', # This has no rule associated with it
  }
end
page_url() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 124
def page_url
  @driver.current_url
end
perform_audit_script() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 78
    def perform_audit_script
      <<-JAVASCRIPT
        #{audit_rules}
        var config = new axs.AuditConfiguration();
        var severe_rules = #{severe_rules.to_json};
        var rule;

        for(rule in severe_rules) {
          config.setSeverity(severe_rules[rule], axs.constants.Severity.SEVERE);
        }
        config.auditRulesToIgnore = #{excluded_rules.to_json};
        config.showUnsupportedRulesWarning = false
        var results = axs.Audit.run(config);
      JAVASCRIPT
    end
run_script(script) click to toggle source
# File lib/capybara/accessible/auditor.rb, line 128
def run_script(script)
  @driver.accessible.run_javascript(@driver, script)
end
severe_rules() click to toggle source
# File lib/capybara/accessible/auditor.rb, line 99
def severe_rules
  codes = Capybara::Accessible::Auditor.severe_rules
  codes.map { |code| mapping[code]}
end