capybara-widgets 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/vgrigoruk/capybara-widgets.svg?branch=master)](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
|