Skip to content

Instantly share code, notes, and snippets.

@yovasx2
Last active May 24, 2022 08:02
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yovasx2/1c767114f2e003474a546c89ab4f90db to your computer and use it in GitHub Desktop.
Save yovasx2/1c767114f2e003474a546c89ab4f90db to your computer and use it in GitHub Desktop.
Capybara custom matcher for image and favicon validation of presence and existing file
# frozen_string_literal: true
module Capybara
module CustomMatchers
include Capybara::DSL
class Asset
def asset_exists?(actual, src)
js_script = <<JSS
xhr = new XMLHttpRequest();
xhr.open('GET', '#{src}', true);
xhr.send();
JSS
actual.execute_script(js_script)
status = actual.evaluate_script('xhr.status') # get js variable value
status == 200 || status == 302
end
end
class LoadImage < Asset
def initialize(*args)
@args = args
@src = args.first
end
def matches?(actual)
is_present = actual.has_selector?("img[src='#{@src}']")
is_present && asset_exists?(actual, @src)
end
def does_not_match?(actual)
actual.has_no_selector?("img[src='#{@src}']")
end
def failure_message
"No image loaded with source: '#{@src}'"
end
def failure_message_when_negated
"Image loaded with source: '#{@src}'"
end
def description
"Verify if image with source: '#{@src}' is loaded"
end
end
class LoadFavicon < Asset
def initialize(*args)
@args = args
@rel = args.first
@href = args.second
end
def matches?(actual)
is_present = actual.has_selector?("link[rel='#{@rel}'][href='#{@href}']", visible: false)
is_present && asset_exists?(actual, @href)
end
def does_not_match?(actual)
actual.has_no_selector?("link[rel='#{@rel}'][href='#{@href}']", visible: false)
end
def failure_message
"No favicon loaded with rel: '#{@rel}' and href: '#{@href}'"
end
def failure_message_when_negated
"Favicon loaded with rel: '#{@rel}' and href: '#{@href}'"
end
def description
"Verify if favicon with rel: '#{@rel}' and href: '#{@href}' is loaded"
end
end
def load_image(*args)
LoadImage.new(*args)
end
def load_favicon(*args)
LoadFavicon.new(*args)
end
end
end
RSpec.configure do |config|
config.include Capybara::CustomMatchers
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment