class Sir::Wrapper
Capybara
wrapper. Run capybara, rspec and ruby commands.
Constants
- AJAX_TIMEOUT
- CONTENT_TIMEOUT
- STANDARD_TIMEOUT
Attributes
Public Class Methods
# File lib/sir/wrapper.rb, line 14 def initialize(session = nil) @session = session || Capybara::Session.new(:poltergeist) end
Public Instance Methods
# 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
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
# 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
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
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
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
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
# 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 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
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
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
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
# File lib/sir/wrapper.rb, line 227 def state_set(value, name) state[name] = value end
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
# File lib/sir/wrapper.rb, line 223 def state_set_eval(code, name) state[name] = session.evaluate_script(code) end
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
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
# 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
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
# File lib/sir/wrapper.rb, line 322 def wait_for_ajax previous = active_queries_count wait_for(AJAX_TIMEOUT) { active_queries_count < previous } end
# File lib/sir/wrapper.rb, line 318 def wait_for_content(content) wait_for(CONTENT_TIMEOUT) { session.has_text? content } end
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
# 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
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
# File lib/sir/wrapper.rb, line 301 def wait_for_text_present(text) wait_for do session.text.include? text end end
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
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
# File lib/sir/wrapper.rb, line 344 def active_queries_count session.evaluate_script('jQuery.active') end
# 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