lib/red-glass/red_glass.rb in red-glass-0.0.6 vs lib/red-glass/red_glass.rb in red-glass-0.1.0

- old
+ new

@@ -1,26 +1,27 @@ require "selenium-webdriver" require "uuid" require "net/http" class RedGlass - attr_accessor :driver, :test_id, :opts, :port, :pid, :recording + attr_accessor :driver, :test_id, :opts, :port, :pid, :recording, :event_sequence, :page_metadata, :archive_dir PROJ_ROOT = File.dirname(__FILE__).to_s def initialize(driver, opts={}) @driver = driver @opts = opts opts[:listener].red_glass = self if opts[:listener] + @test_id = opts[:test_id] || UUID.new.generate + @event_sequence = [] + @page_metadata = {} @recording = false end def start set_config start_server - uuid = UUID.new - @test_id = uuid.generate load_js @recording = true end def reload @@ -36,10 +37,19 @@ def stop Process.kill('INT', @pid) @recording = false end + def take_snapshot + capture_page_metadata + create_page_archive_directory + take_screenshot + capture_page_source + serialize_dom + write_metadata + end + private def is_server_ready?(time_limit=30) is_server_ready = false uri = URI.parse("http://localhost:#{@port}/status") @@ -57,11 +67,11 @@ is_server_ready end def start_server if !is_server_ready? 1 - @pid = Process.spawn("ruby","#{PROJ_ROOT}/red-glass-app.rb") + @pid = Process.spawn("ruby","#{PROJ_ROOT}/red-glass-app/red-glass-app.rb") raise "Red Glass server could not bet started." if !is_server_ready? Process.detach @pid end end @@ -77,33 +87,96 @@ load_red_glass_js end def load_jQuery has_jQuery = @driver.execute_script "var hasJQuery = typeof jQuery == 'function' ? true : false; return hasJQuery" - raw_js = File.open(File.expand_path("#{PROJ_ROOT}/public/scripts/jquery-1.8.0.min.js"), 'rb').read + raw_js = File.open(File.expand_path("#{PROJ_ROOT}/red-glass-app/public/scripts/jquery-1.8.0.min.js"), 'rb').read @driver.execute_script raw_js if !has_jQuery end def load_json2 has_old_json = @driver.execute_script "var hasOldJSON = typeof JSON.license == 'undefined' ? false : true; return hasOldJSON" @driver.execute_script "delete JSON" if has_old_json - raw_js = File.open(File.expand_path("#{PROJ_ROOT}/public/scripts/json2.js"), 'rb').read + raw_js = File.open(File.expand_path("#{PROJ_ROOT}/red-glass-js/json2.js"), 'rb').read @driver.execute_script raw_js end def load_get_path - raw_js = File.open(File.expand_path("#{PROJ_ROOT}/public/scripts/jquery.getpath.js"), 'rb').read + raw_js = File.open(File.expand_path("#{PROJ_ROOT}/red-glass-js/jquery.getpath.js"), 'rb').read @driver.execute_script raw_js end def has_red_glass_js? @driver.execute_script "var hasRedGlass = typeof jQuery().redGlass == 'function' ? true : false; return hasRedGlass" end def load_red_glass_js - raw_js = File.open(File.expand_path("#{PROJ_ROOT}/public/scripts/jquery.red-glass-0.1.0.js"), 'rb').read + raw_js = File.open(File.expand_path("#{PROJ_ROOT}/red-glass-js/jquery.red-glass-0.1.0.js"), 'rb').read @driver.execute_script raw_js if !has_red_glass_js? @driver.execute_script("jQuery(document).redGlass('#{@test_id}', '#{@port}')") #@driver.execute_script "jQuery.noConflict(true)" + end + + def create_page_archive_directory + detect_archive_location + unless @archive_dir + @archive_dir = "#{@opts[:archive_location].chomp('/')}/#{@test_id}" + Dir::mkdir @archive_dir unless File.directory? @archive_dir + end + Dir::mkdir construct_page_archive_path + end + + def construct_page_archive_path + "#{@archive_dir}/#{@page_metadata[:browser][:name]}_#{@page_metadata[:browser][:version]}_#{@page_metadata[:time]}" + end + + def detect_archive_location + unless @opts[:archive_location] && File.directory?(@opts[:archive_location]) + raise 'You must specify a valid archive location by passing an :archive_location option into the RedGlass initializer.' + end + end + + def capture_page_metadata + @page_metadata[:test_id] = @test_id + @page_metadata[:time] = Time.now.to_i + @page_metadata[:page_url] = @driver.current_url + @page_metadata[:browser] = {name: @driver.capabilities[:browser_name], + version: @driver.capabilities[:version], + platform: @driver.capabilities[:platform].to_s} + @page_metadata[:event_sequence] = @event_sequence + end + + def take_screenshot + @driver.save_screenshot "#{construct_page_archive_path}/screenshot.png" + end + + def capture_page_source + File.open("#{construct_page_archive_path}/source.html", 'w') { |file| file.write @driver.page_source } + end + + def write_metadata + File.open("#{construct_page_archive_path}/metadata.json", 'w') { |file| file.write @page_metadata.to_json } + end + + def write_serialized_dom(dom_json_string) + File.open("#{construct_page_archive_path}/dom.json", 'w') { |file| file.write dom_json_string } + end + + def serialize_dom + dom_json_string = "{\n\t\"browser\":" + "\"" + @page_metadata[:browser][:name] + "\"," + dom_json_string += "\n\t\"elements\":\n\t[\n\t" + serialize_dom_js_string = stringify_serialize_dom_js + dom_json_string += @driver.execute_script(serialize_dom_js_string + " return RecurseDomJSON(domgun.query('*'),'')") + dom_json_string = dom_json_string[0, (dom_json_string.length - 3)] + "\n\t]\n}" + @page_metadata[:doc_width] = @driver.execute_script(serialize_dom_js_string + " return domgun.query(document).width()") + @page_metadata[:doc_height] = @driver.execute_script(serialize_dom_js_string + " return domgun.query(document).height()") + write_serialized_dom dom_json_string + end + + def stringify_serialize_dom_js + domgun_recurse_dom_file = File.open("#{PROJ_ROOT}/red-glass-js/serialize-dom.js", 'rb') + domgun_recurse_dom_string = domgun_recurse_dom_file.read + domgun_recurse_dom_file.close + domgun_recurse_dom_string end end \ No newline at end of file