Files
openfoodnetwork/spec/support/request/web_helper.rb
Kristina Lim 57f6a7a3b9 Support clicking different text for select2 helper
Interaction with the variant autocomplete is not precise. The specs only
search for the product name, then click the first result that matches
the product name which they see.

This could have been the case because searching using the full variant
name does not match the variant. For example, searching "Some Product -
1kg" would not have results, while searching only "Some Product" (the
product name) would list "Some Product - 1kg".

Clicking the first match does not work in all scenarios.

This allows using a separate text for searching and for clicking.
2019-01-26 02:03:54 +08:00

161 lines
4.4 KiB
Ruby

module WebHelper
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
# By default, Capybara uses a 30 s wait time, which is more reliable for CI, but too slow
# for TDD. Use this to make tests fail fast. Usage:
#
# describe "foo" do
# use_short_wait
# ...
# end
def use_short_wait(seconds=2)
around { |example| Capybara.using_wait_time(seconds) { example.run } }
end
end
def have_input(name, opts={})
selector = "[name='#{name}']"
selector += "[placeholder='#{opts[:placeholder]}']" if opts.key? :placeholder
element = page.all(selector).first
element.value.should == opts[:with] if element && opts.key?(:with)
have_selector selector
end
def fill_in_fields(field_values)
field_values.each do |key, value|
begin
fill_in key, :with => value
rescue Capybara::ElementNotFound
find_field(key).select(value)
end
end
end
def select_by_value(value, options={})
from = options.delete :from
page.find_by_id(from).find("option[value='#{value}']").select_option
end
def flash_message
find('.flash', visible: false).text(:all).strip
end
def handle_js_confirm(accept=true)
page.execute_script "window.confirm = function(msg) { return #{!!accept }; }"
yield
end
def visit_delete(url)
response = Capybara.current_session.driver.delete url
click_link 'redirected' if response.status == 302
end
def set_i18n_locale(locale = 'en')
page.execute_script("I18n.locale = '#{locale}'")
end
def get_i18n_locale
page.evaluate_script("I18n.locale;")
end
def get_i18n_translation(key = nil)
page.evaluate_script("I18n.t('#{key}');")
end
# Fetch the content of a script block
# eg. script_content with: 'my-script.com'
# Returns nil if not found
# Raises an exception if multiple matching blocks are found
def script_content(opts={})
elems = page.all('script', visible: false)
elems = elems.to_a.select { |e| e.text(:all).include? opts[:with] } if opts[:with]
if elems.none?
nil
elsif elems.many?
raise "Multiple results returned for script_content"
else
elems.first.text(:all)
end
end
# http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara
# Do not use this without good reason. Capybara's built-in waiting is very effective.
def wait_until(secs=nil)
require "timeout"
Timeout.timeout(secs || Capybara.default_max_wait_time) do
sleep(0.1) until value = yield
value
end
end
def wait_until_enabled(selector)
wait_until(10) { first("#{selector}:not([disabled='disabled'])") }
end
def select2_select(value, options)
id = options[:from]
options[:from] = "#s2id_#{id}"
targetted_select2(value, options)
end
# Support having different texts to search for and to click in the select2
# field.
#
# This overrides the method in Spree.
def targetted_select2_search(value, options)
page.execute_script %Q{$('#{options[:from]}').select2('open')}
page.execute_script "$('#{options[:dropdown_css]} input.select2-input').val('#{value}').trigger('keyup-change');"
select_select2_result(options[:select_text] || value)
end
def multi_select2_select(value, options)
find("#s2id_#{options[:from]}").find('ul li.select2-search-field').click
select_select2_result(value)
end
def open_select2(selector)
page.execute_script "jQuery('#{selector}').select2('open');"
end
def close_select2(selector)
page.execute_script "jQuery('#{selector}').select2('close');"
end
def select2_search_async(value, options)
id = find_label_by_text(options[:from])
options[:from] = "#s2id_#{id}"
targetted_select2_search_async(value, options)
end
def targetted_select2_search_async(value, options)
page.execute_script %Q{$('#{options[:from]}').select2('open')}
page.execute_script "$('#{options[:dropdown_css]} input.select2-input').val('#{value}').trigger('keyup-change');"
select_select2_result_async(value)
end
def select_select2_result_async(value)
while (page.has_selector? "div.select2-searching") do
return if page.has_selector? "div.select2-no-results"
sleep 0.2
end
page.execute_script(%Q{$("div.select2-result-label:contains('#{value}')").mouseup()})
end
def accept_js_alert
page.driver.browser.switch_to.alert.accept
end
private
def wait_for_ajax
wait_until { page.evaluate_script("$.active") == 0 }
end
end