page-object-pal 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +60 -0
- data/Rakefile +8 -0
- data/lib/page-object-pal.rb +70 -0
- data/lib/page-object-pal/diff.rb +51 -0
- data/lib/page-object-pal/elements.rb +89 -0
- data/lib/page-object-pal/exceptions.rb +6 -0
- data/lib/page-object-pal/version.rb +3 -0
- data/page-object-pal.gemspec +28 -0
- data/spec/Page.rb +16 -0
- data/spec/dsl_conversion_spec.rb +16 -0
- data/spec/elements_spec.rb +10 -0
- data/spec/exceptions_spec.rb +23 -0
- data/spec/identifiers_spec.rb +16 -0
- data/spec/spec_helper.rb +10 -0
- metadata +174 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Johnson Denen
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# PageObjectPal
|
2
|
+
|
3
|
+
PageObjectPal keeps an eye on your [page-object](https://github.com/cheezy/page-object) classes, alerting you to outdated element information. Unit test your page classes with PageObjectPal, and don't wait for your acceptance tests to fail!
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'page-object-pal'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install page-object-pal
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
PageObjectPal is a self-extending module and needs only one method call. `PageObjectPal#examine` takes three arguments: a class, a filepath, and a URL. It returns ```true``` if your page objects pass, and raises a `PageObjectInvalid` error if they fail.
|
22
|
+
|
23
|
+
Call `PageObjectPal#examine` from your specs:
|
24
|
+
```ruby
|
25
|
+
require 'page-object-pal'
|
26
|
+
describe Page do
|
27
|
+
it "should reference valid elements in its methods" do
|
28
|
+
PageObjectPal.examine(Page, '/path/to/Page', 'http://www.page.com').should be_true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
```
|
32
|
+
|
33
|
+
Or wrap `PageObjectPal#examine` in a class method to be called in your specs:
|
34
|
+
```ruby
|
35
|
+
require 'page-object'
|
36
|
+
require 'page-object-pal'
|
37
|
+
class Page
|
38
|
+
include 'PageObject'
|
39
|
+
def self.examine
|
40
|
+
PageObjectPal.examine(self, __FILE__, 'http://www.page.com')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
```
|
44
|
+
|
45
|
+
## Contributing
|
46
|
+
|
47
|
+
1. Fork it
|
48
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
49
|
+
3. Write tests for your feature
|
50
|
+
4. Code until your tests pass (`rake`)
|
51
|
+
5. Commit your changes (`git commit -am 'Add some feature'`)
|
52
|
+
6. Push to the branch (`git push origin my-new-feature`)
|
53
|
+
7. Create new Pull Request
|
54
|
+
|
55
|
+
## Testing
|
56
|
+
|
57
|
+
I'm partial to the rspec-given syntax and use it in [my unit tests](/spec). Please do the same. If you're unfamiliar with [rspec-given](https://github.com/jimweirich/rspec-given), you should check it out!
|
58
|
+
|
59
|
+
## Issues/Comments/Questions?
|
60
|
+
Write something up in the [Issues Tracker](https://github.com/jdenen/page-object-pal/issues). Or contact me via twitter, [@jpdenen](http://twitter.com/jpdenen)!
|
data/Rakefile
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require "page-object-pal/version"
|
2
|
+
require "page-object-pal/elements"
|
3
|
+
require "page-object-pal/diff"
|
4
|
+
require "nokogiri"
|
5
|
+
require "open-uri"
|
6
|
+
#
|
7
|
+
# Module that will compare element identifying information used to define
|
8
|
+
# instance methods in PageObject classes to the HTML source code of a URL.
|
9
|
+
# Use to keep page objects from becoming stale/unit testing your classes.
|
10
|
+
#
|
11
|
+
# Can be used independent of class to unit test page object.
|
12
|
+
# @example Independent test
|
13
|
+
# describe Page do
|
14
|
+
# it "calls upon valid elements in its instance methods" do
|
15
|
+
# PageObjectPal.examine(Page, 'path/to/page/file', 'http://www.page.com').should be_true
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# Can wrapped in a page object class method for validation.
|
20
|
+
# @example Class method
|
21
|
+
# class Page
|
22
|
+
# include PageObject
|
23
|
+
#
|
24
|
+
# def self.elements_still_valid
|
25
|
+
# PageObjectPal.examine(self, __FILE__, 'http://www.page.com')
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
module PageObjectPal
|
30
|
+
include PageObjectPal::Elements
|
31
|
+
include PageObjectPal::Diff
|
32
|
+
extend self
|
33
|
+
|
34
|
+
#
|
35
|
+
# Compare elements constructed by the PageObject::DSL to the elements in the
|
36
|
+
# URL's source code.
|
37
|
+
#
|
38
|
+
# @param [Class] Page object class to be tested
|
39
|
+
# @param [String] Path to the file housing the class being tested
|
40
|
+
# @param [String] Page URL
|
41
|
+
#
|
42
|
+
# @return [Boolean] True if no error is raised
|
43
|
+
#
|
44
|
+
def examine(klass, path, url)
|
45
|
+
diff_page(Nokogiri::HTML(open(url)), parse_class(klass, path))
|
46
|
+
success!
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def success!
|
51
|
+
true
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Parse elements from the page object class methods.
|
56
|
+
#
|
57
|
+
def parse_class(klass, path)
|
58
|
+
methods = find_class_methods(klass)
|
59
|
+
elements = parse_methods(methods, path)
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# Grab instance methods defined in the page object class and not its super classes.
|
64
|
+
#
|
65
|
+
def find_class_methods(klass)
|
66
|
+
methods = []
|
67
|
+
klass.instance_methods(false).each { |m| methods << m }
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'page-object-pal/exceptions'
|
2
|
+
require 'page-object-pal/elements'
|
3
|
+
|
4
|
+
module PageObjectPal
|
5
|
+
module Diff
|
6
|
+
include PageObjectPal::Elements
|
7
|
+
|
8
|
+
#
|
9
|
+
# Find page object defined methods that do not match code
|
10
|
+
# in the source HTML.
|
11
|
+
#
|
12
|
+
def diff_page(source, elements)
|
13
|
+
elements.each do |e_hash|
|
14
|
+
e_hash.each do |elem, identifier|
|
15
|
+
scrub_source(elem, identifier, source)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Look for code in the source HTML matching the identifying
|
22
|
+
# code defined in the page object class.
|
23
|
+
#
|
24
|
+
def scrub_source(tag, identifier, source)
|
25
|
+
identifier.each do |prop, prop_val|
|
26
|
+
match = case prop
|
27
|
+
when :class
|
28
|
+
source.css("#{tag.to_s}.#{prop_val}")
|
29
|
+
when :id
|
30
|
+
source.css("#{tag.to_s}##{prop_val}")
|
31
|
+
when :index
|
32
|
+
source.css("#{tag.to_s}")[prop_val.to_i]
|
33
|
+
when :text
|
34
|
+
source.search("[text()*='#{prop_val}']")
|
35
|
+
when :xpath
|
36
|
+
source.xpath(prop_val)
|
37
|
+
else
|
38
|
+
raise SupportError, "PageObjectPal doesn't support elements identified by '#{prop}'... yet. Consider ",
|
39
|
+
"forking the project at http://github.com/jdenen/page-object-pal."
|
40
|
+
end
|
41
|
+
|
42
|
+
raise PageObjectOutdated, "Could not identify '#{html_to_dsl(tag)}' where :#{prop} == '#{prop_val}'" if failure? match
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def failure?(match)
|
47
|
+
match.to_a.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module PageObjectPal
|
2
|
+
module Elements
|
3
|
+
|
4
|
+
#
|
5
|
+
# Find lines in the page object class file that define the non-super
|
6
|
+
# instance methods.
|
7
|
+
#
|
8
|
+
def parse_methods(methods, path)
|
9
|
+
elements = []
|
10
|
+
methods.each do |meth|
|
11
|
+
File.open(path).read.each_line do |line|
|
12
|
+
next unless line.include? meth.to_s
|
13
|
+
next unless line.lstrip.start_with? "div", "element", "image", "link", "list_item", "ordered_list", "paragraph", "radio_button", "span", "text_area", "text_field", "unordered_list"
|
14
|
+
elements << parse_element(line.lstrip)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
elements
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Convert method defining string to hash containing anchor_tag,
|
22
|
+
# identifying_property, and property_value.
|
23
|
+
#
|
24
|
+
def parse_element(string)
|
25
|
+
string.gsub!(/(,\s+)/, ",")
|
26
|
+
tag = dsl_to_html(string[/^(\w+)/])
|
27
|
+
|
28
|
+
case tag
|
29
|
+
when :element then element_tag(string)
|
30
|
+
else standard_tag(tag, string)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Convert method defining string for PageObject::Accessors#element method.
|
36
|
+
#
|
37
|
+
def element_tag(string)
|
38
|
+
tag = string[/,:(\w+)/].gsub(",:","")
|
39
|
+
sym = string[/:class|:id|:index|:text|:xpath/].gsub(":","").to_sym
|
40
|
+
(sym == :index) ? val = string[/\d+/] : val = string[/"(.+)"/].gsub("\"","")
|
41
|
+
{ tag => { sym => val } }
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Convert method defining string for standard PageObject::Accessors methods.
|
46
|
+
#
|
47
|
+
def standard_tag(tag, string)
|
48
|
+
sym = string[/:class|:id|:index|:text|:xpath/].gsub(":","").to_sym
|
49
|
+
(sym == :index) ? val = string[/\d+/] : val = string[/"(.+)"/].gsub("\"","")
|
50
|
+
{ tag => { sym => val } }
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Convert non-HTML anchor_tags from the PageObject::DSL to HTML.
|
55
|
+
#
|
56
|
+
def dsl_to_html(anchor)
|
57
|
+
case anchor
|
58
|
+
when "image" then :img
|
59
|
+
when "link" then :a
|
60
|
+
when "list_item" then :li
|
61
|
+
when "ordered_list" then :ol
|
62
|
+
when "paragraph" then :p
|
63
|
+
when "radio_button" then :radio
|
64
|
+
when "text_area" then :input
|
65
|
+
when "text_field" then :input
|
66
|
+
when "unordered_list" then :ul
|
67
|
+
else anchor.to_sym
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Convert HTML to PageObject::DSL where the two are not identical.
|
73
|
+
#
|
74
|
+
def html_to_dsl(anchor)
|
75
|
+
case anchor
|
76
|
+
when :img then "image"
|
77
|
+
when :a then "link"
|
78
|
+
when :li then "list_item"
|
79
|
+
when :ol then "ordered_list"
|
80
|
+
when :p then "paragraph"
|
81
|
+
when :radio then "radio_button"
|
82
|
+
when :input then "text_field/text_area"
|
83
|
+
when :ul then "unordered_list"
|
84
|
+
else anchor.to_s
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'page-object-pal/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "page-object-pal"
|
8
|
+
spec.version = PageObjectPal::VERSION
|
9
|
+
spec.authors = ["Johnson Denen"]
|
10
|
+
spec.email = ["jdenen@manta.com"]
|
11
|
+
spec.description = %q{Did the test suite find a bug? Or are the page objects outdated by new code? PageObjectPal will keep an eye on your page objects and let you know when they need some TLC.}
|
12
|
+
spec.summary = %q{Page object maintenance made easier}
|
13
|
+
spec.homepage = "http://github.com/jdenen/page-object-pal"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "nokogiri", "~> 1.6.0"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec", ">= 2.12.0"
|
26
|
+
spec.add_development_dependency "rspec-given", "~> 3.1.1"
|
27
|
+
spec.add_development_dependency "page-object", "~> 0.9.2"
|
28
|
+
end
|
data/spec/Page.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'page-object'
|
2
|
+
|
3
|
+
class Page
|
4
|
+
include PageObject
|
5
|
+
link(:by_class, :class => "coolLight")
|
6
|
+
link(:by_id, :id => "signup-nav-header")
|
7
|
+
link(:by_index, :index => 0)
|
8
|
+
link(:by_text, :text => "Advertise With Us")
|
9
|
+
link(:by_xpath, :xpath => "(//a)[1]")
|
10
|
+
element(:by_element, :a, :xpath => "(//a)[1]")
|
11
|
+
|
12
|
+
def self.healthy?
|
13
|
+
PageObjectPal.examine(self, __FILE__, "http://www.manta.com")
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
|
3
|
+
describe PageObjectPal do
|
4
|
+
context "Converting to-and-from PageObject DSL" do
|
5
|
+
context "Converting most tags" do
|
6
|
+
['div','image','link','list_item','ordered_list','paragraph','radio_button','unordered_list'].each do |anchor_tag|
|
7
|
+
Then { PageObjectPal.html_to_dsl(PageObjectPal.dsl_to_html(anchor_tag)).should == anchor_tag }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context "Converting text_area and text_field" do
|
12
|
+
Then { PageObjectPal.html_to_dsl(PageObjectPal.dsl_to_html("text_area")).should == "text_field/text_area" }
|
13
|
+
And { PageObjectPal.html_to_dsl(PageObjectPal.dsl_to_html("text_field")).should == "text_field/text_area" }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
|
3
|
+
describe PageObjectPal, :private => true do
|
4
|
+
Given(:source) { Nokogiri::HTML(open("http://www.manta.com")) }
|
5
|
+
|
6
|
+
context "using unsupported identifying property" do
|
7
|
+
Then { expect { PageObjectPal.scrub_source('a', {:numero => 'uno'}, source) }.to raise_error(PageObjectPal::SupportError) }
|
8
|
+
end
|
9
|
+
|
10
|
+
context "using invalid identification" do
|
11
|
+
context "HTML selectors" do
|
12
|
+
Then { expect { PageObjectPal.scrub_source('a', {:class => 'invalid-class'}, source) }.to raise_error(PageObjectPal::PageObjectOutdated) }
|
13
|
+
Then { expect { PageObjectPal.scrub_source('a', {:id => 'invalid-id'}, source) }.to raise_error(PageObjectPal::PageObjectOutdated) }
|
14
|
+
Then { expect { PageObjectPal.scrub_source('a', {:index => 9000}, source) }.to raise_error(PageObjectPal::PageObjectOutdated) }
|
15
|
+
Then { expect { PageObjectPal.scrub_source('a', {:text => 'xxcvxddvndxm'}, source) }.to raise_error(PageObjectPal::PageObjectOutdated) }
|
16
|
+
end
|
17
|
+
|
18
|
+
context "Xpath selector" do
|
19
|
+
Then { expect { PageObjectPal.scrub_source('a', {:xpath => "//a[@id='invalid-id']"}, source) }.to raise_error(PageObjectPal::PageObjectOutdated) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
|
3
|
+
describe PageObjectPal do
|
4
|
+
Given(:page) { require_relative 'Page'; Page }
|
5
|
+
Given(:path) { File.join(File.dirname(__FILE__), "Page.rb") }
|
6
|
+
Given(:src) { "http://www.manta.com" }
|
7
|
+
|
8
|
+
context "Evaluate from outside PageObject" do
|
9
|
+
Then { PageObjectPal.examine(page, path, src).should be_true }
|
10
|
+
end
|
11
|
+
|
12
|
+
context "Evaluate from PageObject method" do
|
13
|
+
Then { page.healthy?.should be_true }
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: page-object-pal
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Johnson Denen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.6.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.6.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.3'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.3'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.12.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.12.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rspec-given
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 3.1.1
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 3.1.1
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: page-object
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.9.2
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.9.2
|
110
|
+
description: Did the test suite find a bug? Or are the page objects outdated by new
|
111
|
+
code? PageObjectPal will keep an eye on your page objects and let you know when
|
112
|
+
they need some TLC.
|
113
|
+
email:
|
114
|
+
- jdenen@manta.com
|
115
|
+
executables: []
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- .gitignore
|
120
|
+
- .rspec
|
121
|
+
- Gemfile
|
122
|
+
- LICENSE.txt
|
123
|
+
- README.md
|
124
|
+
- Rakefile
|
125
|
+
- lib/page-object-pal.rb
|
126
|
+
- lib/page-object-pal/diff.rb
|
127
|
+
- lib/page-object-pal/elements.rb
|
128
|
+
- lib/page-object-pal/exceptions.rb
|
129
|
+
- lib/page-object-pal/version.rb
|
130
|
+
- page-object-pal.gemspec
|
131
|
+
- spec/Page.rb
|
132
|
+
- spec/dsl_conversion_spec.rb
|
133
|
+
- spec/elements_spec.rb
|
134
|
+
- spec/exceptions_spec.rb
|
135
|
+
- spec/identifiers_spec.rb
|
136
|
+
- spec/spec_helper.rb
|
137
|
+
homepage: http://github.com/jdenen/page-object-pal
|
138
|
+
licenses:
|
139
|
+
- MIT
|
140
|
+
post_install_message:
|
141
|
+
rdoc_options: []
|
142
|
+
require_paths:
|
143
|
+
- lib
|
144
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
segments:
|
151
|
+
- 0
|
152
|
+
hash: -577390764071290171
|
153
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
segments:
|
160
|
+
- 0
|
161
|
+
hash: -577390764071290171
|
162
|
+
requirements: []
|
163
|
+
rubyforge_project:
|
164
|
+
rubygems_version: 1.8.25
|
165
|
+
signing_key:
|
166
|
+
specification_version: 3
|
167
|
+
summary: Page object maintenance made easier
|
168
|
+
test_files:
|
169
|
+
- spec/Page.rb
|
170
|
+
- spec/dsl_conversion_spec.rb
|
171
|
+
- spec/elements_spec.rb
|
172
|
+
- spec/exceptions_spec.rb
|
173
|
+
- spec/identifiers_spec.rb
|
174
|
+
- spec/spec_helper.rb
|