browser_shooter 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +7 -0
- data/.rvmrc.example +2 -0
- data/Gemfile +3 -0
- data/README.md +67 -0
- data/Rakefile +17 -0
- data/bin/browser_shooter +18 -0
- data/browser_shoter.gemspec +26 -0
- data/examples/config1.yml +55 -0
- data/examples/config2.yml +28 -0
- data/lib/browser_shooter/commander.rb +40 -0
- data/lib/browser_shooter/driver.rb +38 -0
- data/lib/browser_shooter/logger.rb +7 -0
- data/lib/browser_shooter/version.rb +3 -0
- data/lib/browser_shooter.rb +42 -0
- data/test/browser_shooter_test.rb +7 -0
- data/test/fixtures/config.yml +55 -0
- data/test/test_helper.rb +4 -0
- metadata +154 -0
data/.gitignore
ADDED
data/.rvmrc.example
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# BrowserShooter
|
2
|
+
|
3
|
+
Combined with Selenium RC this gem allows to program Selenium scripts combined with ScreenShots.
|
4
|
+
|
5
|
+
## Use it
|
6
|
+
|
7
|
+
### Setup the servers
|
8
|
+
|
9
|
+
1. Set up your VirtualMachines with your target SO and browsers installed. Java SE is also needed.
|
10
|
+
2. Download the last version of [Selenium Server](http://seleniumhq.org/download/) (AKA Selenium Remote Control).
|
11
|
+
3. Go to the console and start the Selenium Server:
|
12
|
+
|
13
|
+
java -jar <your selenium server file>.jar
|
14
|
+
|
15
|
+
Repeat this steps in every VM.
|
16
|
+
|
17
|
+
### Config your BrowserShooter script
|
18
|
+
|
19
|
+
Create a YAML file like this:
|
20
|
+
|
21
|
+
shoots_path: "/tmp/shoots"
|
22
|
+
|
23
|
+
scripts:
|
24
|
+
google:
|
25
|
+
name: "google"
|
26
|
+
url: "http://www.google.de"
|
27
|
+
# commands are Selenium commands
|
28
|
+
# except 'shot' command wich receive an optional param with the 'sufix' of the screenshot png
|
29
|
+
# except 'pause' command wich use a Ruby 'sleep' command to pause
|
30
|
+
commands: |
|
31
|
+
open "/"
|
32
|
+
window_maximize
|
33
|
+
shot before
|
34
|
+
type "id=lst-ib", "fernando guillen"
|
35
|
+
click "name=btnG", wait_for :page
|
36
|
+
pause 3
|
37
|
+
shot after
|
38
|
+
|
39
|
+
browsers:
|
40
|
+
windows-firefox:
|
41
|
+
name: "windows-firefox"
|
42
|
+
host: 10.211.55.4
|
43
|
+
port: 4444
|
44
|
+
browser: "*firefox"
|
45
|
+
|
46
|
+
windows-iexplore:
|
47
|
+
name: "windows-iexploreproxy"
|
48
|
+
host: 10.211.55.4
|
49
|
+
port: 4444
|
50
|
+
browser: "*iexploreproxy"
|
51
|
+
|
52
|
+
Look in the `examples` folder for more complete examples.
|
53
|
+
|
54
|
+
|
55
|
+
### Run the BrowserShooter script
|
56
|
+
|
57
|
+
$ browser_shooter ./my/config.yml
|
58
|
+
|
59
|
+
The screenshots will be stored in:
|
60
|
+
|
61
|
+
<shoots_path>/<time_stamp>/<script_name>_<browser_name>[_<sufix>].png
|
62
|
+
|
63
|
+
## Status
|
64
|
+
|
65
|
+
Still in a _discovery_ state.. no tests.
|
66
|
+
|
67
|
+
But is functional a can be usefull in no-production environments.
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'rake/testtask'
|
5
|
+
require 'bundler'
|
6
|
+
|
7
|
+
include Rake::DSL
|
8
|
+
|
9
|
+
Bundler::GemHelper.install_tasks
|
10
|
+
|
11
|
+
task :default => :test
|
12
|
+
|
13
|
+
Rake::TestTask.new do |t|
|
14
|
+
t.libs << '.'
|
15
|
+
t.test_files = FileList['test/*_test.rb']
|
16
|
+
t.verbose = true
|
17
|
+
end
|
data/bin/browser_shooter
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Use:
|
4
|
+
# browser_shooter /path/to/config.yml
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'browser_shooter'
|
8
|
+
rescue LoadError
|
9
|
+
require 'rubygems'
|
10
|
+
require 'browser_shooter'
|
11
|
+
end
|
12
|
+
|
13
|
+
if ( ARGV.size != 1 )
|
14
|
+
BrowserShooter::Logger.log "use: $ browser_shooter <config_file_path>"
|
15
|
+
exit 1
|
16
|
+
end
|
17
|
+
|
18
|
+
BrowserShooter.new( ARGV[0] ).run
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "browser_shooter/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "browser_shooter"
|
7
|
+
s.version = BrowserShooter::VERSION
|
8
|
+
s.authors = ["Fernando Guillen"]
|
9
|
+
s.email = ["fguillen.mail@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/fguillen/BrowserShooter"
|
11
|
+
s.summary = "Selenium RC wraper to create browser screenshots"
|
12
|
+
s.description = "Selenium RC wraper to create browser screenshots"
|
13
|
+
|
14
|
+
s.rubyforge_project = "browser_shooter"
|
15
|
+
|
16
|
+
s.add_development_dependency "bundler", ">= 1.0.0.rc.6"
|
17
|
+
s.add_development_dependency "rake", "0.9.2.2"
|
18
|
+
s.add_dependency "selenium-webdriver"
|
19
|
+
s.add_dependency "selenium"
|
20
|
+
s.add_dependency "selenium-client"
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
23
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
|
+
s.require_paths = ["lib"]
|
26
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
shoots_path: "~/browser_shoots"
|
2
|
+
|
3
|
+
scripts:
|
4
|
+
google:
|
5
|
+
name: "google"
|
6
|
+
url: "http://www.google.de"
|
7
|
+
commands: |
|
8
|
+
open "/"
|
9
|
+
window_maximize
|
10
|
+
shot before
|
11
|
+
type "id=lst-ib", "fernando guillen"
|
12
|
+
click "name=btnG", wait_for :page
|
13
|
+
pause 3
|
14
|
+
shot after
|
15
|
+
|
16
|
+
|
17
|
+
miniclip:
|
18
|
+
name: "miniclip"
|
19
|
+
url: "http://www.miniclip.com/games/de/"
|
20
|
+
commands: |
|
21
|
+
open "/"
|
22
|
+
window_maximize
|
23
|
+
shot
|
24
|
+
|
25
|
+
brandengage:
|
26
|
+
name: "brandengage"
|
27
|
+
url: "http://staging.iframe.sponsorpay.com"
|
28
|
+
commands: |
|
29
|
+
open "/test/brandengage.html"
|
30
|
+
window_maximize
|
31
|
+
click "link=be_1372_dedicated"
|
32
|
+
pause 5
|
33
|
+
get_alert
|
34
|
+
click "link=sp.showVideo();"
|
35
|
+
pause 5
|
36
|
+
shot
|
37
|
+
|
38
|
+
browsers:
|
39
|
+
windows-firefox:
|
40
|
+
name: "windows-firefox"
|
41
|
+
host: 10.211.55.4
|
42
|
+
port: 4444
|
43
|
+
browser: "*firefox"
|
44
|
+
|
45
|
+
windows-iexplore:
|
46
|
+
name: "windows-iexploreproxy"
|
47
|
+
host: 10.211.55.4
|
48
|
+
port: 4444
|
49
|
+
browser: "*iexploreproxy"
|
50
|
+
|
51
|
+
linux-firefox:
|
52
|
+
name: "linux-firefox"
|
53
|
+
host: 10.211.55.5
|
54
|
+
port: 4444
|
55
|
+
browser: "*firefox"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
shoots_path: "~/browser_shoots"
|
2
|
+
|
3
|
+
scripts:
|
4
|
+
brandengage:
|
5
|
+
name: "brandengage"
|
6
|
+
url: "http://staging.iframe.sponsorpay.com"
|
7
|
+
commands: |
|
8
|
+
open "/test/brandengage.html"
|
9
|
+
window_maximize
|
10
|
+
click "link=be_1372_dedicated"
|
11
|
+
pause 5
|
12
|
+
get_alert
|
13
|
+
click "link=sp.showVideo();"
|
14
|
+
pause 5
|
15
|
+
shot
|
16
|
+
|
17
|
+
browsers:
|
18
|
+
windows-firefox:
|
19
|
+
name: "windows-firefox"
|
20
|
+
host: 10.211.55.4
|
21
|
+
port: 4444
|
22
|
+
browser: "*firefox"
|
23
|
+
|
24
|
+
windows-iexplore:
|
25
|
+
name: "windows-iexploreproxy"
|
26
|
+
host: 10.211.55.4
|
27
|
+
port: 4444
|
28
|
+
browser: "*iexploreproxy"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class BrowserShooter
|
2
|
+
module Commander
|
3
|
+
def self.execute( command, client, shoot_path )
|
4
|
+
BrowserShooter::Logger.log "command: #{command}"
|
5
|
+
|
6
|
+
if( command.split[0].strip == "shot" )
|
7
|
+
sufix = command.split[1] ? command.split[1].strip : nil
|
8
|
+
|
9
|
+
BrowserShooter::Commander.shot(
|
10
|
+
client,
|
11
|
+
shoot_path,
|
12
|
+
sufix
|
13
|
+
)
|
14
|
+
|
15
|
+
elsif( command.split[0].strip == "pause" )
|
16
|
+
BrowserShooter::Commander.pause( command.split[1].strip.to_i )
|
17
|
+
|
18
|
+
else
|
19
|
+
eval "client.#{command}"
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.shot( client, path, sufix = nil )
|
25
|
+
sufix = "_#{sufix}" unless sufix.nil?
|
26
|
+
path = "#{path}#{sufix}.png"
|
27
|
+
|
28
|
+
BrowserShooter::Logger.log "shooting in '#{path}'"
|
29
|
+
|
30
|
+
File.open( path, "wb" ) do |f|
|
31
|
+
f.write( Base64.decode64( client.capture_entire_page_screenshot_to_string( "" ) ) )
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.pause( seconds )
|
36
|
+
BrowserShooter::Logger.log "pausing #{seconds} seconds"
|
37
|
+
sleep seconds
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class BrowserShooter
|
2
|
+
module Driver
|
3
|
+
def self.run_script_on_browser(script, browser, shoots_path)
|
4
|
+
BrowserShooter::Logger.log "Runing script '#{script["name"]}' with url '#{script["url"]}' in browser '#{browser["name"]}'"
|
5
|
+
|
6
|
+
client = nil
|
7
|
+
|
8
|
+
begin
|
9
|
+
client =
|
10
|
+
Selenium::Client::Driver.new(
|
11
|
+
:host => browser["host"],
|
12
|
+
:port => browser["port"],
|
13
|
+
:browser => browser["browser"],
|
14
|
+
:url => script["url"],
|
15
|
+
:timeout_in_seconds => 20
|
16
|
+
)
|
17
|
+
|
18
|
+
client.start_new_browser_session
|
19
|
+
|
20
|
+
script["commands"].lines.each do |command|
|
21
|
+
BrowserShooter::Commander.execute(
|
22
|
+
command,
|
23
|
+
client,
|
24
|
+
"#{shoots_path}/#{script["name"]}_#{browser["name"]}"
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
rescue Exception => e
|
29
|
+
BrowserShooter::Logger.log "ERROR: #{e.message}"
|
30
|
+
# puts e.backtrace
|
31
|
+
|
32
|
+
ensure
|
33
|
+
client.close_current_browser_session if client
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative "./browser_shooter/version"
|
2
|
+
require_relative "./browser_shooter/logger"
|
3
|
+
require_relative "./browser_shooter/driver"
|
4
|
+
require_relative "./browser_shooter/commander"
|
5
|
+
|
6
|
+
require "selenium-webdriver"
|
7
|
+
require "selenium-client"
|
8
|
+
require "yaml"
|
9
|
+
|
10
|
+
class BrowserShooter
|
11
|
+
attr_reader :config
|
12
|
+
|
13
|
+
def initialize( config_file_path )
|
14
|
+
@config = load_config( config_file_path )
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_config( config_file_path )
|
18
|
+
config = YAML.load_file( config_file_path )
|
19
|
+
config = set_up_shoots_path( config )
|
20
|
+
|
21
|
+
config
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
config["scripts"].each_value do |script|
|
26
|
+
config["browsers"].each_value do |browser|
|
27
|
+
BrowserShooter::Driver.run_script_on_browser(script, browser, config["shoots_path"])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def set_up_shoots_path( config )
|
33
|
+
config["shoots_path"] = File.expand_path( "#{config["shoots_path"]}/#{Time.now.strftime("%Y%m%d%H%M%S")}" )
|
34
|
+
BrowserShooter::Logger.log( "shoots_path: #{config["shoots_path"]}" )
|
35
|
+
|
36
|
+
FileUtils.mkdir_p( config["shoots_path"] )
|
37
|
+
|
38
|
+
config
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
shoots_path: "/tmp/shoots"
|
2
|
+
|
3
|
+
scripts:
|
4
|
+
google:
|
5
|
+
name: "google"
|
6
|
+
url: "http://www.google.de"
|
7
|
+
commands: |
|
8
|
+
open "/"
|
9
|
+
window_maximize
|
10
|
+
shot before
|
11
|
+
type "id=lst-ib", "fernando guillen"
|
12
|
+
click "name=btnG", wait_for :page
|
13
|
+
pause 3
|
14
|
+
shot after
|
15
|
+
|
16
|
+
|
17
|
+
miniclip:
|
18
|
+
name: "miniclip"
|
19
|
+
url: "http://www.miniclip.com/games/de/"
|
20
|
+
commands: |
|
21
|
+
open "/"
|
22
|
+
window_maximize
|
23
|
+
shot
|
24
|
+
|
25
|
+
brandengage:
|
26
|
+
name: "brandengage"
|
27
|
+
url: "http://staging.iframe.sponsorpay.com"
|
28
|
+
commands: |
|
29
|
+
open "/test/brandengage.html"
|
30
|
+
window_maximize
|
31
|
+
click "link=be_1372_dedicated"
|
32
|
+
pause 5
|
33
|
+
get_alert
|
34
|
+
click "link=sp.showVideo();"
|
35
|
+
pause 5
|
36
|
+
shot
|
37
|
+
|
38
|
+
browsers:
|
39
|
+
windows-firefox:
|
40
|
+
name: "windows-firefox"
|
41
|
+
host: 10.211.55.4
|
42
|
+
port: 4444
|
43
|
+
browser: "*firefox"
|
44
|
+
|
45
|
+
windows-iexplore:
|
46
|
+
name: "windows-iexploreproxy"
|
47
|
+
host: 10.211.55.4
|
48
|
+
port: 4444
|
49
|
+
browser: "*iexploreproxy"
|
50
|
+
|
51
|
+
linux-firefox:
|
52
|
+
name: "linux-firefox"
|
53
|
+
host: 10.211.55.5
|
54
|
+
port: 4444
|
55
|
+
browser: "*firefox"
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: browser_shooter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Fernando Guillen
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2012-01-06 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: bundler
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 0
|
31
|
+
- 0
|
32
|
+
- rc
|
33
|
+
- 6
|
34
|
+
version: 1.0.0.rc.6
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rake
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - "="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 9
|
48
|
+
- 2
|
49
|
+
- 2
|
50
|
+
version: 0.9.2.2
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: selenium-webdriver
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
type: :runtime
|
65
|
+
version_requirements: *id003
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: selenium
|
68
|
+
prerelease: false
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
type: :runtime
|
78
|
+
version_requirements: *id004
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: selenium-client
|
81
|
+
prerelease: false
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
type: :runtime
|
91
|
+
version_requirements: *id005
|
92
|
+
description: Selenium RC wraper to create browser screenshots
|
93
|
+
email:
|
94
|
+
- fguillen.mail@gmail.com
|
95
|
+
executables:
|
96
|
+
- browser_shooter
|
97
|
+
extensions: []
|
98
|
+
|
99
|
+
extra_rdoc_files: []
|
100
|
+
|
101
|
+
files:
|
102
|
+
- .gitignore
|
103
|
+
- .rvmrc.example
|
104
|
+
- Gemfile
|
105
|
+
- README.md
|
106
|
+
- Rakefile
|
107
|
+
- bin/browser_shooter
|
108
|
+
- browser_shoter.gemspec
|
109
|
+
- examples/config1.yml
|
110
|
+
- examples/config2.yml
|
111
|
+
- lib/browser_shooter.rb
|
112
|
+
- lib/browser_shooter/commander.rb
|
113
|
+
- lib/browser_shooter/driver.rb
|
114
|
+
- lib/browser_shooter/logger.rb
|
115
|
+
- lib/browser_shooter/version.rb
|
116
|
+
- test/browser_shooter_test.rb
|
117
|
+
- test/fixtures/config.yml
|
118
|
+
- test/test_helper.rb
|
119
|
+
has_rdoc: true
|
120
|
+
homepage: https://github.com/fguillen/BrowserShooter
|
121
|
+
licenses: []
|
122
|
+
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
|
126
|
+
require_paths:
|
127
|
+
- lib
|
128
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
segments:
|
134
|
+
- 0
|
135
|
+
version: "0"
|
136
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
segments:
|
142
|
+
- 0
|
143
|
+
version: "0"
|
144
|
+
requirements: []
|
145
|
+
|
146
|
+
rubyforge_project: browser_shooter
|
147
|
+
rubygems_version: 1.3.7
|
148
|
+
signing_key:
|
149
|
+
specification_version: 3
|
150
|
+
summary: Selenium RC wraper to create browser screenshots
|
151
|
+
test_files:
|
152
|
+
- test/browser_shooter_test.rb
|
153
|
+
- test/fixtures/config.yml
|
154
|
+
- test/test_helper.rb
|