class Sir::Wrapper

Capybara wrapper. Run capybara, rspec and ruby commands.

Constants

AJAX_TIMEOUT
CONTENT_TIMEOUT
STANDARD_TIMEOUT

Attributes

session[RW]
state[RW]

Public Class Methods

new(session = nil) click to toggle source
# File lib/sir/wrapper.rb, line 14
def initialize(session = nil)
  @session = session || Capybara::Session.new(:poltergeist)
end

Public Instance Methods

angular_find_and_set(selector, value) click to toggle source
# File lib/sir/wrapper.rb, line 136
def angular_find_and_set(selector, value)
  sleep 1000
  unless session.first(:id, 'fakeFileInput')
    session.execute_script "fakeFileInput = window.$('<input/>').attr({id: 'fakeFileInput', type:'file'}).appendTo('body');"
  end
  session.first(:id, 'fakeFileInput').set value
  session.execute_script("angular.element(document.getElementById('#{selector}')).scope().scanProcess.fileSelect($('#fakeFileInput')[0].files)")
  sleep 5000
end
clean_cookies() click to toggle source

Wrapper of clearAllVisible cookies. Clear cookies.

# File lib/sir/wrapper.rb, line 42
def clean_cookies
  session.driver.clear_cookies
end
click_and_wait(criterium, *selectors) click to toggle source

Same as find_and_click, but sleep 5 seconds after it. what the hell should it do in selenium?

# File lib/sir/wrapper.rb, line 168
def click_and_wait(criterium, *selectors)
  sleep 2000
  session.first(criterium, *selectors).click
rescue
  case criterium
  when :css then session.evaluate_script("$('#{selectors.join(' ')}').show()")
  when :id then session.evaluate_script("$('##{selectors.join(' ')}').show()")
  end
  session.first(criterium, *selectors).click
ensure
  sleep 5000
end
expect_attribute(criterium, selector, attribute, expected) click to toggle source
# File lib/sir/wrapper.rb, line 94
def expect_attribute(criterium, selector, attribute, expected)
  tries ||= 0
  message = 'Failed to check attribute:'
  got = session.first(criterium, selector, visible: [true, false])[attribute]
  fail ExpectationError.new(message, expected, got) unless File.fnmatch(expected, got)
rescue => e
  if (tries < 3)
    retry
  else
    raise e
  end
end
expect_location(address) click to toggle source

Wrapper of assertLocation. @example

expect_location 'ya.ru'
# File lib/sir/wrapper.rb, line 87
def expect_location(address)
  message = 'Failed to be on expected page:'
  expected = address
  got = session.current_url
  fail ExpectationError.new(message, expected, got) unless expected == got
end
expect_text(criterium, selector, text) click to toggle source

Wrapper of verifyText. @example

expect_text :id, 'user_id', 'John'
# File lib/sir/wrapper.rb, line 76
def expect_text(criterium, selector, text)
  message = 'Failed to find text:'
  expected = text
  got = session.find(criterium, selector).text
  fail ExpectationError.new(message, expected, got) unless expected == got
end
find_and_click(criterium, *selectors) click to toggle source

Wrapper of click. @example

find_and_click :id, 'submit_form'
# File lib/sir/wrapper.rb, line 150
def find_and_click(criterium, *selectors)
  tries ||= 0
  session.first(criterium, *selectors, visible: [true, false]).click
rescue Capybara::Poltergeist::ObsoleteNode
  sleep 1000
  session.evaluate_script("$('#{selectors.join(' ')}').show()")
  session.first(criterium, *selectors).click
rescue => e
  if (tries < 3)
    retry
  else
    raise e
  end
end
find_and_set(criterium, selector, value) click to toggle source

Wrapper of type. @example

find_and_set :id, 'username', 'pahom'
# File lib/sir/wrapper.rb, line 127
def find_and_set(criterium, selector, value)
  is_angular = false # !session.evaluate_script('angular').nil?
  if selector.include?('file') && is_angular
    angular_find_and_set selector, value
  else
    session.find(criterium, selector, visible: [true, false]).set value
  end
end
keyup(criterium, selector, keycode) click to toggle source
# File lib/sir/wrapper.rb, line 231
def keyup(criterium, selector, keycode)
  selector = case criterium
             when :css then selector
             when :id then '#' + selector
             else selector
             end
  keypress_script = "var e = $.Event('keyup', { keyCode: #{keycode} }); $('#{selector}').trigger(e);"
  session.execute_script(keypress_script)
end
run(path) click to toggle source

Run script by given path.

@params path [String] path to script @return hash of commands that it run.

# File lib/sir/wrapper.rb, line 36
def run(path)
  Sir::Parser.run!(path, state, self)
end
select(*args) click to toggle source

Wrapper of select. @example

select :css, '.hey.there', :id, 'username'
# File lib/sir/wrapper.rb, line 119
def select(*args)
  session.find(*args.first(2)).select(args.last)
end
send_command(hash) click to toggle source

Example of hash:

@example

send_command({ command: 'visit',
  args: ['http://value/of/box/application'] })
#=> `visit 'http://value/of/box/application'` execution
# File lib/sir/wrapper.rb, line 25
def send_command(hash)
  r = send(hash[:command], *hash[:args])
  r = true if r == ''
  hash.merge(result: r)
end
sleep(milliseconds) click to toggle source

Wrapper of sleep. @example

sleep "5000" #=> do nothing 5 seconds.
# File lib/sir/wrapper.rb, line 111
def sleep(milliseconds)
  Kernel.sleep(milliseconds.to_i / 1000)
end
state_set(value, name) click to toggle source
# File lib/sir/wrapper.rb, line 227
def state_set(value, name)
  state[name] = value
end
state_set_attribute(criterium, selector, attribute, name) click to toggle source

Wrapper of storeAttribute. Add text at attribute to global state. @example

state_set_text :id, 'username', 'href', 'user_name'
# File lib/sir/wrapper.rb, line 215
def state_set_attribute(criterium, selector, attribute, name)
  x ||= 0
  text = session.first(criterium, selector, visible: [true, false])[attribute]
  state[name] = text
rescue
  (x += 1; retry) if x < 3
end
state_set_eval(code, name) click to toggle source
# File lib/sir/wrapper.rb, line 223
def state_set_eval(code, name)
  state[name] = session.evaluate_script(code)
end
state_set_text(*args) click to toggle source

Wrapper of storeText. Add finded text to global state. @example

state_set_text :id, 'username', 'user_name'
# File lib/sir/wrapper.rb, line 191
def state_set_text(*args)
  case args.size
  when 2
    criterium, selector, name = :xpath, *args
  when 3
    criterium, selector, name = *args
  end
  sleep 500
  # workaround for purchase tickets.
  if %w(with_membership without_membership).include?(selector)
    text = (session.first(:id, 'with_membership') || session.first(:id, 'without_membership')).text
  else
    text = session.first(criterium, selector, visible: [true, false]).text
    if text == true
      text = session.first(criterium, selector, visible: [true, false]).text
    end
  end
  state[name] = text
end
state_set_url(name) click to toggle source

Add url to global state. Wrapper of storeLocation.

# File lib/sir/wrapper.rb, line 183
def state_set_url(name)
  state[name] = session.current_url
end
try_box_crutch(address) click to toggle source
# File lib/sir/wrapper.rb, line 65
def try_box_crutch(address)
  url = session.current_url
  if address =~ /auth\/box\?content_id=(\d+)/ && !url.include?('#videos')
    visit url + "#videos/#{$~[1]}"
  end
end
visit(address) click to toggle source

Simple capybara visit, except we use session to run it.

# File lib/sir/wrapper.rb, line 48
def visit(address)
  tries ||= 0
  session.visit address
  try_box_crutch(address)
  pp session.current_url
rescue Capybara::Poltergeist::TimeoutError => e
  cookies = session.driver.cookies
  session.driver.quit
  @session = Capybara::Session.new(:poltergeist)
  cookies.each { |k, v| session.driver.cookies[k] = v }
  if retries < 2
    retry
  else
    raise e
  end
end
wait_for_ajax() click to toggle source
# File lib/sir/wrapper.rb, line 322
def wait_for_ajax
  previous = active_queries_count
  wait_for(AJAX_TIMEOUT) { active_queries_count < previous }
end
wait_for_content(content) click to toggle source
# File lib/sir/wrapper.rb, line 318
def wait_for_content(content)
  wait_for(CONTENT_TIMEOUT) { session.has_text? content }
end
wait_for_element(criterium, *selectors) click to toggle source

Wrapper of waitForElementPresent. @example

wait_for_element :id, 'username'
# File lib/sir/wrapper.rb, line 251
def wait_for_element(criterium, *selectors)
  wait_for { session.first(criterium, *selectors, visible: [true, false]) }
  true
rescue Timeout::Error
  url = session.current_url
  url = session.current_url unless String === url
  session.visit url
  sleep 10000
  session.first(criterium, *selectors, visible: [true, false])
ensure
  true
end
wait_for_loading(address) click to toggle source
# File lib/sir/wrapper.rb, line 241
def wait_for_loading(address)
  # session.visit address
  sleep 5000
  wait_for { File.fnmatch(address, session.current_url) }
end
wait_for_text(criterium, *selectors, text) click to toggle source

Wrapper of waitForText. @example

wait_for_text :id, 'username', 'Pahom'
# File lib/sir/wrapper.rb, line 283
def wait_for_text(criterium, *selectors, text)
  wait_for do
    (x = session.first(criterium, *selectors, visible: [true, false])) &&
      File.fnmatch(text, x.text)
  end
rescue
  # Fucking poltergeist can do this:
  # [42] pry(#<Sir::Parser>)> wrapper.session.text
  # NoMethodError: undefined method `map' for nil:NilClass
  # from /home/s/work/sir/lib/sir/capybara_ext.rb:10:in `find'
  # [43] pry(#<Sir::Parser>)> wrapper.session.text
  # => "true"
  # [44] pry(#<Sir::Parser>)> wrapper.session.current_url
  # => "+You\nSearch\nImages\nMaps\nPlay\nYouTube\nGmail\nDrive\nMore\nrmtest011@gmail.com\n×\n\tA faster way to browse the web\nInstall Google Chrome\n\nRussia\n\n \t\n\n\nAdvanced search\nLanguage tools\n\nGoogle.ru offered in: русском\nAdvertising ProgramsAbout GoogleGoogle.com\n© 2015 - Privacy - Terms\n\n"
  # FIXME: so just sleep 5 seconds and hope it will be fine.
  sleep 5000
end
wait_for_text_present(text) click to toggle source
# File lib/sir/wrapper.rb, line 301
def wait_for_text_present(text)
  wait_for do
    session.text.include? text
  end
end
wait_for_value(criterium, selector, text) click to toggle source

Wrapper of waitForValue. @example

wait_for_value :id, 'username', 'Pahom'
# File lib/sir/wrapper.rb, line 311
def wait_for_value(criterium, selector, text)
  wait_for do
    session.first(criterium, selector, text)
  end
  true
end
wait_for_visible(criterium, selector, value = nil) click to toggle source

Wrapper of waitForVisible. @example

wait_for_visible :id, 'username'
# File lib/sir/wrapper.rb, line 268
def wait_for_visible(criterium, selector, value = nil)
  wait_for do
    element = session.first(criterium, selector, visible: [true])
    if element && value
      File.fnmatch(value.to_s, element.text)
    else
      true
    end
  end
end

Protected Instance Methods

active_queries_count() click to toggle source
# File lib/sir/wrapper.rb, line 344
def active_queries_count
  session.evaluate_script('jQuery.active')
end
wait_for(timeout = STANDARD_TIMEOUT) { || ... } click to toggle source
# File lib/sir/wrapper.rb, line 333
def wait_for(timeout = STANDARD_TIMEOUT)
  result = nil
  Timeout.timeout(timeout) do
    loop do
      sleep 1
      break if result = yield
    end
  end
  result
end