capybara-widgets 0.4.0 → 0.5.0
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 +4 -4
- data/README.md +5 -9
- data/lib/capybara/widgets/core/execution_hooks.rb +66 -0
- data/lib/capybara/widgets/core/page.rb +11 -0
- data/lib/capybara/widgets/core/widget.rb +29 -0
- data/lib/capybara/widgets/rspec.rb +39 -0
- data/lib/capybara/widgets/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 021a642e1232afc2aab0834d80b3aae72c3d353c
|
4
|
+
data.tar.gz: 6ba634d5670248068aebf111885c325366fb3ad9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41fc9fa61acf8649785b65dcfb95507f82c0ff738f31e68d801582bf00a4bb036272449b27e76f1fab4cbf4e2083f66205d6212f799ab942fa60016209acb93c
|
7
|
+
data.tar.gz: dbe2892d04280e780d174180de57f3dd37325f99ddac1d1af36c263b748f1d6880d9c1243cda17a882ea64013e70c00c8beefe89a2caaf8075258a7f35a3224e
|
data/README.md
CHANGED
@@ -2,23 +2,19 @@
|
|
2
2
|
|
3
3
|
[](https://travis-ci.org/vgrigoruk/capybara-widgets)
|
4
4
|
|
5
|
-
|
5
|
+
Page objects / fragments implementation for Capybara.
|
6
|
+
- Support lambda element selectors.
|
7
|
+
- RSpec & Cucumber integration.
|
8
|
+
- Work for web & mobile (appium driver).
|
6
9
|
|
7
10
|
## Installation
|
8
11
|
|
9
|
-
Add this line to your application's Gemfile
|
12
|
+
Add this line to your application's Gemfile and run `bundle`:
|
10
13
|
|
11
14
|
```ruby
|
12
15
|
gem 'capybara-widgets'
|
13
16
|
```
|
14
17
|
|
15
|
-
And then execute:
|
16
|
-
|
17
|
-
$ bundle
|
18
|
-
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
|
-
$ gem install capybara-widgets
|
22
18
|
|
23
19
|
## Usage
|
24
20
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module ExecutionHooks
|
2
|
+
def self.included(base)
|
3
|
+
base.send :extend, ClassMethods
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
# this method is invoked whenever a new instance method is added to a class
|
8
|
+
def method_added(method_name)
|
9
|
+
# do nothing if the method that was added was an actual hook method, or
|
10
|
+
# if it already had hooks added to it
|
11
|
+
return if hooks.include?(method_name) || ignored_methods.include?(method_name) || hooked_methods.include?(method_name)
|
12
|
+
add_hooks_to(method_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
# this is the DSL method that classes use to add before hooks
|
16
|
+
def before_hook(method_name, opts={})
|
17
|
+
hooks << method_name
|
18
|
+
ignored_methods.concat Array(opts[:ignore])
|
19
|
+
end
|
20
|
+
|
21
|
+
# keeps track of all before hooks
|
22
|
+
def hooks
|
23
|
+
@hooks ||= []
|
24
|
+
end
|
25
|
+
|
26
|
+
# keeps track of all before hooks
|
27
|
+
def ignored_methods
|
28
|
+
@ignored_methods ||= []
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# keeps track of all currently hooked methods
|
34
|
+
def hooked_methods
|
35
|
+
@hooked_methods ||= []
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_hooks_to(method_name)
|
39
|
+
# add this method to known hook mappings to avoid infinite
|
40
|
+
# recursion when we redefine the method below
|
41
|
+
hooked_methods << method_name
|
42
|
+
|
43
|
+
# grab the original method definition
|
44
|
+
original_method = instance_method(method_name)
|
45
|
+
|
46
|
+
# re-define the method, but notice how we reference the original
|
47
|
+
# method definition
|
48
|
+
define_method(method_name) do |*args, &block|
|
49
|
+
# invoke the hook methods
|
50
|
+
hooks_to_run = []
|
51
|
+
klass = self.class
|
52
|
+
while klass != BasicObject do
|
53
|
+
hooks_to_run.concat(klass.hooks) if klass.respond_to? :hooks
|
54
|
+
klass = klass.superclass
|
55
|
+
end
|
56
|
+
hooks_to_run.each do |h|
|
57
|
+
# LOGGER.debug "calling hook #{h} for method: #{method_name}"
|
58
|
+
method(h).call
|
59
|
+
end
|
60
|
+
|
61
|
+
# now invoke the original method
|
62
|
+
original_method.bind(self).call(*args, &block)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -53,6 +53,17 @@ module Capybara
|
|
53
53
|
loaded?
|
54
54
|
self
|
55
55
|
end
|
56
|
+
|
57
|
+
class << self
|
58
|
+
def iframe(name, page_class, selector)
|
59
|
+
define_method name do |&block|
|
60
|
+
raise "No iframe found: #{selector}" unless page.has_selector?(selector)
|
61
|
+
within_frame page.find(selector) do
|
62
|
+
block.call page_class.new
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
56
67
|
end
|
57
68
|
end
|
58
69
|
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'capybara/dsl'
|
2
|
+
require 'active_support/core_ext/class/attribute'
|
2
3
|
require_relative '../helpers/async_helper'
|
4
|
+
require_relative 'execution_hooks'
|
5
|
+
|
3
6
|
|
4
7
|
module Capybara
|
5
8
|
module Widgets
|
@@ -7,6 +10,21 @@ module Capybara
|
|
7
10
|
include Capybara::DSL
|
8
11
|
include Capybara::Widgets::AsyncHelper
|
9
12
|
|
13
|
+
include ExecutionHooks
|
14
|
+
|
15
|
+
before_hook :set_target_app,
|
16
|
+
ignore: [
|
17
|
+
:driver, :driver=, :driver?,
|
18
|
+
:session_name, :session_name=, :session_name?,
|
19
|
+
:default_selector, :default_selector=, :default_selector?
|
20
|
+
]
|
21
|
+
|
22
|
+
class_attribute :driver, :session_name, :default_selector
|
23
|
+
|
24
|
+
self.driver = Capybara.current_driver
|
25
|
+
self.session_name = Capybara.session_name
|
26
|
+
self.default_selector = Capybara.default_selector
|
27
|
+
|
10
28
|
def initialize(*search_scope)
|
11
29
|
case search_scope.length
|
12
30
|
when 0
|
@@ -106,6 +124,17 @@ module Capybara
|
|
106
124
|
super
|
107
125
|
end
|
108
126
|
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
def set_target_app
|
131
|
+
if Capybara.current_driver != driver || Capybara.session_name != session_name || Capybara.default_selector != default_selector
|
132
|
+
puts "Switching target: #{driver}:#{session_name}:#{default_selector}"
|
133
|
+
Capybara.current_driver = self.driver
|
134
|
+
Capybara.session_name = self.session_name
|
135
|
+
Capybara.default_selector = self.default_selector
|
136
|
+
end
|
137
|
+
end
|
109
138
|
end
|
110
139
|
end
|
111
140
|
end
|
@@ -39,6 +39,45 @@ module Capybara
|
|
39
39
|
"Expected that '#{widget.class.name}' not to be visible"
|
40
40
|
end
|
41
41
|
end
|
42
|
+
#
|
43
|
+
# RSpec::Matchers.define :be_loaded do
|
44
|
+
# match do |page|
|
45
|
+
# page_opened = page.opened?
|
46
|
+
# if page.respond_to?(:components_loaded?)
|
47
|
+
# components_loaded = page.components_loaded?
|
48
|
+
# end
|
49
|
+
# if page.respond_to?(:elements_loaded?)
|
50
|
+
# elements_loaded = page.elements_loaded?
|
51
|
+
# end
|
52
|
+
# page_opened && components_loaded && elements_loaded
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# match_when_negated do |_|
|
56
|
+
# raise "Unsupported negated matcher"
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# failure_message do |page|
|
60
|
+
# page_opened = page.opened?
|
61
|
+
# components_loaded = page.respond_to?(:components_loaded?) ? page.components_loaded? : true
|
62
|
+
# elements_loaded = page.respond_to?(:elements_loaded?) ? page.elements_loaded? : true
|
63
|
+
# message = "Failed: "
|
64
|
+
# unless page_opened
|
65
|
+
# message = "#{page.class} is not opened.\n Actual: #{page.current_path}\nExpected: #{page.path_matcher || page.url_matcher || page.path }"
|
66
|
+
# end
|
67
|
+
# unless components_loaded
|
68
|
+
# message = "Some components are not loaded on #{page.class}"
|
69
|
+
# end
|
70
|
+
# unless elements_loaded
|
71
|
+
# message = "Some elements are not loaded on #{page.class}"
|
72
|
+
# end
|
73
|
+
# message
|
74
|
+
# end
|
75
|
+
#
|
76
|
+
# failure_message_when_negated do |_|
|
77
|
+
# raise "Unsupported negated matcher"
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
#
|
42
81
|
end
|
43
82
|
end
|
44
83
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-widgets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vitalii Grygoruk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -125,6 +125,7 @@ files:
|
|
125
125
|
- capybara-widgets.gemspec
|
126
126
|
- lib/capybara/widgets.rb
|
127
127
|
- lib/capybara/widgets/core/dsl.rb
|
128
|
+
- lib/capybara/widgets/core/execution_hooks.rb
|
128
129
|
- lib/capybara/widgets/core/page.rb
|
129
130
|
- lib/capybara/widgets/core/page_collection.rb
|
130
131
|
- lib/capybara/widgets/core/widget.rb
|