diff --git a/bin/hollandaise b/bin/hollandaise index bfa9910..dcde070 100755 --- a/bin/hollandaise +++ b/bin/hollandaise @@ -1,168 +1,17 @@ #!/usr/bin/env ruby require 'thor' -require 'sauce' -require 'thread' require 'builder' -module Hollandaise - class << self - attr_accessor :url, :browsers +$: << File.expand_path('../../lib') - def configure - yield self - end - end - - module Browsers - class << self - def for(browsers) - browsers.collect { |browser| self.send(browser) } - end - - def ie7 - [ :sauce, 'iexplore', '7', 'Windows 2003' ] - end - - def ie8 - [ :sauce, 'iexplore', '8', 'Windows 2003' ] - end - - def ie9 - [ :sauce, 'iexplore', '9', 'Windows 2008' ] - end - - def ffwin10 - [ :sauce, 'firefox', '10', 'Windows 2008' ] - end - - def chromewin - [ :sauce, 'chrome', '', 'Windows 2008' ] - end - - def firefox - [ :selenium, :firefox ] - end - - def chrome - [ :selenium, :chrome ] - end - end - end -end +require 'hollandaise' +require 'hollandaise/cli' begin load File.join(Dir.pwd, 'hollandaise.rb') rescue LoadError => e end -class Hollandaise::CLI < Thor - desc "sauce URL BROWSER BROWSER...", "Take screenshots of a URL on Sauce Labs" - method_options :delay => 0 - def sauce(*browsers) - if browsers.first && browsers.first[%r{^http}] - url = browsers.shift - else - url = Hollandaise.url - end - - if Hollandaise.browsers && browsers.empty? - browsers = Hollandaise.browsers - end - - threads = [] - - FileUtils.rm_rf(dir) if File.directory?(dir) - FileUtils.mkdir_p(dir) - - mutex = Mutex.new - - Hollandaise::Browsers.for(browsers).each do |browser| - info = { :browser_url => url, :job_name => "#{url}" } - [ :type, :browser, :browser_version, :os ].each_with_index { |key, index| info[key] = browser[index] } - - thread = Thread.new do - selenium = nil - - Thread.stop if Thread.current == self - - begin - target = screenshot_target_for(Thread.current[:browser]) - FileUtils.mkdir_p(File.dirname(target)) - - mutex.synchronize { puts "#{target}..." } - - selenium = case Thread.current[:browser].first - when :sauce - require 'sauce/selenium' - - Sauce::Selenium2.new(Thread.current[:info]) - when :selenium - Selenium::WebDriver.for Thread.current[:browser].last - end - - selenium.navigate.to url - sleep options[:delay].to_i - selenium.execute_script %{window.resizeTo(1280, 1024)} - selenium.save_screenshot(target) - - mutex.synchronize { puts "#{target} done!" } - ensure - selenium.quit if selenium - end - end - - thread[:info] = info - thread[:browser] = browser - thread.run - threads << thread - end - - threads.each(&:join) - - html = Builder::XmlMarkup.new - html.html { - html.head { - html.title { "Sauce Labs screenshots for #{url}" } - } - - html.body { - html.table { - html.tr { - browsers.each { |browser| html.th(browser) } - } - - html.tr { - Hollandaise::Browsers.for(browsers).each { |browser| - html.td(:valign => 'top') { - html.img(:src => screenshot_target_for(browser)) - } - } - } - } - } - } - - File.open('index.html', 'wb') { |fh| fh.print html.to_s } - end - - default_task :sauce - - no_tasks do - def dir - "screenshots" - end - - def screenshot_target_for(browser) - case browser.first - when :sauce - File.join(dir, browser[3], "#{browser[1]} #{browser[2]}.png") - when :selenium - File.join(dir, "#{browser[1]}.png") - end - end - end -end - Hollandaise::CLI.start diff --git a/lib/hollandaise.rb b/lib/hollandaise.rb index 3619847..c8f09ca 100644 --- a/lib/hollandaise.rb +++ b/lib/hollandaise.rb @@ -1,5 +1,14 @@ require "hollandaise/version" +require 'hollandaise/browsers' +require 'hollandaise/browser' module Hollandaise - # Your code goes here... + class << self + attr_accessor :url, :browsers + end + + def self.configure + yield self + end end + diff --git a/lib/hollandaise/browser.rb b/lib/hollandaise/browser.rb new file mode 100644 index 0000000..cbca9ff --- /dev/null +++ b/lib/hollandaise/browser.rb @@ -0,0 +1,19 @@ +require 'hollandaise/browser/base' +require 'hollandaise/browser/sauce' +require 'hollandaise/browser/selenium' + +module Hollandaise + module Browser + def self.for(browser, options) + browser = browser.dup + + case browser.shift + when :sauce + Hollandaise::Browser::Sauce.new(*browser, options) + when :selenium + Hollandaise::Browser::Selenium.new(*browser, options) + end + end + end +end + diff --git a/lib/hollandaise/browser/base.rb b/lib/hollandaise/browser/base.rb new file mode 100644 index 0000000..4eb9ae1 --- /dev/null +++ b/lib/hollandaise/browser/base.rb @@ -0,0 +1,27 @@ +module Hollandaise + module Browser + class Base + def run(url) + @url = url + + selenium.navigate.to url + sleep @options[:delay].to_i + selenium.execute_script %{window.resizeTo(1280, 1024)} + end + + def take_screenshot(target_dir) + target = target_for(target_dir) + target.parent.mkpath + + selenium.save_screenshot(target.to_s) + end + + def close + selenium.quit + + @selenium = nil + end + end + end +end + diff --git a/lib/hollandaise/browser/sauce.rb b/lib/hollandaise/browser/sauce.rb new file mode 100644 index 0000000..61b2111 --- /dev/null +++ b/lib/hollandaise/browser/sauce.rb @@ -0,0 +1,31 @@ +module Hollandaise + module Browser + class Sauce < Base + def initialize(browser, version, os, options) + @browser, @version, @os, @options = browser, version, os, options + end + + def selenium + require 'sauce' + require 'sauce/selenium' + + @selenium ||= ::Sauce::Selenium2.new(info) + end + + def target_for(dir) + dir.join(@os.to_s).join("#{@browser} #{@version}.png") + end + + def info + { + :browser => @browser, + :browser_version => @version, + :os => @os, + :browser_url => @url, + :job_name => "#{@url}" + } + end + end + end +end + diff --git a/lib/hollandaise/browser/selenium.rb b/lib/hollandaise/browser/selenium.rb new file mode 100644 index 0000000..319418e --- /dev/null +++ b/lib/hollandaise/browser/selenium.rb @@ -0,0 +1,20 @@ +module Hollandaise + module Browser + class Selenium < Base + def initialize(browser, options) + @browser, @options = browser, options + end + + def selenium + require 'selenium/webdriver' + + @selenium ||= ::Selenium::WebDriver.for(@browser) + end + + def target_for(dir) + dir.join("#{@browser}.png") + end + end + end +end + diff --git a/lib/hollandaise/browsers.rb b/lib/hollandaise/browsers.rb new file mode 100644 index 0000000..9222a84 --- /dev/null +++ b/lib/hollandaise/browsers.rb @@ -0,0 +1,39 @@ +module Hollandaise + module Browsers + def self.for(browsers, options) + browsers.collect { |browser| Hollandaise::Browser.for(self.send(browser), options) } + end + + def self.each(browsers, options, &block) + self.for(browsers, options).each(&block) + end + + def self.ie7 + [ :sauce, 'iexplore', '7', 'Windows 2003' ] + end + + def self.ie8 + [ :sauce, 'iexplore', '8', 'Windows 2003' ] + end + + def self.ie9 + [ :sauce, 'iexplore', '9', 'Windows 2008' ] + end + + def self.ffwin10 + [ :sauce, 'firefox', '10', 'Windows 2008' ] + end + + def self.chromewin + [ :sauce, 'chrome', '', 'Windows 2008' ] + end + + def self.firefox + [ :selenium, :firefox ] + end + + def self.chrome + [ :selenium, :chrome ] + end + end +end diff --git a/lib/hollandaise/cli.rb b/lib/hollandaise/cli.rb new file mode 100644 index 0000000..109e613 --- /dev/null +++ b/lib/hollandaise/cli.rb @@ -0,0 +1,63 @@ +module Hollandaise + class CLI < Thor + desc "sauce URL BROWSER BROWSER...", "Take screenshots of a URL on Sauce Labs" + method_options :delay => 0 + def sauce(*browsers) + if browsers.first && browsers.first[%r{^http}] + url = browsers.shift + else + url = Hollandaise.url + end + + if Hollandaise.browsers && browsers.empty? + browsers = Hollandaise.browsers + end + + Hollandaise::Browsers.each(browsers, options) do |browser| + begin + browser.run(url) + browser.take_screenshot(dir) + ensure + browser.close + end + end + + if false + + html = Builder::XmlMarkup.new + html.html { + html.head { + html.title { "Sauce Labs screenshots for #{url}" } + } + + html.body { + html.table { + html.tr { + browsers.each { |browser| html.th(browser) } + } + + html.tr { + Hollandaise::Browsers.for(browsers).each { |browser| + html.td(:valign => 'top') { + html.img(:src => screenshot_target_for(browser)) + } + } + } + } + } + } + + File.open('index.html', 'wb') { |fh| fh.print html.to_s } + + end + end + + default_task :sauce + + no_tasks do + def dir + Pathname("screenshots") + end + end + end +end