page-objectify 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +9 -0
- data/Gemfile +4 -0
- data/README.md +112 -0
- data/Rakefile +21 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/page-objectify/ast_maker.rb +9 -0
- data/lib/page-objectify/config.rb +29 -0
- data/lib/page-objectify/dom.rb +77 -0
- data/lib/page-objectify/dom_to_ruby.rb +52 -0
- data/lib/page-objectify/generator.rb +48 -0
- data/lib/page-objectify/logging.rb +20 -0
- data/lib/page-objectify/version.rb +3 -0
- data/lib/page-objectify.rb +2 -0
- data/page-objectify.gemspec +39 -0
- metadata +201 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ae357f04a6463e9ce9ca859ef3b35dd972bf2273
|
4
|
+
data.tar.gz: d8ccb8ea92acc03c956ed4c417b181d2ecade5c6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f39e6a878b561ea68ad3ecedcf18f0e46cf190a64952ef4c0b7505ab2c8d4e66e26bb298ef89650464739e9224a7c2516ab4aa9156e604f4c584aba2b2fe437e
|
7
|
+
data.tar.gz: de9a4634a70803745848cebc3b9526998fe4f3b6a9a8a5951649b0559477cbd4c4109c42f0d4bc421c3cdedc9b783058d65b0e05af417d11d96eee4aa1f6aff5
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
# page-objectify
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/smoll/page-objectify.svg)](https://travis-ci.org/smoll/page-objectify)
|
4
|
+
|
5
|
+
A Ruby [page class](https://github.com/cheezy/page-object/wiki/Get-me-started-right-now!#describe-your-page) generator (for use with the page-object gem)
|
6
|
+
|
7
|
+
## Why?
|
8
|
+
|
9
|
+
Normally, I’d advise against using a gem like this, because the page class shouldn't necessarily contain methods for every single HTML element on the page. In fact, if the page we are modeling is anything like the Google home page, our page class should only have one or 2 methods (a.k.a. [PageObject::Accessors](http://www.rubydoc.info/github/cheezy/page-object/PageObject/Accessors)) for HTML elements: the search box and the submit button.
|
10
|
+
|
11
|
+
However, recently, almost all of the tests I have been writing have been for non-public facing sites, used by specialized, internal users who are trained on the platform. As a result, we end up with fairly dense webpages, with multiple different features and HTML elements that need interacting with, all on a single page.
|
12
|
+
|
13
|
+
Ultimately, this is the specific use case I am writing this gem for. Also, I wanted to learn a bit more about how a Ruby AST -- abstract syntax tree -- works and how the unparser gem allows me to generate working Ruby code from a dynamically generated AST.
|
14
|
+
|
15
|
+
## Changes
|
16
|
+
|
17
|
+
This gem will follow semantic versioning. See [changelog](./CHANGELOG.md) for changes in each version.
|
18
|
+
|
19
|
+
## Installation
|
20
|
+
|
21
|
+
Ensure this gem and watir-webdriver are both in your Gemfile:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
gem "page-objectify"
|
25
|
+
gem "watir-webdriver"
|
26
|
+
```
|
27
|
+
|
28
|
+
And then execute:
|
29
|
+
|
30
|
+
$ bundle
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
The supported usage of this gem is to:
|
35
|
+
* create a `SomethingPageGenerator` class that inherits from `PageObjectify::Generator`
|
36
|
+
* write a `SomethingPageGenerator#visit` method that opens a browser and navigates to the page you want to generate a page class for.
|
37
|
+
* initialize the generator class & call `#generate!` in some kind of Rake task (that is typically executed manually.)
|
38
|
+
|
39
|
+
Here's a complete example (using the Google homepage, which, as I mention above, is a [horrible use case](#why), but it works for a demo):
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
# Gemfile
|
43
|
+
gem "chromedriver-helper", "~> 1.0"
|
44
|
+
gem "page-objectify"
|
45
|
+
gem "watir-webdriver", "~> 0.9.1"
|
46
|
+
```
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
# /generators/google_page_generator.rb
|
50
|
+
require "page-objectify/generator"
|
51
|
+
require "watir-webdriver"
|
52
|
+
|
53
|
+
class GooglePageGenerator < PageObjectify::Generator
|
54
|
+
# Overriding the constructor here is optional
|
55
|
+
def initialize
|
56
|
+
super(file: "path/to/pages-dir/google_page.rb")
|
57
|
+
end
|
58
|
+
|
59
|
+
def visit
|
60
|
+
@browser = Watir::Browser.new :chrome
|
61
|
+
@browser.goto "www.google.com"
|
62
|
+
# TODO: write a #wait_for_ajax helper
|
63
|
+
sleep 1
|
64
|
+
end
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
# Rakefile
|
70
|
+
require "generators/google_page_generator"
|
71
|
+
|
72
|
+
namespace :po do
|
73
|
+
task :generate do
|
74
|
+
GooglePageGenerator.new.generate!
|
75
|
+
# and any other pages you want to generate programmatically
|
76
|
+
end
|
77
|
+
end
|
78
|
+
```
|
79
|
+
|
80
|
+
Then, upon executing the rake task `$ bundle exec rake po:generate`, the following file will be generated:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
class GooglePage < BasePage
|
84
|
+
div(:viewport, id: "viewport")
|
85
|
+
div(:"doc-info", id: "doc-info")
|
86
|
+
div(:cst, id: "cst")
|
87
|
+
text_area(:csi, id: "csi")
|
88
|
+
div(:searchform, id: "searchform")
|
89
|
+
# etc.
|
90
|
+
end
|
91
|
+
```
|
92
|
+
|
93
|
+
Currently, only those HTML elements with a **non-empty id attribute** will have PageObject accessors generated for them.
|
94
|
+
|
95
|
+
For another example (using watir-webdriver and phantomjs via the `phantomjs` gem), see [this integration test](features/generator.feature).
|
96
|
+
|
97
|
+
## Debugging & Development
|
98
|
+
|
99
|
+
The default log level is `2`. Set this to a lower level to see helpful DEBUG level prints, i.e.
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
PageObjectify::Logging.logger.level = 0
|
103
|
+
```
|
104
|
+
|
105
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
106
|
+
|
107
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
108
|
+
|
109
|
+
## Contributing
|
110
|
+
|
111
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/smoll/page-objectify.
|
112
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
rescue LoadError
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'cucumber/rake/task'
|
10
|
+
|
11
|
+
Cucumber::Rake::Task.new do |t|
|
12
|
+
t.cucumber_opts = ""
|
13
|
+
t.cucumber_opts << "--format pretty"
|
14
|
+
end
|
15
|
+
|
16
|
+
Cucumber::Rake::Task.new(:cucumber_wip) do |t|
|
17
|
+
t.cucumber_opts = "-p wip"
|
18
|
+
end
|
19
|
+
|
20
|
+
task test: [:spec, :cucumber]
|
21
|
+
task default: :test
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "page-objectify"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module PageObjectify
|
2
|
+
class Config
|
3
|
+
attr_reader :page, :base, :file
|
4
|
+
|
5
|
+
def initialize(**keywords)
|
6
|
+
truncated = keywords[:generator_class].chomp("Generator")
|
7
|
+
@page = keywords[:page] || truncated
|
8
|
+
@base = keywords[:base] || "BasePage"
|
9
|
+
@file = keywords[:file] || "#{underscorize(truncated)}.rb"
|
10
|
+
validate_configs
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate_configs
|
14
|
+
fail "@page must be a String! @page=#{@page.inspect}" unless @page.is_a?(String)
|
15
|
+
fail "@base must be a String! @base=#{@base.inspect}" unless @base.is_a?(String)
|
16
|
+
fail "@file must end with '.rb'! @file=#{@file.inspect}" unless @file.end_with?(".rb")
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def underscorize(str)
|
22
|
+
str.gsub(/::/, '/').
|
23
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
24
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
25
|
+
tr("-", "_").
|
26
|
+
downcase
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require "page-object"
|
2
|
+
require "page-objectify/logging"
|
3
|
+
|
4
|
+
module PageObjectify
|
5
|
+
class DOM
|
6
|
+
include Logging
|
7
|
+
|
8
|
+
def initialize(doc)
|
9
|
+
@doc = doc
|
10
|
+
@accessors = []
|
11
|
+
@tags_to_accessors = {}
|
12
|
+
@input_types_to_accessors = {}
|
13
|
+
@types = %i(text password checkbox button image reset submit radio hidden file)
|
14
|
+
@ignored_tags = %i(meta style body) # that could possibly have an HTML id
|
15
|
+
|
16
|
+
generate_mapping
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_accessors
|
20
|
+
# Grab only nodes with non-empty HTML id
|
21
|
+
@doc.xpath("//*[@id!='']").each do |node|
|
22
|
+
accessor = accessor_for(node)
|
23
|
+
@accessors << { accessor: accessor, id: node.attributes["id"].to_s } if accessor
|
24
|
+
end
|
25
|
+
logger.info "DOM nodes convertable to PageObject::Accessors: #{@accessors.count}"
|
26
|
+
@accessors
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# Returns a String
|
32
|
+
def accessor_for(node)
|
33
|
+
tag = node.name.to_sym
|
34
|
+
|
35
|
+
unless supported?(tag)
|
36
|
+
logger.warn "Tag #{tag} is not supported! This may be a bug in the PageObjectify gem, please report it! :)" unless ignored?(tag)
|
37
|
+
return nil
|
38
|
+
end
|
39
|
+
|
40
|
+
# check if node is ~ <input type="blah">
|
41
|
+
if tag == :input
|
42
|
+
type = node.attributes["type"].to_s.to_sym
|
43
|
+
return @input_types_to_accessors[type]
|
44
|
+
end
|
45
|
+
@tags_to_accessors[tag]
|
46
|
+
end
|
47
|
+
|
48
|
+
def supported?(tag)
|
49
|
+
return true if tag == :input
|
50
|
+
return true if @tags_to_accessors.has_key?(tag)
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
# Explicitly ignore tags like <meta>
|
55
|
+
def ignored?(tag)
|
56
|
+
@ignored_tags.include?(tag)
|
57
|
+
end
|
58
|
+
|
59
|
+
# From https://github.com/cheezy/page-object/wiki/Methods-for-HTML-Tags
|
60
|
+
def generate_mapping
|
61
|
+
type_map = PageObject::Elements.type_to_class
|
62
|
+
tag_map = PageObject::Elements.tag_to_class
|
63
|
+
combined = type_map.merge(tag_map)
|
64
|
+
|
65
|
+
combined.each do |key, value|
|
66
|
+
@tags_to_accessors[key] = value.to_s.split('::').last.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
|
67
|
+
end
|
68
|
+
|
69
|
+
@types.each do |type|
|
70
|
+
@input_types_to_accessors[type] = @tags_to_accessors.delete(type)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Fix for <input type="button"> and <button> duping each other
|
74
|
+
@tags_to_accessors[:button] = "button"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "unparser"
|
2
|
+
require "page-objectify/ast_maker"
|
3
|
+
require "page-objectify/config"
|
4
|
+
|
5
|
+
module PageObjectify
|
6
|
+
# Takes an Array of DOM elements
|
7
|
+
# and generates Ruby code (page class containing PageObject::Accessors)
|
8
|
+
class DOMToRuby
|
9
|
+
include ASTMaker
|
10
|
+
|
11
|
+
def initialize(dom, config)
|
12
|
+
@dom = dom
|
13
|
+
@config = config
|
14
|
+
end
|
15
|
+
|
16
|
+
# Generate Ruby source as a String
|
17
|
+
def unparse
|
18
|
+
tree = s(:class,
|
19
|
+
*first_line,
|
20
|
+
s(:begin, *accessors)
|
21
|
+
)
|
22
|
+
Unparser.unparse(tree)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# Array of Parser::AST::Nodes, which represents the line:
|
28
|
+
# "GeneratedPage < BasePage"
|
29
|
+
def first_line
|
30
|
+
[s(:const, nil, @config.page), s(:const, nil, @config.base)]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Array of AST nodes, which represent lines that look like:
|
34
|
+
# button(:submit, id: "submit")
|
35
|
+
# button(:cancel, id: "cancel")
|
36
|
+
def accessors
|
37
|
+
res = []
|
38
|
+
@dom.to_accessors.each do |element|
|
39
|
+
res << s(:send, nil, element[:accessor].to_sym,
|
40
|
+
s(:sym, element[:id].to_sym),
|
41
|
+
s(:hash,
|
42
|
+
s(:pair,
|
43
|
+
s(:sym, :id),
|
44
|
+
s(:str, element[:id])
|
45
|
+
)
|
46
|
+
)
|
47
|
+
)
|
48
|
+
end
|
49
|
+
res
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
require "page-objectify/config"
|
3
|
+
require "page-objectify/dom"
|
4
|
+
require "page-objectify/dom_to_ruby"
|
5
|
+
require "page-objectify/logging"
|
6
|
+
|
7
|
+
module PageObjectify
|
8
|
+
class Generator
|
9
|
+
include Logging
|
10
|
+
|
11
|
+
def initialize(**config)
|
12
|
+
@config = Config.new(generator_class: self.class.to_s, **config)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Calls #visit, generates a page class for the current page, then calls #teardown
|
16
|
+
# Raises a NotImplementedError if #visit is not implemented
|
17
|
+
# Raises a RuntimeError if @browser is not a Watir::Browser object
|
18
|
+
def generate!
|
19
|
+
raise NotImplementedError, "The #visit method does not exist! Please implement it!" unless respond_to?(:visit)
|
20
|
+
visit
|
21
|
+
execute_runtime_checks
|
22
|
+
|
23
|
+
logger.info "About to parse HTML! Current URL: #{@browser.url}"
|
24
|
+
|
25
|
+
doc = Nokogiri::HTML(@browser.html)
|
26
|
+
@code = DOMToRuby.new(DOM.new(doc), @config).unparse
|
27
|
+
|
28
|
+
logger.debug "** BEGIN GENERATED CODE **"
|
29
|
+
@code.each_line { |line| logger.debug line.chomp }
|
30
|
+
logger.debug "** END GENERATED CODE **"
|
31
|
+
|
32
|
+
File.open(@config.file, 'w') { |file| file.write(@code) }
|
33
|
+
|
34
|
+
teardown
|
35
|
+
end
|
36
|
+
|
37
|
+
def teardown
|
38
|
+
@browser.quit
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def execute_runtime_checks
|
44
|
+
fail "@browser variable must be a Watir::Browser instance! @browser=#{@browser.inspect}" unless @browser.is_a?(Watir::Browser)
|
45
|
+
fail "Cannot get current page HTML!" unless @browser.respond_to?(:html)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "logger"
|
2
|
+
|
3
|
+
module PageObjectify
|
4
|
+
module Logging
|
5
|
+
def logger
|
6
|
+
Logging.logger
|
7
|
+
end
|
8
|
+
|
9
|
+
class << self
|
10
|
+
attr_writer :logger
|
11
|
+
|
12
|
+
def logger
|
13
|
+
@logger ||= Logger.new($stdout).tap do |log|
|
14
|
+
log.progname = self.name
|
15
|
+
log.level = 2
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'page-objectify/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "page-objectify"
|
8
|
+
spec.version = PageObjectify::VERSION
|
9
|
+
spec.authors = ["Shujon Mollah"]
|
10
|
+
spec.email = ["mollah@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{A Ruby page class generator (for use with the page-object gem)}
|
13
|
+
spec.homepage = "https://github.com/smoll/page-objectify"
|
14
|
+
|
15
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
16
|
+
# delete this section to allow pushing this gem to any host.
|
17
|
+
if spec.respond_to?(:metadata)
|
18
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
19
|
+
else
|
20
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
21
|
+
end
|
22
|
+
|
23
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
+
spec.bindir = "exe"
|
25
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
|
+
spec.require_paths = ["lib"]
|
27
|
+
|
28
|
+
spec.add_dependency "nokogiri", "~> 1.6"
|
29
|
+
spec.add_dependency "unparser", "~> 0.2.4"
|
30
|
+
spec.add_dependency "page-object", "~> 1.1"
|
31
|
+
|
32
|
+
spec.add_development_dependency "aruba", "~> 0.10.0"
|
33
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
34
|
+
spec.add_development_dependency "chromedriver-helper", "~> 1.0"
|
35
|
+
spec.add_development_dependency "phantomjs", "~> 1.9"
|
36
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
37
|
+
spec.add_development_dependency "rspec", "~> 3.3"
|
38
|
+
spec.add_development_dependency "watir-webdriver", "~> 0.9.1"
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,201 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: page-objectify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shujon Mollah
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-11-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: unparser
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.2.4
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.2.4
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: page-object
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.1'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: aruba
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.10.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.10.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.10'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.10'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: chromedriver-helper
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: phantomjs
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.9'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.9'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '10.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '10.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '3.3'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '3.3'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: watir-webdriver
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.9.1
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.9.1
|
153
|
+
description:
|
154
|
+
email:
|
155
|
+
- mollah@gmail.com
|
156
|
+
executables: []
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- ".gitignore"
|
161
|
+
- ".rspec"
|
162
|
+
- ".travis.yml"
|
163
|
+
- Gemfile
|
164
|
+
- README.md
|
165
|
+
- Rakefile
|
166
|
+
- bin/console
|
167
|
+
- bin/setup
|
168
|
+
- lib/page-objectify.rb
|
169
|
+
- lib/page-objectify/ast_maker.rb
|
170
|
+
- lib/page-objectify/config.rb
|
171
|
+
- lib/page-objectify/dom.rb
|
172
|
+
- lib/page-objectify/dom_to_ruby.rb
|
173
|
+
- lib/page-objectify/generator.rb
|
174
|
+
- lib/page-objectify/logging.rb
|
175
|
+
- lib/page-objectify/version.rb
|
176
|
+
- page-objectify.gemspec
|
177
|
+
homepage: https://github.com/smoll/page-objectify
|
178
|
+
licenses: []
|
179
|
+
metadata:
|
180
|
+
allowed_push_host: https://rubygems.org
|
181
|
+
post_install_message:
|
182
|
+
rdoc_options: []
|
183
|
+
require_paths:
|
184
|
+
- lib
|
185
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - ">="
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
requirements: []
|
196
|
+
rubyforge_project:
|
197
|
+
rubygems_version: 2.4.3
|
198
|
+
signing_key:
|
199
|
+
specification_version: 4
|
200
|
+
summary: A Ruby page class generator (for use with the page-object gem)
|
201
|
+
test_files: []
|