diff --git a/lib/capybara_accessibility_audit/axe_auditor.rb b/lib/capybara_accessibility_audit/axe_auditor.rb index 8eec5bc..c182d2a 100644 --- a/lib/capybara_accessibility_audit/axe_auditor.rb +++ b/lib/capybara_accessibility_audit/axe_auditor.rb @@ -8,7 +8,7 @@ class AxeAuditor class_attribute :source, instance_accessor: false, default: Axe::Configuration.instance.jslib def initialize(page, reporter) - @page = page + @page_proc = page.is_a?(Proc) ? page : -> { page } @reporter = reporter end @@ -22,10 +22,25 @@ def audit(**options) private + def page + @page_proc.call + end + def run(config) context, options = split(config) - @page.evaluate_async_script <<~JS, context.to_h, options.to_h + # Convert to JSON-compatible hashes (all symbols become strings) + # Playwright driver can’t serialize Ruby symbols, e.g. + # + # accessibility_audit_options.according_to = [ + # :wcag2a, + # :wcag2aa + # ] + # + context_hash = context.to_h.as_json + options_hash = options.to_h.as_json + + page.evaluate_async_script <<~JS, context_hash, options_hash const [ context, options, callback ] = arguments axe.run(context, options).then(callback) @@ -47,11 +62,11 @@ def split(config) end def install - @page.execute_script(self.class.source) unless installed? + page.execute_script(self.class.source) unless installed? end def installed? - @page.evaluate_script <<~JS + page.evaluate_script <<~JS "axe" in window && typeof axe.run === "function" JS end diff --git a/lib/capybara_accessibility_audit/engine.rb b/lib/capybara_accessibility_audit/engine.rb index 41adfdd..2dc5205 100644 --- a/lib/capybara_accessibility_audit/engine.rb +++ b/lib/capybara_accessibility_audit/engine.rb @@ -25,7 +25,7 @@ class Engine < ::Rails::Engine auditor_class = app.config.capybara_accessibility_audit.auditor reporter_class = CapybaraAccessibilityAudit.reporter_class(accessibility_audit_reporter) - self.accessibility_audit_auditor = auditor_class.new(page, reporter_class.new(self)) + self.accessibility_audit_auditor = auditor_class.new(-> { page }, reporter_class.new(self)) end end end @@ -46,7 +46,7 @@ class Engine < ::Rails::Engine auditor_class = app.config.capybara_accessibility_audit.auditor reporter_class = CapybaraAccessibilityAudit.reporter_class(accessibility_audit_reporter) - self.accessibility_audit_auditor = auditor_class.new(page, reporter_class.new(self)) + self.accessibility_audit_auditor = auditor_class.new(-> { page }, reporter_class.new(self)) end config.before(type: :system, &configure)