capybara-wheel 0.0.3
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +159 -0
- data/Rakefile +1 -0
- data/capybara-wheel.gemspec +30 -0
- data/lib/capybara/wheel.rb +34 -0
- data/lib/capybara/wheel/element.rb +75 -0
- data/lib/capybara/wheel/element_factory.rb +31 -0
- data/lib/capybara/wheel/includes.rb +32 -0
- data/lib/capybara/wheel/page.rb +60 -0
- data/lib/capybara/wheel/subelement.rb +24 -0
- data/lib/capybara/wheel/version.rb +5 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/wheel_spec.rb +108 -0
- metadata +174 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fd80ae9d800e4bff8293c3c6a913e0817915ee8e
|
4
|
+
data.tar.gz: 83f9bafd3a783f3c5503704e7b0f16988c4073db
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 65aed3f76018833406c291d04acea02753f5541d672c0de57311eb1c6f1a406aa4caba3957dc2e463a70c93279f52df612fb8296e741ad77f3ff531673beba6e
|
7
|
+
data.tar.gz: a793890e6f6ae8f8ffbcb361c7bd68f5acf502cd1ba9b3c098601bc18558fa98001a04db98bb96f41d9f6b493c8f4e236cc0d2093e3fb7659b6a53a0550e6f4a
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Gabriel Rotbart
|
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,159 @@
|
|
1
|
+
# Capybara::Wheel
|
2
|
+
> Keeping the rodent on track
|
3
|
+
|
4
|
+
Capybara wheel is a page model framework which natively and (hopefully) easily enforces stability coventions:
|
5
|
+
|
6
|
+
- No memoization. Every action or query relating to the page should make a new find callback to the actual page.
|
7
|
+
- Enforces native Capybara wait time when interacting with the page if the element is not there (yet) or changed.
|
8
|
+
|
9
|
+
- No access to capybara directly from the specs.
|
10
|
+
- Enforces single point of reference to selectors / elements.
|
11
|
+
- Also helps reducing memoizations.
|
12
|
+
|
13
|
+
- Subelements structure to scope finds to a specific section of the page.
|
14
|
+
- Reduces ambiguity.
|
15
|
+
|
16
|
+
*A special thank you to @woollyams for the initial concept*
|
17
|
+
|
18
|
+
## Installation
|
19
|
+
|
20
|
+
Add this line to your application's Gemfile:
|
21
|
+
|
22
|
+
gem 'capybara-wheel'
|
23
|
+
|
24
|
+
And then execute:
|
25
|
+
|
26
|
+
$ bundle
|
27
|
+
|
28
|
+
Or install it yourself as:
|
29
|
+
|
30
|
+
$ gem install capybara-wheel
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
In spec_helper.rb:
|
35
|
+
|
36
|
+
$ require 'capybara/wheel'
|
37
|
+
|
38
|
+
**Important: Capybara Wheel overrides Capybara native `feature` method to inject new behavior. This means it should be required instead or Capybara**
|
39
|
+
|
40
|
+
## Modeling
|
41
|
+
|
42
|
+
### Page Model
|
43
|
+
|
44
|
+
|
45
|
+
To model a new page:
|
46
|
+
|
47
|
+
class NewPage < Capybara::Wheel::Page
|
48
|
+
|
49
|
+
A page needs to implament two methods:
|
50
|
+
|
51
|
+
def path
|
52
|
+
# implament to support visiting the page directly
|
53
|
+
# Rails apps can include Rails.application.routes.url_helpers to access the url helpers
|
54
|
+
# Other applications should implament a relative url
|
55
|
+
end
|
56
|
+
|
57
|
+
and
|
58
|
+
|
59
|
+
def on_page?
|
60
|
+
# Capybara Wheel calls this method before excuting the page block (see Specs section below below)
|
61
|
+
# Recommended: Use Wheel native Page method has_title?('Title')
|
62
|
+
# e.g. has_title?('Login')
|
63
|
+
|
64
|
+
# Or: Use Capybara.find(any selector you expect would be on a loaded page)
|
65
|
+
# e.g. Capybara.find('h1', text: 'Login Page')
|
66
|
+
end
|
67
|
+
|
68
|
+
> Example:
|
69
|
+
>
|
70
|
+
> class SuperVillanConsole << Capybara::Wheel::Page
|
71
|
+
>
|
72
|
+
> def path
|
73
|
+
> super_villan_console_path
|
74
|
+
> end
|
75
|
+
>
|
76
|
+
> def on_page?
|
77
|
+
> has_title?('Destroy all humans')
|
78
|
+
> end
|
79
|
+
> end
|
80
|
+
|
81
|
+
***
|
82
|
+
|
83
|
+
### Element and Subelement model
|
84
|
+
|
85
|
+
#### Element
|
86
|
+
|
87
|
+
Once inside a Page model, it has access to the `element` method.
|
88
|
+
|
89
|
+
element 'ElementName', 'selector' *optional block*
|
90
|
+
|
91
|
+
# Wheel recommends using a name that follows the class constant name convention (i.e CamelCase)
|
92
|
+
# as an object will be created and assigned this name (see below)
|
93
|
+
|
94
|
+
The `element` method does several important things:
|
95
|
+
|
96
|
+
1. It defines a Page method element_name which allows access and initializes...
|
97
|
+
2. an Element model
|
98
|
+
|
99
|
+
Out of the box, Element accepts all the old familar Capybara Element actions / queries (e.g. click, set, text, visible?).Once an action or query is sent to a Wheel element it then finds the native Capybara element and passes it on. This ensures that each method call is executed on the newset version of the element.
|
100
|
+
|
101
|
+
Passing a block to element gives access to the Element object for the purpose of implamenting SubElements (see below) or rolling your own methods:
|
102
|
+
|
103
|
+
**The `capybara_element` method is the direct accessor to the native Capybara element callback.**
|
104
|
+
|
105
|
+
> Example
|
106
|
+
>
|
107
|
+
> element 'ButtonOfDoom', '#doom-button' do
|
108
|
+
>
|
109
|
+
> def armed?
|
110
|
+
> capybara_element.text == 'Armed'
|
111
|
+
> end
|
112
|
+
>
|
113
|
+
> end
|
114
|
+
>
|
115
|
+
> element 'MissleTracker', '.missle-tracker'
|
116
|
+
>
|
117
|
+
>
|
118
|
+
> #=> SuperVillanConsole.new.button_of_doom.armed?
|
119
|
+
>
|
120
|
+
> #=> SuperVillanConsole.new.missle_tracker.visible?
|
121
|
+
>
|
122
|
+
|
123
|
+
|
124
|
+
#### Subelement
|
125
|
+
|
126
|
+
An element block also accepts the `subelement` method.
|
127
|
+
|
128
|
+
subelement 'SubElementName', 'selector' *optional block*
|
129
|
+
|
130
|
+
A subelement behaves exactly like element with one difference, the find is scoped to the containing (or parent) element which reduces ambiguity.
|
131
|
+
|
132
|
+
> Example
|
133
|
+
>
|
134
|
+
> element 'ButtonOfDoom', '#doom-button' do
|
135
|
+
>
|
136
|
+
> subelement 'ArmingKey', '#key' do
|
137
|
+
>
|
138
|
+
> def turn
|
139
|
+
> capybara_element.click
|
140
|
+
> end
|
141
|
+
>
|
142
|
+
> end
|
143
|
+
> end
|
144
|
+
>
|
145
|
+
> #=> SuperVillanConsole.new.button_of_doom.turn
|
146
|
+
|
147
|
+
***
|
148
|
+
***
|
149
|
+
***
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
## Contributing
|
154
|
+
|
155
|
+
1. Fork it
|
156
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
157
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
158
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
159
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'capybara/wheel/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "capybara-wheel"
|
8
|
+
spec.version = Capybara::Wheel::VERSION
|
9
|
+
spec.authors = ["@gabrielrotbart"]
|
10
|
+
spec.email = ["gabe@hooroo.com"]
|
11
|
+
spec.description = %q{Keeping the rodent on track}
|
12
|
+
spec.summary = %q{Creating (yet another) page model gem based around making capybara tests more stable with no need for waits}
|
13
|
+
spec.homepage = ""
|
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_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "selenium-webdriver", "~> 2.0"
|
25
|
+
spec.add_development_dependency "sinatra", "~> 1.0"
|
26
|
+
spec.add_development_dependency "pry"
|
27
|
+
|
28
|
+
spec.add_dependency "capybara", "~> 2.1"
|
29
|
+
spec.add_dependency "rspec"
|
30
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'wheel', '*.rb')).each {|file| require file}
|
2
|
+
require "capybara"
|
3
|
+
require 'capybara/dsl'
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
module Capybara
|
7
|
+
module Wheel
|
8
|
+
# main mixin to access wheel
|
9
|
+
|
10
|
+
def self.included(base)
|
11
|
+
base.instance_eval do
|
12
|
+
alias :background :before
|
13
|
+
alias :scenario :it
|
14
|
+
alias :given :let
|
15
|
+
alias :given! :let!
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module FeatureOverride
|
20
|
+
def feature(*args, &block)
|
21
|
+
options = {
|
22
|
+
type: :wheel_feature,
|
23
|
+
caller: caller
|
24
|
+
}
|
25
|
+
options.merge!(args.pop) if args.last.is_a?(Hash)
|
26
|
+
describe(*args, options, &block)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
extend Capybara::Wheel::FeatureOverride
|
34
|
+
RSpec.configuration.include Capybara::Wheel, wheel_feature: true
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'capybara/wheel/includes'
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
module Capybara
|
5
|
+
module Wheel
|
6
|
+
class Element
|
7
|
+
|
8
|
+
extend Forwardable
|
9
|
+
include Capybara::Wheel::Includes
|
10
|
+
extend Capybara::Wheel::Includes::ClassIncludes
|
11
|
+
|
12
|
+
def initialize(selector = nil)
|
13
|
+
@selector = selector if selector
|
14
|
+
end
|
15
|
+
|
16
|
+
def_delegators :capybara_element,
|
17
|
+
:click,
|
18
|
+
:has_content?,
|
19
|
+
:checked?,
|
20
|
+
:text,
|
21
|
+
:visible?,
|
22
|
+
:present?,
|
23
|
+
:selected?,
|
24
|
+
:disabled?,
|
25
|
+
:tag_name,
|
26
|
+
:value,
|
27
|
+
:set,
|
28
|
+
:select_option,
|
29
|
+
:unselect_option,
|
30
|
+
:hover,
|
31
|
+
:[]
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
def present?
|
36
|
+
capybara_element.visible?
|
37
|
+
rescue Capybara::ElementNotFound => e
|
38
|
+
puts "#{e} on #{Time.now.strftime("%H:%I:%S:%L")}"
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
def visible?
|
43
|
+
capybara_element.visible?
|
44
|
+
rescue Capybara::ElementNotFound => e
|
45
|
+
puts "#{e} on #{Time.now.strftime("%H:%I:%S:%L")}"
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.subelement(name, selector, block = nil)
|
50
|
+
subelement_factory = lambda do |parent_element|
|
51
|
+
Capybara::Wheel::ElementFactory.create_subelement(selector, parent_element, block)
|
52
|
+
end
|
53
|
+
|
54
|
+
define_method(underscore(name).to_sym) { subelement_factory.call(self) }
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def subelement(name, selector, &block)
|
59
|
+
self.class.subelement(name, selector, block)
|
60
|
+
end
|
61
|
+
|
62
|
+
def selector
|
63
|
+
@selector
|
64
|
+
end
|
65
|
+
|
66
|
+
protected
|
67
|
+
|
68
|
+
# Finds a capybara element representing this thing
|
69
|
+
def capybara_element
|
70
|
+
capybara.find(selector)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'capybara/wheel'
|
2
|
+
|
3
|
+
module Capybara
|
4
|
+
module Wheel
|
5
|
+
class ElementFactory
|
6
|
+
|
7
|
+
def self.create_element_klass(selector, block = nil)
|
8
|
+
subclass = Class.new(Capybara::Wheel::Element)
|
9
|
+
|
10
|
+
_selector = selector
|
11
|
+
|
12
|
+
subclass.class_exec do
|
13
|
+
define_method(:selector) { @selector = _selector}
|
14
|
+
end
|
15
|
+
|
16
|
+
subclass.class_eval(&block) if block
|
17
|
+
|
18
|
+
subclass
|
19
|
+
end
|
20
|
+
|
21
|
+
#TODO: Pass object not an instance
|
22
|
+
def self.create_subelement(selector, parent_element, block = nil)
|
23
|
+
subelement = Capybara::Wheel::SubElement.new(selector, parent_element)
|
24
|
+
subelement.instance_eval(&block) if block
|
25
|
+
|
26
|
+
subelement
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'capybara/wheel'
|
2
|
+
require 'capybara'
|
3
|
+
require 'capybara/dsl'
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
module Capybara
|
7
|
+
module Wheel
|
8
|
+
module Includes
|
9
|
+
|
10
|
+
include Capybara::DSL
|
11
|
+
|
12
|
+
def capybara
|
13
|
+
Capybara.current_session
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassIncludes
|
17
|
+
def underscore(string)
|
18
|
+
string.gsub(/::/, '/').
|
19
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
20
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
21
|
+
tr("-", "_").
|
22
|
+
downcase
|
23
|
+
end
|
24
|
+
|
25
|
+
def make_const(string)
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'capybara/wheel/includes'
|
2
|
+
|
3
|
+
module Capybara
|
4
|
+
module Wheel
|
5
|
+
class Page
|
6
|
+
|
7
|
+
include Capybara::Wheel::Includes
|
8
|
+
extend Capybara::Wheel::Includes::ClassIncludes
|
9
|
+
|
10
|
+
# actively visits page and executes block in context
|
11
|
+
def visit(&block)
|
12
|
+
capybara.visit(path)
|
13
|
+
if block_given?
|
14
|
+
on(&block)
|
15
|
+
else
|
16
|
+
on_page?
|
17
|
+
end
|
18
|
+
return self
|
19
|
+
end
|
20
|
+
|
21
|
+
# execute a block in the context of this page
|
22
|
+
def on
|
23
|
+
unless on_page?
|
24
|
+
raise "We don't appear to be on #{description}"
|
25
|
+
end
|
26
|
+
yield self if block_given?
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns the path (relative URI) of this page
|
31
|
+
def path
|
32
|
+
raise NotImplementedError, "implement to support page.visit"
|
33
|
+
end
|
34
|
+
|
35
|
+
# Return true if the browser is on this page
|
36
|
+
def on_page?
|
37
|
+
raise NotImplementedError, "implement me, e.g. using #has_title?"
|
38
|
+
end
|
39
|
+
|
40
|
+
# callback commonly used for on_page?
|
41
|
+
def has_title?(expected_title)
|
42
|
+
capybara.has_css?("head title", :text => expected_title)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.element(name, selector, &block)
|
46
|
+
begin
|
47
|
+
element_klass = const_set("#{name}", Capybara::Wheel::ElementFactory.create_element_klass(selector, block))
|
48
|
+
rescue NameError
|
49
|
+
puts "We recommend using capitalized element and subelement names"
|
50
|
+
name = name.capitalize!
|
51
|
+
retry
|
52
|
+
end
|
53
|
+
|
54
|
+
define_method(underscore(name).to_sym) { element_klass.new(selector) }
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'capybara/wheel/includes'
|
2
|
+
|
3
|
+
module Capybara
|
4
|
+
module Wheel
|
5
|
+
class SubElement < Capybara::Wheel::Element
|
6
|
+
attr_reader :parent
|
7
|
+
|
8
|
+
def initialize(selector, parent)
|
9
|
+
@parent = parent
|
10
|
+
@selector = selector
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def capybara_element
|
15
|
+
parent_element.find(selector)
|
16
|
+
end
|
17
|
+
|
18
|
+
def parent_element
|
19
|
+
parent.send(:capybara_element)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/wheel_spec.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'capybara/wheel'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.before(:each, :some_hook) do
|
6
|
+
@hook_passed_on = true
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
feature 'runs as a wheel feature', :some_hook do
|
11
|
+
|
12
|
+
it 'should pass' do
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should be set as a wheel feature' do
|
16
|
+
example.metadata[:type].should == :wheel_feature
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should pass the right hook' do
|
20
|
+
@hook_passed_on.should be_true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
feature 'Page' do
|
25
|
+
let(:page) { Capybara::Wheel::Page }
|
26
|
+
|
27
|
+
it 'has access to capybara' do
|
28
|
+
page.new.methods.include?(:capybara).should be_true
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'can create an element instance' do
|
32
|
+
it 'and create a method for it' do
|
33
|
+
page.element('RadElement', '#rad-selector').new.should respond_to(:rad_element)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
feature 'Element' do
|
40
|
+
let(:element) { Capybara::Wheel::Element }
|
41
|
+
|
42
|
+
it 'has access to capybara' do
|
43
|
+
element.new('#some-selector').methods.include?(:capybara).should be_true
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'can create a subelement instance' do
|
47
|
+
let(:subelement_name) { 'RadSubElement' }
|
48
|
+
let(:subelement_selector) { '#rad-sub-selector' }
|
49
|
+
let(:element_instance) { element.new.subelement(subelement_name, subelement_selector).new('#rad-selector') }
|
50
|
+
|
51
|
+
it 'and create a method for it' do
|
52
|
+
element_instance.should respond_to(:rad_sub_element)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'create a subelement with parent element context' do
|
56
|
+
element_instance.send(:rad_sub_element).parent.should == element_instance
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
feature 'SubElement' do
|
63
|
+
let(:parent_selector) { '#parent-selector'}
|
64
|
+
let(:sub_selector) { '#sub-selector'}
|
65
|
+
let!(:parent_element) { Capybara::Wheel::Element.new(parent_selector) }
|
66
|
+
let!(:subelement) { class ASubElement < Capybara::Wheel::SubElement
|
67
|
+
def my_element
|
68
|
+
capybara_element
|
69
|
+
end
|
70
|
+
end }
|
71
|
+
|
72
|
+
before :each do
|
73
|
+
parent_element.instance_eval do
|
74
|
+
def a_sub_element
|
75
|
+
ASubElement.new('#sub-selector', self)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'calls parent element capybara_element' do
|
81
|
+
pending
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
feature 'ElementFactory' do
|
87
|
+
let(:subject) { Capybara::Wheel::ElementFactory }
|
88
|
+
let(:selector) { '#rad-selector'}
|
89
|
+
let(:created_element_klass) { subject.create_element_klass(selector) }
|
90
|
+
|
91
|
+
|
92
|
+
it 'creates an element' do
|
93
|
+
created_element_klass.superclass.should == Capybara::Wheel::Element
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'allows access to the selector' do
|
97
|
+
created_element_klass.new.selector.should == selector
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'generated instance evalutes block' do
|
101
|
+
test_block = Proc.new do
|
102
|
+
def evaled_method
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
subject.create_element_klass(selector, test_block).new.should respond_to(:evaled_method)
|
107
|
+
end
|
108
|
+
end
|
metadata
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capybara-wheel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- '@gabrielrotbart'
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: selenium-webdriver
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: sinatra
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: capybara
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.1'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.1'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: Keeping the rodent on track
|
126
|
+
email:
|
127
|
+
- gabe@hooroo.com
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- .gitignore
|
133
|
+
- Gemfile
|
134
|
+
- LICENSE.txt
|
135
|
+
- README.md
|
136
|
+
- Rakefile
|
137
|
+
- capybara-wheel.gemspec
|
138
|
+
- lib/capybara/wheel.rb
|
139
|
+
- lib/capybara/wheel/element.rb
|
140
|
+
- lib/capybara/wheel/element_factory.rb
|
141
|
+
- lib/capybara/wheel/includes.rb
|
142
|
+
- lib/capybara/wheel/page.rb
|
143
|
+
- lib/capybara/wheel/subelement.rb
|
144
|
+
- lib/capybara/wheel/version.rb
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
- spec/wheel_spec.rb
|
147
|
+
homepage: ''
|
148
|
+
licenses:
|
149
|
+
- MIT
|
150
|
+
metadata: {}
|
151
|
+
post_install_message:
|
152
|
+
rdoc_options: []
|
153
|
+
require_paths:
|
154
|
+
- lib
|
155
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - '>='
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: '0'
|
165
|
+
requirements: []
|
166
|
+
rubyforge_project:
|
167
|
+
rubygems_version: 2.0.3
|
168
|
+
signing_key:
|
169
|
+
specification_version: 4
|
170
|
+
summary: Creating (yet another) page model gem based around making capybara tests
|
171
|
+
more stable with no need for waits
|
172
|
+
test_files:
|
173
|
+
- spec/spec_helper.rb
|
174
|
+
- spec/wheel_spec.rb
|