module Selenium::WebDriver::SearchContext

def extract_args(args)

def extract_args(args)
  case args.size
  when 2
    args
  when 1
    arg = args.first
    unless arg.respond_to?(:shift)
      raise ArgumentError, "expected #{arg.inspect}:#{arg.class} to respond to #shift"
    end
    # this will be a single-entry hash, so use #shift over #first or #[]
    arr = arg.dup.shift
    unless arr.size == 2
      raise ArgumentError, "expected #{arr.inspect} to have 2 elements"
    end
    arr
  else
    raise ArgumentError, "wrong number of arguments (#{args.size} for 2)"
  end
end

def find_element(*args)

def find_element(*args)
  how, what = extract_args(args)
  by = FINDERS[how.to_sym]
  raise ArgumentError, "cannot find element by #{how.inspect}" unless by
  bridge.find_element_by by, what.to_s, ref
rescue Selenium::WebDriver::Error::TimeOutError
  # Implicit Wait times out in Edge
  raise Selenium::WebDriver::Error::NoSuchElementError
end

def find_elements(*args)

def find_elements(*args)
  how, what = extract_args(args)
  by = FINDERS[how.to_sym]
  raise ArgumentError, "cannot find elements by #{how.inspect}" unless by
  bridge.find_elements_by by, what.to_s, ref
rescue Selenium::WebDriver::Error::TimeOutError
  # Implicit Wait times out in Edge
  []
end