selenium-webdriver-viewers 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/.document +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +67 -0
- data/TODO +14 -0
- data/VERSION +1 -0
- data/lib/browser-instance.rb +61 -0
- data/lib/element_reader.rb +43 -0
- data/lib/element_value_reader.rb +50 -0
- data/lib/element_value_writer.rb +19 -0
- data/lib/page.rb +45 -0
- data/lib/selenium-webdriver-viewers.rb +2 -0
- data/lib/viewer.rb +96 -0
- data/lib/webdriver-extensions.rb +53 -0
- data/selenium-webdriver-viewers.gemspec +83 -0
- data/spec/browser-instance_spec.rb +96 -0
- data/spec/element_reader_spec.rb +106 -0
- data/spec/element_value_reader_spec.rb +161 -0
- data/spec/element_value_writer_spec.rb +16 -0
- data/spec/page_spec.rb +66 -0
- data/spec/selenium-webdriver-viewers_spec.rb +4 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/viewer_spec.rb +9 -0
- metadata +146 -0
data/.document
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Michael Collas
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= selenium-webdriver-viewers
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
+
* Send me a pull request. Bonus points for topic branches.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2010 Michael Collas. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "selenium-webdriver-viewers"
|
8
|
+
gem.summary = 'Makes page objects and views for tests using selenium-webdriver.'
|
9
|
+
gem.description = <<-END_DESCRIPTION
|
10
|
+
This gem makes it easy to create page and web viewer objects for use by tests that use selenium-webdriver. By
|
11
|
+
using page and viewer objects, you can decouple your tests from the html details so that they can focus
|
12
|
+
instead on describing the behaviour of your application.
|
13
|
+
END_DESCRIPTION
|
14
|
+
gem.email = "mcollas@yahoo.com"
|
15
|
+
gem.homepage = "http://github.com/michaelcollas/selenium-webdriver-viewers"
|
16
|
+
gem.authors = ["Michael Collas"]
|
17
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
18
|
+
gem.add_development_dependency "reek", ">= 1.2.8"
|
19
|
+
gem.add_development_dependency "sexp_processor", ">= 3.0.4"
|
20
|
+
gem.files.exclude('.gitignore')
|
21
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
22
|
+
end
|
23
|
+
Jeweler::GemcutterTasks.new
|
24
|
+
rescue LoadError
|
25
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'spec/rake/spectask'
|
29
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
30
|
+
spec.libs << 'lib' << 'spec'
|
31
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
32
|
+
end
|
33
|
+
|
34
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
35
|
+
spec.libs << 'lib' << 'spec'
|
36
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
37
|
+
spec.rcov = true
|
38
|
+
end
|
39
|
+
|
40
|
+
task :spec => :check_dependencies
|
41
|
+
|
42
|
+
begin
|
43
|
+
require 'reek/rake/task'
|
44
|
+
Reek::Rake::Task.new do |t|
|
45
|
+
t.fail_on_error = true
|
46
|
+
t.verbose = false
|
47
|
+
t.source_files = 'lib/**/*.rb'
|
48
|
+
t.reek_opts << ' --quiet'
|
49
|
+
t.ruby_opts << '-r' << 'rubygems'
|
50
|
+
end
|
51
|
+
rescue LoadError
|
52
|
+
task :reek do
|
53
|
+
abort "Reek is not available. In order to run reek, you must: sudo gem install reek"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
task :default => :spec
|
58
|
+
|
59
|
+
require 'rake/rdoctask'
|
60
|
+
Rake::RDocTask.new do |rdoc|
|
61
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
62
|
+
|
63
|
+
rdoc.rdoc_dir = 'rdoc'
|
64
|
+
rdoc.title = "selenium-webdriver-viewers #{version}"
|
65
|
+
rdoc.rdoc_files.include('README*')
|
66
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
67
|
+
end
|
data/TODO
ADDED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'selenium-webdriver'
|
2
|
+
require 'selenium/webdriver/navigation'
|
3
|
+
|
4
|
+
module BrowserInstance
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
def base_url=(new_value)
|
9
|
+
@base_url = new_value
|
10
|
+
@browser.navigate.base_url = @base_url if @browser
|
11
|
+
end
|
12
|
+
|
13
|
+
def base_url
|
14
|
+
@base_url || ENV['BASE_URL'] || ''
|
15
|
+
end
|
16
|
+
|
17
|
+
def browser_instance
|
18
|
+
@browser ||= create_browser
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_browser
|
22
|
+
browser = Selenium::WebDriver.for :firefox
|
23
|
+
browser.navigate.extend(BaseUrl).base_url = base_url
|
24
|
+
browser
|
25
|
+
end
|
26
|
+
|
27
|
+
def quit
|
28
|
+
return unless @browser
|
29
|
+
@browser.quit
|
30
|
+
@browser = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def browser
|
36
|
+
BrowserInstance.browser_instance
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
module BaseUrl
|
42
|
+
|
43
|
+
def self.extended(target)
|
44
|
+
super
|
45
|
+
class << target
|
46
|
+
alias_method :to_absolute, :to
|
47
|
+
alias_method :to, :to_relative
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_relative(new_location)
|
52
|
+
to_absolute(@base_url + new_location)
|
53
|
+
end
|
54
|
+
|
55
|
+
def base_url=(base)
|
56
|
+
@base_url = base
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module WebViewer
|
2
|
+
|
3
|
+
# ElementReader fetches a Selenium::WebDriver::Element for a particular selector. If the selector
|
4
|
+
# requires parameters, ElementReader defers reading from WebDriver until the parameters are
|
5
|
+
# provided using the [] method.
|
6
|
+
class ElementReader
|
7
|
+
|
8
|
+
def initialize(viewer, selector, selector_type)
|
9
|
+
@viewer = viewer
|
10
|
+
@selector = selector
|
11
|
+
@selector_type = selector_type
|
12
|
+
end
|
13
|
+
|
14
|
+
def requires_parameters?
|
15
|
+
@selector.respond_to?(:call) && @selector.respond_to?(:arity) && @selector.arity > 0
|
16
|
+
end
|
17
|
+
|
18
|
+
def callable_selector?
|
19
|
+
@selector.respond_to?(:call)
|
20
|
+
end
|
21
|
+
|
22
|
+
# return either self or element depending on whether selector needs parameters
|
23
|
+
def get(*arguments)
|
24
|
+
return element unless callable_selector?
|
25
|
+
if (arguments.length > 0) || !requires_parameters?
|
26
|
+
element(@selector.call(*arguments))
|
27
|
+
else
|
28
|
+
self
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def [](*arguments)
|
33
|
+
selector_text = @selector.call(*arguments)
|
34
|
+
self.element(selector_text)
|
35
|
+
end
|
36
|
+
|
37
|
+
def element(selector_text = @selector)
|
38
|
+
@viewer.find_element(@selector_type, selector_text)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module WebViewer
|
2
|
+
|
3
|
+
# ElementValueReader acts on a Selenium::WebDriver::Element by fetching its value, clicking on it,
|
4
|
+
# reading its text, etc.
|
5
|
+
class ElementValueReader
|
6
|
+
|
7
|
+
def initialize(element_reader, output_type)
|
8
|
+
@element_reader = element_reader
|
9
|
+
@output_type = output_type
|
10
|
+
end
|
11
|
+
|
12
|
+
# return either self or element_value depending on whether selector needs parameters
|
13
|
+
def get
|
14
|
+
if @element_reader.requires_parameters?
|
15
|
+
self
|
16
|
+
else
|
17
|
+
element_value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](*args)
|
22
|
+
element_value(*args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def []=(*arguments)
|
26
|
+
value_to_assign = arguments.pop
|
27
|
+
element = @element_reader.get(*arguments)
|
28
|
+
ElementValueWriter.new(element, @output_type).value = value_to_assign
|
29
|
+
end
|
30
|
+
|
31
|
+
def element_value(*arguments)
|
32
|
+
if (Class === @output_type)
|
33
|
+
element_as_viewer(*arguments)
|
34
|
+
elsif [:auto, :link, :select_by_text, :select_by_value].include? @output_type
|
35
|
+
raise "not yet implemented"
|
36
|
+
else
|
37
|
+
@element_reader.get(*arguments).send(@output_type)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def element_as_viewer(*arguments)
|
42
|
+
viewer = @output_type.new
|
43
|
+
base_element_proc = lambda { @element_reader.get(*arguments) }
|
44
|
+
viewer.instance_variable_set(:@base_element_proc, base_element_proc)
|
45
|
+
viewer
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module WebViewer
|
2
|
+
|
3
|
+
# ElementValueWriter assigns a value to a Selenium::WebDriver::Element. It uses the element_type
|
4
|
+
# parameter passed in the constructor to determine how to write to the element.
|
5
|
+
class ElementValueWriter
|
6
|
+
|
7
|
+
def initialize(web_element, element_type)
|
8
|
+
@web_element = web_element
|
9
|
+
@element_type = element_type
|
10
|
+
end
|
11
|
+
|
12
|
+
def value=(new_value)
|
13
|
+
# do smart things with element_type in here
|
14
|
+
@web_element.value = new_value
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/lib/page.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'browser-instance'
|
2
|
+
require 'viewer'
|
3
|
+
|
4
|
+
module WebPage
|
5
|
+
|
6
|
+
def self.included(target)
|
7
|
+
super
|
8
|
+
target.extend ClassMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
def load
|
12
|
+
if respond_to?(:url)
|
13
|
+
navigate.to_absolute(url)
|
14
|
+
elsif respond_to?(:path)
|
15
|
+
navigate.to_relative(path)
|
16
|
+
end
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
|
22
|
+
def url(url_value)
|
23
|
+
define_method(:url) { url_value }
|
24
|
+
end
|
25
|
+
|
26
|
+
def path(path_value)
|
27
|
+
define_method(:path) { path_value }
|
28
|
+
end
|
29
|
+
|
30
|
+
def load
|
31
|
+
new.load
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
# WebPageObject is a base class for web viewers that represent a whole page. In addition to
|
39
|
+
# all the normal features of a web viewer, a web page object has url or path, and can
|
40
|
+
# navigate to the url or path using the load method.
|
41
|
+
class WebPageObject
|
42
|
+
include BrowserInstance
|
43
|
+
include WebViewer
|
44
|
+
include WebPage
|
45
|
+
end
|
data/lib/viewer.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'browser-instance'
|
3
|
+
require 'webdriver-extensions'
|
4
|
+
require 'element_reader'
|
5
|
+
require 'element_value_reader'
|
6
|
+
require 'element_value_writer'
|
7
|
+
|
8
|
+
module WebViewer
|
9
|
+
|
10
|
+
extend Forwardable
|
11
|
+
def_delegators :browser, :close, :current_url, :execute_script, :get, :manage, :navigate, :page_source,
|
12
|
+
:save_screenshot, :screenshot_as, :script, :switch_to, :title, :visible=, :visible?,
|
13
|
+
:window_handle, :window_handles
|
14
|
+
def_delegators :base_element, :[], :all, :attribute, :clear, :click, :displayed?, :drag_and_drop_by, :drag_and_drop_on,
|
15
|
+
:enabled?, :find_element, :find_elements, :first, :hover, :location, :ref, :select, :selected?,
|
16
|
+
:send_key, :send_keys, :size, :style, :submit, :tag_name, :text, :toggle, :value,
|
17
|
+
:element_present?, :wait_for_element_present
|
18
|
+
|
19
|
+
|
20
|
+
def self.included(target)
|
21
|
+
super
|
22
|
+
target.extend ClassMethods
|
23
|
+
end
|
24
|
+
|
25
|
+
def base_element
|
26
|
+
return @base_element_proc.call if @base_element_proc
|
27
|
+
browser.find_element(:tag_name, 'html')
|
28
|
+
end
|
29
|
+
|
30
|
+
def showing?
|
31
|
+
base_element
|
32
|
+
true
|
33
|
+
rescue Selenium::WebDriver::Error::NoSuchElementError
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
37
|
+
module ClassMethods
|
38
|
+
|
39
|
+
def base_element(selector, selector_type=:id)
|
40
|
+
define_method(:base_element) do
|
41
|
+
browser.find_element selector_type, selector
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def default_selector_type(selector_type)
|
46
|
+
@default_selector_type = selector_type
|
47
|
+
end
|
48
|
+
|
49
|
+
# :as options: :auto, :text, :click, :link, :select_by_text, :select_by_value, :hover, :location, :size, :toggle, :value, ViewerClass
|
50
|
+
def element(name, selector=name.to_s, options={}, &selector_proc)
|
51
|
+
if options.empty? && selector.is_a?(::Hash)
|
52
|
+
options = selector
|
53
|
+
selector = name
|
54
|
+
end
|
55
|
+
selector = selector_proc if selector_proc
|
56
|
+
selector_type = options[:by] || @default_selector_type || :id
|
57
|
+
output_type = options[:as] || :value
|
58
|
+
|
59
|
+
define_method("#{name}_element_reader") do
|
60
|
+
ElementReader.new(self, selector, selector_type)
|
61
|
+
end
|
62
|
+
|
63
|
+
define_method("#{name}_element") do
|
64
|
+
send("#{name}_element_reader").get
|
65
|
+
end
|
66
|
+
|
67
|
+
define_method(name) do
|
68
|
+
element_reader = send("#{name}_element_reader")
|
69
|
+
ElementValueReader.new(element_reader, output_type).get
|
70
|
+
end
|
71
|
+
|
72
|
+
# only define this method if result type suggests assignability
|
73
|
+
define_method("#{name}=") do |new_value|
|
74
|
+
element_reader = send("#{name}_element_reader")
|
75
|
+
raise "parameters required" if element_reader.requires_parameters?
|
76
|
+
ElementValueWriter.new(element_reader.get, output_type).value = new_value
|
77
|
+
end
|
78
|
+
|
79
|
+
define_method("#{name}_present?") do |*arguments|
|
80
|
+
raise ArgumentError(1, arguments.length) if arguments.length > 1
|
81
|
+
timeout = arguments[0].to_f
|
82
|
+
element_present? selector_type, selector, timeout
|
83
|
+
end
|
84
|
+
alias_method "has_#{name}?", "#{name}_present?"
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
class WebViewerObject
|
93
|
+
include BrowserInstance
|
94
|
+
include WebViewer
|
95
|
+
end
|
96
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'selenium-webdriver'
|
2
|
+
|
3
|
+
module HumaneWebDriverExtensions
|
4
|
+
# deal with different html element types:
|
5
|
+
# boolean for checkboxes, radio buttons, and individual options in select controls
|
6
|
+
# string for inputs, textarea, and selects
|
7
|
+
# send JavaScript for hidden inputs?
|
8
|
+
def value=(new_value)
|
9
|
+
case self.tag_name.to_sym
|
10
|
+
when :input, :textarea
|
11
|
+
clear
|
12
|
+
send_keys new_value.to_s
|
13
|
+
else
|
14
|
+
raise "cannot set value for a #{self.tag_name} element - only input and textarea supported"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Selenium
|
20
|
+
module WebDriver
|
21
|
+
|
22
|
+
module Find
|
23
|
+
|
24
|
+
def element_present?(how, what, how_long=0)
|
25
|
+
wait_for_element_present(how, what, how_long)
|
26
|
+
true
|
27
|
+
rescue Selenium::WebDriver::Error::NoSuchElementError
|
28
|
+
false
|
29
|
+
end
|
30
|
+
|
31
|
+
def wait_for_element_present(how, what, how_long)
|
32
|
+
attempts_left = how_long / 0.1
|
33
|
+
begin
|
34
|
+
find_element(how, what)
|
35
|
+
rescue Selenium::WebDriver::Error::NoSuchElementError
|
36
|
+
if attempts_left > 0
|
37
|
+
attempts_left -= 1
|
38
|
+
sleep 0.1
|
39
|
+
retry
|
40
|
+
end
|
41
|
+
fail
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
class Element
|
48
|
+
include HumaneWebDriverExtensions
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{selenium-webdriver-viewers}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Michael Collas"]
|
12
|
+
s.date = %q{2010-12-16}
|
13
|
+
s.description = %q{ This gem makes it easy to create page and web viewer objects for use by tests that use selenium-webdriver. By
|
14
|
+
using page and viewer objects, you can decouple your tests from the html details so that they can focus
|
15
|
+
instead on describing the behaviour of your application.
|
16
|
+
}
|
17
|
+
s.email = %q{mcollas@yahoo.com}
|
18
|
+
s.extra_rdoc_files = [
|
19
|
+
"LICENSE",
|
20
|
+
"README.rdoc",
|
21
|
+
"TODO"
|
22
|
+
]
|
23
|
+
s.files = [
|
24
|
+
".document",
|
25
|
+
"LICENSE",
|
26
|
+
"README.rdoc",
|
27
|
+
"Rakefile",
|
28
|
+
"TODO",
|
29
|
+
"VERSION",
|
30
|
+
"lib/browser-instance.rb",
|
31
|
+
"lib/element_reader.rb",
|
32
|
+
"lib/element_value_reader.rb",
|
33
|
+
"lib/element_value_writer.rb",
|
34
|
+
"lib/page.rb",
|
35
|
+
"lib/selenium-webdriver-viewers.rb",
|
36
|
+
"lib/viewer.rb",
|
37
|
+
"lib/webdriver-extensions.rb",
|
38
|
+
"selenium-webdriver-viewers.gemspec",
|
39
|
+
"spec/browser-instance_spec.rb",
|
40
|
+
"spec/element_reader_spec.rb",
|
41
|
+
"spec/element_value_reader_spec.rb",
|
42
|
+
"spec/element_value_writer_spec.rb",
|
43
|
+
"spec/page_spec.rb",
|
44
|
+
"spec/selenium-webdriver-viewers_spec.rb",
|
45
|
+
"spec/spec.opts",
|
46
|
+
"spec/spec_helper.rb",
|
47
|
+
"spec/viewer_spec.rb"
|
48
|
+
]
|
49
|
+
s.homepage = %q{http://github.com/michaelcollas/selenium-webdriver-viewers}
|
50
|
+
s.require_paths = ["lib"]
|
51
|
+
s.rubygems_version = %q{1.3.7}
|
52
|
+
s.summary = %q{Makes page objects and views for tests using selenium-webdriver.}
|
53
|
+
s.test_files = [
|
54
|
+
"spec/browser-instance_spec.rb",
|
55
|
+
"spec/element_reader_spec.rb",
|
56
|
+
"spec/element_value_reader_spec.rb",
|
57
|
+
"spec/element_value_writer_spec.rb",
|
58
|
+
"spec/page_spec.rb",
|
59
|
+
"spec/selenium-webdriver-viewers_spec.rb",
|
60
|
+
"spec/spec_helper.rb",
|
61
|
+
"spec/viewer_spec.rb"
|
62
|
+
]
|
63
|
+
|
64
|
+
if s.respond_to? :specification_version then
|
65
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
66
|
+
s.specification_version = 3
|
67
|
+
|
68
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
69
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
70
|
+
s.add_development_dependency(%q<reek>, [">= 1.2.8"])
|
71
|
+
s.add_development_dependency(%q<sexp_processor>, [">= 3.0.4"])
|
72
|
+
else
|
73
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
74
|
+
s.add_dependency(%q<reek>, [">= 1.2.8"])
|
75
|
+
s.add_dependency(%q<sexp_processor>, [">= 3.0.4"])
|
76
|
+
end
|
77
|
+
else
|
78
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
79
|
+
s.add_dependency(%q<reek>, [">= 1.2.8"])
|
80
|
+
s.add_dependency(%q<sexp_processor>, [">= 3.0.4"])
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BrowserInstance do
|
4
|
+
|
5
|
+
describe '#base_url' do
|
6
|
+
|
7
|
+
before do
|
8
|
+
BrowserInstance.base_url = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
BrowserInstance.base_url = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have an empty base url by default' do
|
16
|
+
BrowserInstance.base_url.should == ''
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should have the base url set by base_url=' do
|
20
|
+
BrowserInstance.base_url = 'http://something'
|
21
|
+
BrowserInstance.base_url.should == 'http://something'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should have a base url provided by environment variable if none has been set by base_url=' do
|
25
|
+
ENV.stub!(:[]).with('BASE_URL').and_return('http://from-environment')
|
26
|
+
BrowserInstance.base_url.should == 'http://from-environment'
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'browser_instance' do
|
32
|
+
|
33
|
+
before do
|
34
|
+
@driver = stub('firefox driver')
|
35
|
+
class << @driver
|
36
|
+
attr_reader :last_to_location
|
37
|
+
def to(location)
|
38
|
+
@last_to_location = location
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@driver.stub!(:navigate).and_return(@driver)
|
42
|
+
Selenium::WebDriver.stub!(:for).and_return(@driver)
|
43
|
+
end
|
44
|
+
|
45
|
+
after do
|
46
|
+
BrowserInstance.instance_variable_set(:@browser, nil)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should create a new WebDriver driver instance for firefox' do
|
50
|
+
Selenium::WebDriver.should_receive(:for).with(:firefox).and_return(@driver)
|
51
|
+
BrowserInstance.browser_instance
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should return the created driver from browser_instance' do
|
55
|
+
BrowserInstance.browser_instance.should equal(@driver)
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'navigate interface' do
|
59
|
+
|
60
|
+
before do
|
61
|
+
BrowserInstance.base_url = 'http://flibble'
|
62
|
+
@browser = BrowserInstance.browser_instance
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should prepend the base url when to is used' do
|
66
|
+
@browser.navigate.to '/somewhere'
|
67
|
+
@browser.last_to_location.should == 'http://flibble/somewhere'
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should ignore the base url when navigate.to_absolute is used' do
|
71
|
+
@browser.navigate.to_absolute '/somewhere'
|
72
|
+
@browser.last_to_location.should == '/somewhere'
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'when a browser has already been requested' do
|
78
|
+
|
79
|
+
before do
|
80
|
+
BrowserInstance.browser_instance
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should not create another WebDriver driver instance' do
|
84
|
+
Selenium::WebDriver.should_not_receive(:for)
|
85
|
+
BrowserInstance.browser_instance
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should return the same instance on subsequent calls' do
|
89
|
+
BrowserInstance.browser_instance.should equal(BrowserInstance.browser_instance)
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WebViewer::ElementReader do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@dummy_element = stub('webdriver element')
|
7
|
+
@viewer = stub('viewer', :find_element => @dummy_element)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'when the selector is a proc' do
|
11
|
+
|
12
|
+
describe 'and the selector proc has parameters' do
|
13
|
+
|
14
|
+
before do
|
15
|
+
@reader = WebViewer::ElementReader.new(@viewer, proc {|argument| "proc based selector with #{argument}"}, :css)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should require parameters' do
|
19
|
+
@reader.requires_parameters?.should be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#get' do
|
23
|
+
|
24
|
+
it 'should return itself if parameters are not provided' do
|
25
|
+
@reader.get.should == @reader
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should fetch the element from the viewer using the result of calling the proc if parameters are provided' do
|
29
|
+
@viewer.should_receive(:find_element).with(:css, 'proc based selector with parameter value')
|
30
|
+
@reader.get('parameter value')
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should return the fetched element if parameters are provided' do
|
34
|
+
@reader.get('parameter value').should == @dummy_element
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#[]' do
|
40
|
+
|
41
|
+
it 'should fetch the element from the viewer using the result of calling the proc if parameters are provided' do
|
42
|
+
@viewer.should_receive(:find_element).with(:css, 'proc based selector with parameter value')
|
43
|
+
@reader['parameter value']
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should return the fetched element if parameters are provided' do
|
47
|
+
@reader['parameter value'].should == @dummy_element
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'and the selector proc has no parameters' do
|
55
|
+
|
56
|
+
before do
|
57
|
+
@reader = WebViewer::ElementReader.new(@viewer, proc {'proc based selector'}, :css)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should not require parameters if the selector is a proc with no parameters' do
|
61
|
+
@reader.requires_parameters?.should be_false
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should recognize that the selector is callable' do
|
65
|
+
@reader.callable_selector?.should be_true
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should fetch the element from the viewer using the result of calling the proc' do
|
69
|
+
@viewer.should_receive(:find_element).with(:css, 'proc based selector')
|
70
|
+
@reader.get
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should return the fetched element' do
|
74
|
+
@reader.get.should == @dummy_element
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'when the selector is a string' do
|
82
|
+
|
83
|
+
before do
|
84
|
+
@reader = WebViewer::ElementReader.new(@viewer, 'text based selector', :css)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should not require parameters if the selector is a string' do
|
88
|
+
@reader.requires_parameters?.should be_false
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should recognize that the selector is not callable' do
|
92
|
+
@reader.callable_selector?.should be_false
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should fetch the element from the viewer' do
|
96
|
+
@viewer.should_receive(:find_element).with(:css, 'text based selector')
|
97
|
+
@reader.get
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should return the fetched element' do
|
101
|
+
@reader.get.should == @dummy_element
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WebViewer::ElementValueReader do
|
4
|
+
|
5
|
+
share_as :UnimplementedOutputType do
|
6
|
+
|
7
|
+
it 'should raise an exception' do
|
8
|
+
output_type = self.class.options[:output_type]
|
9
|
+
value_reader = WebViewer::ElementValueReader.new(@element_reader, output_type)
|
10
|
+
read_operation = lambda { @element_reader.requires_parameters? ? value_reader['1'] : value_reader.get }
|
11
|
+
read_operation.should raise_error "not yet implemented"
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'when the element reader does not require parameters' do
|
17
|
+
|
18
|
+
before do
|
19
|
+
@dummy_element = stub(:value => 'element value')
|
20
|
+
@element_reader = stub('element reader', :requires_parameters? => false, :get => @dummy_element)
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'and the output type is not a class' do
|
24
|
+
|
25
|
+
before do
|
26
|
+
@value_reader = WebViewer::ElementValueReader.new(@element_reader, :value)
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#get' do
|
30
|
+
|
31
|
+
it 'should fetch the element from the element reader' do
|
32
|
+
@element_reader.should_receive(:get).and_return(@dummy_element)
|
33
|
+
@value_reader.get
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should call the method on the element with name equal to the output type parameter' do
|
37
|
+
@dummy_element.should_receive(:value)
|
38
|
+
@value_reader.get
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should return the result of calling the method on the element with name equal to the output type parameter' do
|
42
|
+
@value_reader.get.should == 'element value'
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe ('and the type is :auto', :output_type => :auto) { it_should_behave_like UnimplementedOutputType }
|
50
|
+
describe ('and the type is :link', :output_type => :link) { it_should_behave_like UnimplementedOutputType }
|
51
|
+
describe ('and the type is :select_by_text', :output_type => :select_by_text) { it_should_behave_like UnimplementedOutputType }
|
52
|
+
describe ('and the type is :select_by_value', :output_type => :select_by_value) { it_should_behave_like UnimplementedOutputType }
|
53
|
+
|
54
|
+
describe 'and the output type is a class' do
|
55
|
+
|
56
|
+
class FakeViewer
|
57
|
+
attr :base_element_proc
|
58
|
+
end
|
59
|
+
|
60
|
+
before do
|
61
|
+
@value_reader = WebViewer::ElementValueReader.new(@element_reader, FakeViewer)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should return an instance of the specified class' do
|
65
|
+
@value_reader.get.should be_instance_of(FakeViewer)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should put a base_element_proc instance value into the returned object' do
|
69
|
+
@value_reader.get.base_element_proc.should_not be_nil
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'when the element reader requires parameters' do
|
77
|
+
|
78
|
+
before do
|
79
|
+
@dummy_element = stub(:value => 'element value')
|
80
|
+
@element_reader = stub('element reader', :requires_parameters? => true, :get => @dummy_element)
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'and the output type is not a class' do
|
84
|
+
|
85
|
+
before do
|
86
|
+
@value_reader = WebViewer::ElementValueReader.new(@element_reader, :value)
|
87
|
+
end
|
88
|
+
|
89
|
+
it '#get should return the element value reader' do
|
90
|
+
@value_reader.get.should == @value_reader
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#[]' do
|
94
|
+
|
95
|
+
it 'should fetch the element from the element reader passing provided parameters' do
|
96
|
+
@element_reader.should_receive(:get).with(1, 2, 3).and_return(@dummy_element)
|
97
|
+
@value_reader[1, 2, 3]
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should call the method on the element with name equal to the output type parameter' do
|
101
|
+
@dummy_element.should_receive(:value)
|
102
|
+
@value_reader[1]
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should return the result of calling the method on the element with name equal to the output type parameter' do
|
106
|
+
@value_reader[1].should == 'element value'
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
describe '#[]=' do
|
112
|
+
|
113
|
+
before do
|
114
|
+
@fake_value_writer = stub(:value= => nil)
|
115
|
+
WebViewer::ElementValueWriter.stub(:new).and_return(@fake_value_writer)
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should get the element from the element reader using all parameters except the assigned value' do
|
119
|
+
@element_reader.should_receive(:get).with(1, 2, 3).and_return(@dummy_element)
|
120
|
+
@value_reader[1, 2, 3] = 4
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should create an element value writer with the element and output type' do
|
124
|
+
WebViewer::ElementValueWriter.should_receive(:new).with(@dummy_element, :value)
|
125
|
+
@value_reader[1, 2, 3] = 4
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should assign the value to the writer using value=' do
|
129
|
+
@fake_value_writer.should_receive(:value=).with(4)
|
130
|
+
@value_reader[1, 2, 3] = 4
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
describe ('and the type is :auto', :output_type => :auto) { it_should_behave_like UnimplementedOutputType }
|
138
|
+
describe ('and the type is :link', :output_type => :link) { it_should_behave_like UnimplementedOutputType }
|
139
|
+
describe ('and the type is :select_by_text', :output_type => :select_by_text) { it_should_behave_like UnimplementedOutputType }
|
140
|
+
describe ('and the type is :select_by_value', :output_type => :select_by_value) { it_should_behave_like UnimplementedOutputType }
|
141
|
+
|
142
|
+
describe 'and the output type is a class' do
|
143
|
+
|
144
|
+
before do
|
145
|
+
@value_reader = WebViewer::ElementValueReader.new(@element_reader, FakeViewer)
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'should return an instance of the specified class' do
|
149
|
+
@value_reader[1, 2].should be_instance_of(FakeViewer)
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should put a base_element_proc instance value that gets the element from the reader into the returned object' do
|
153
|
+
@element_reader.should_receive(:get).with(1, 2)
|
154
|
+
@value_reader[1, 2].base_element_proc.call
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WebViewer::ElementValueWriter do
|
4
|
+
|
5
|
+
describe "#value=" do
|
6
|
+
|
7
|
+
it 'should assign the new value to its web element using value=' do
|
8
|
+
web_element = stub('WebDriver::Element')
|
9
|
+
writer = WebViewer::ElementValueWriter.new(web_element, :value)
|
10
|
+
web_element.should_receive(:value=).with('new value')
|
11
|
+
writer.value = 'new value'
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/spec/page_spec.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'an object that includes WebPage' do
|
4
|
+
|
5
|
+
class SampleWebPage
|
6
|
+
include WebPage
|
7
|
+
end
|
8
|
+
|
9
|
+
before do
|
10
|
+
@page = SampleWebPage.new
|
11
|
+
@page.stub!(:navigate).and_return(stub('navigate interface'))
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should not have a url instance method if the url class method has not been called' do
|
15
|
+
@page.respond_to?(:url).should == false
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should not have a path instance method if the path class method has not been called' do
|
19
|
+
@page.respond_to?(:path).should == false
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'with a url set using the .url class method' do
|
23
|
+
|
24
|
+
before do
|
25
|
+
class << @page
|
26
|
+
url 'http://somewhere'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should return the value from #url that was set by .url' do
|
31
|
+
@page.url.should == 'http://somewhere'
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should navigate to the absolute url when load is called' do
|
35
|
+
@page.navigate.should_receive(:to_absolute).with('http://somewhere')
|
36
|
+
@page.load
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'with a url set using the .url class method' do
|
42
|
+
|
43
|
+
before do
|
44
|
+
class << @page
|
45
|
+
path '/somewhere'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should return the value from #path that was set by .path' do
|
50
|
+
@page.path.should == '/somewhere'
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should navigate to the relative path when load is called' do
|
54
|
+
@page.navigate.should_receive(:to_relative).with('/somewhere')
|
55
|
+
@page.load
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should construct itself and call #load when .load is called' do
|
61
|
+
SampleWebPage.stub!(:new).and_return(@page)
|
62
|
+
@page.should_receive(:load)
|
63
|
+
SampleWebPage.load
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--format specdoc
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'rubygems'
|
4
|
+
require 'selenium-webdriver-viewers'
|
5
|
+
require 'spec'
|
6
|
+
require 'spec/autorun'
|
7
|
+
|
8
|
+
Spec::Runner.configure do |config|
|
9
|
+
|
10
|
+
end
|
data/spec/viewer_spec.rb
ADDED
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: selenium-webdriver-viewers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Michael Collas
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-12-16 00:00:00 +11:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 13
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 2
|
33
|
+
- 9
|
34
|
+
version: 1.2.9
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: reek
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 15
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 2
|
49
|
+
- 8
|
50
|
+
version: 1.2.8
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: sexp_processor
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 15
|
62
|
+
segments:
|
63
|
+
- 3
|
64
|
+
- 0
|
65
|
+
- 4
|
66
|
+
version: 3.0.4
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
description: " This gem makes it easy to create page and web viewer objects for use by tests that use selenium-webdriver. By\n using page and viewer objects, you can decouple your tests from the html details so that they can focus\n instead on describing the behaviour of your application. \n"
|
70
|
+
email: mcollas@yahoo.com
|
71
|
+
executables: []
|
72
|
+
|
73
|
+
extensions: []
|
74
|
+
|
75
|
+
extra_rdoc_files:
|
76
|
+
- LICENSE
|
77
|
+
- README.rdoc
|
78
|
+
- TODO
|
79
|
+
files:
|
80
|
+
- .document
|
81
|
+
- LICENSE
|
82
|
+
- README.rdoc
|
83
|
+
- Rakefile
|
84
|
+
- TODO
|
85
|
+
- VERSION
|
86
|
+
- lib/browser-instance.rb
|
87
|
+
- lib/element_reader.rb
|
88
|
+
- lib/element_value_reader.rb
|
89
|
+
- lib/element_value_writer.rb
|
90
|
+
- lib/page.rb
|
91
|
+
- lib/selenium-webdriver-viewers.rb
|
92
|
+
- lib/viewer.rb
|
93
|
+
- lib/webdriver-extensions.rb
|
94
|
+
- selenium-webdriver-viewers.gemspec
|
95
|
+
- spec/browser-instance_spec.rb
|
96
|
+
- spec/element_reader_spec.rb
|
97
|
+
- spec/element_value_reader_spec.rb
|
98
|
+
- spec/element_value_writer_spec.rb
|
99
|
+
- spec/page_spec.rb
|
100
|
+
- spec/selenium-webdriver-viewers_spec.rb
|
101
|
+
- spec/spec.opts
|
102
|
+
- spec/spec_helper.rb
|
103
|
+
- spec/viewer_spec.rb
|
104
|
+
has_rdoc: true
|
105
|
+
homepage: http://github.com/michaelcollas/selenium-webdriver-viewers
|
106
|
+
licenses: []
|
107
|
+
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
requirements: []
|
132
|
+
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 1.3.7
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: Makes page objects and views for tests using selenium-webdriver.
|
138
|
+
test_files:
|
139
|
+
- spec/browser-instance_spec.rb
|
140
|
+
- spec/element_reader_spec.rb
|
141
|
+
- spec/element_value_reader_spec.rb
|
142
|
+
- spec/element_value_writer_spec.rb
|
143
|
+
- spec/page_spec.rb
|
144
|
+
- spec/selenium-webdriver-viewers_spec.rb
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
- spec/viewer_spec.rb
|