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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc8ba6872d65c984e482da032b16bc77918c6847
4
- data.tar.gz: e7f0e2119a36f16bbbca1c2e35b05ba6375f5229
3
+ metadata.gz: 021a642e1232afc2aab0834d80b3aae72c3d353c
4
+ data.tar.gz: 6ba634d5670248068aebf111885c325366fb3ad9
5
5
  SHA512:
6
- metadata.gz: 5552b63d66512fa9fe7f621c482094c2c94d4df939d3020bc38ade8775a16d1dc86f6ae191f86355b41a381e82b8d1f116ec621c3b510396448190354ca21f78
7
- data.tar.gz: 12f25e3b3c24ed0e4935ff9a60ed3cd034aa7b6398676a6be1c68d082d271574b7242cd9c74efd38adb4dd9bd577cb68395bdab48b6e5a96a5e4b3cc5cf9f433
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
- TODO: Write a gem description
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
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Widgets
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  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.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: 2015-11-24 00:00:00.000000000 Z
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