page_magic 1.0.0.alpha4 → 1.0.0.alpha5
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/.rubocop.yml +9 -0
- data/Gemfile +7 -8
- data/Gemfile.lock +15 -30
- data/Rakefile +12 -10
- data/VERSION +1 -1
- data/lib/ext/string.rb +6 -6
- data/lib/page_magic/driver.rb +2 -2
- data/lib/page_magic/drivers/poltergeist.rb +1 -2
- data/lib/page_magic/drivers/rack_test.rb +1 -1
- data/lib/page_magic/drivers/selenium.rb +2 -2
- data/lib/page_magic/drivers.rb +5 -6
- data/lib/page_magic/element.rb +50 -43
- data/lib/page_magic/element_context.rb +14 -14
- data/lib/page_magic/elements.rb +9 -10
- data/lib/page_magic/exceptions.rb +1 -2
- data/lib/page_magic/page_magic.rb +12 -9
- data/lib/page_magic/session.rb +21 -16
- data/lib/page_magic.rb +7 -10
- data/page_magic.gemspec +57 -58
- data/spec/element_spec.rb +34 -27
- data/spec/helpers/capybara.rb +4 -4
- data/spec/member_methods_spec.rb +1 -10
- data/spec/page_magic/driver_spec.rb +5 -5
- data/spec/page_magic/drivers/poltergeist_spec.rb +4 -3
- data/spec/page_magic/drivers/rack_test_spec.rb +4 -3
- data/spec/page_magic/drivers/selenium_spec.rb +3 -2
- data/spec/page_magic/drivers_spec.rb +3 -5
- data/spec/page_magic/element_context_spec.rb +17 -29
- data/spec/page_magic/elements_spec.rb +13 -30
- data/spec/page_magic/page_magic_spec.rb +19 -0
- data/spec/page_magic/session_spec.rb +52 -31
- data/spec/page_magic/usage/defining_pages_spec.rb +3 -7
- data/spec/page_magic/usage/include_page_magic_spec.rb +2 -2
- data/spec/page_magic/usage/interacting_with_pages_spec.rb +0 -2
- data/spec/page_magic/usage/starting_a_session_spec.rb +4 -7
- data/spec/page_magic_spec.rb +4 -6
- data/spec/spec_helper.rb +14 -22
- metadata +5 -19
- data/Guardfile +0 -8
- data/spec/page_magic/usage/defining_page_elements_spec.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b33162c06d10048ac36843da5cd88309ad7184dc
|
4
|
+
data.tar.gz: 8c92249eb7b1c575dc1465b7fa4d8c35bd8bb06b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58ec1e9df6f5a7194e5a4a3af215ead0bb42b49df4fe0485f91e4556b4aa49f4b0e2aa0a576999faca425c89cce75a2bf1f8147be6561ec7f131982a4710d79a
|
7
|
+
data.tar.gz: 97d1f7e0db82b33d7b066738b484dc3b6d7c83d75a7462429aaa6eb5a03e37b139aaf357ea671a2717df23109e0332d2b8d3c2508bb3a43a41d8b34567a467e4
|
data/.rubocop.yml
ADDED
data/Gemfile
CHANGED
@@ -1,19 +1,18 @@
|
|
1
|
-
source
|
1
|
+
source 'http://rubygems.org'
|
2
2
|
|
3
3
|
gem 'capybara'
|
4
4
|
gem 'activesupport'
|
5
5
|
gem 'wait'
|
6
6
|
|
7
7
|
group :test do
|
8
|
-
gem
|
8
|
+
gem 'watir-webdriver'
|
9
9
|
gem 'sinatra'
|
10
|
-
gem
|
11
|
-
gem
|
10
|
+
gem 'rspec', require: 'rspec/core/rake_task'
|
11
|
+
gem 'simplecov', require: false
|
12
12
|
gem 'poltergeist'
|
13
13
|
end
|
14
14
|
|
15
15
|
group :development do
|
16
|
-
gem
|
17
|
-
gem '
|
18
|
-
|
19
|
-
end
|
16
|
+
gem 'jeweler'
|
17
|
+
gem 'rubocop', require: 'rubocop/rake_task'
|
18
|
+
end
|
data/Gemfile.lock
CHANGED
@@ -8,6 +8,9 @@ GEM
|
|
8
8
|
thread_safe (~> 0.3, >= 0.3.4)
|
9
9
|
tzinfo (~> 1.1)
|
10
10
|
addressable (2.3.6)
|
11
|
+
ast (2.1.0)
|
12
|
+
astrolabe (1.3.1)
|
13
|
+
parser (~> 2.2)
|
11
14
|
builder (3.2.2)
|
12
15
|
capybara (2.1.0)
|
13
16
|
mime-types (>= 1.16)
|
@@ -15,17 +18,13 @@ GEM
|
|
15
18
|
rack (>= 1.0.0)
|
16
19
|
rack-test (>= 0.5.4)
|
17
20
|
xpath (~> 2.0)
|
18
|
-
celluloid (0.15.2)
|
19
|
-
timers (~> 1.1.0)
|
20
21
|
childprocess (0.3.9)
|
21
22
|
ffi (~> 1.0, >= 1.0.11)
|
22
23
|
cliver (0.2.2)
|
23
|
-
coderay (1.1.0)
|
24
24
|
diff-lcs (1.2.4)
|
25
25
|
faraday (0.8.9)
|
26
26
|
multipart-post (~> 1.2.0)
|
27
27
|
ffi (1.9.3)
|
28
|
-
formatador (0.2.5)
|
29
28
|
git (1.2.6)
|
30
29
|
github_api (0.10.2)
|
31
30
|
addressable
|
@@ -34,14 +33,6 @@ GEM
|
|
34
33
|
multi_json (~> 1.4)
|
35
34
|
nokogiri (~> 1.6.0)
|
36
35
|
oauth2
|
37
|
-
guard (2.6.1)
|
38
|
-
formatador (>= 0.2.4)
|
39
|
-
listen (~> 2.7)
|
40
|
-
lumberjack (~> 1.0)
|
41
|
-
pry (>= 0.9.12)
|
42
|
-
thor (>= 0.18.1)
|
43
|
-
guard-ctags-bundler (1.0.2)
|
44
|
-
guard (~> 2.0)
|
45
36
|
hashie (2.0.5)
|
46
37
|
highline (1.6.21)
|
47
38
|
i18n (0.7.0)
|
@@ -57,12 +48,6 @@ GEM
|
|
57
48
|
json (1.8.1)
|
58
49
|
jwt (0.1.11)
|
59
50
|
multi_json (>= 1.5)
|
60
|
-
listen (2.7.8)
|
61
|
-
celluloid (>= 0.15.2)
|
62
|
-
rb-fsevent (>= 0.9.3)
|
63
|
-
rb-inotify (>= 0.9)
|
64
|
-
lumberjack (1.0.6)
|
65
|
-
method_source (0.8.2)
|
66
51
|
mime-types (1.25)
|
67
52
|
mini_portile (0.5.1)
|
68
53
|
minitest (5.7.0)
|
@@ -77,24 +62,21 @@ GEM
|
|
77
62
|
multi_json (~> 1.3)
|
78
63
|
multi_xml (~> 0.5)
|
79
64
|
rack (~> 1.2)
|
65
|
+
parser (2.2.2.6)
|
66
|
+
ast (>= 1.1, < 3.0)
|
80
67
|
poltergeist (1.4.1)
|
81
68
|
capybara (~> 2.1.0)
|
82
69
|
cliver (~> 0.2.1)
|
83
70
|
multi_json (~> 1.0)
|
84
71
|
websocket-driver (>= 0.2.0)
|
85
|
-
|
86
|
-
coderay (~> 1.1.0)
|
87
|
-
method_source (~> 0.8.1)
|
88
|
-
slop (~> 3.4)
|
72
|
+
powerpack (0.1.1)
|
89
73
|
rack (1.5.2)
|
90
74
|
rack-protection (1.5.0)
|
91
75
|
rack
|
92
76
|
rack-test (0.6.2)
|
93
77
|
rack (>= 1.0)
|
78
|
+
rainbow (2.0.0)
|
94
79
|
rake (10.2.2)
|
95
|
-
rb-fsevent (0.9.4)
|
96
|
-
rb-inotify (0.9.5)
|
97
|
-
ffi (>= 0.5.0)
|
98
80
|
rdoc (4.1.1)
|
99
81
|
json (~> 1.4)
|
100
82
|
rspec (2.14.1)
|
@@ -105,6 +87,13 @@ GEM
|
|
105
87
|
rspec-expectations (2.14.3)
|
106
88
|
diff-lcs (>= 1.1.3, < 2.0)
|
107
89
|
rspec-mocks (2.14.4)
|
90
|
+
rubocop (0.34.0)
|
91
|
+
astrolabe (~> 1.3)
|
92
|
+
parser (>= 2.2.2.5, < 3.0)
|
93
|
+
powerpack (~> 0.1)
|
94
|
+
rainbow (>= 1.99.1, < 3.0)
|
95
|
+
ruby-progressbar (~> 1.4)
|
96
|
+
ruby-progressbar (1.7.5)
|
108
97
|
rubyzip (0.9.9)
|
109
98
|
selenium-webdriver (2.35.1)
|
110
99
|
childprocess (>= 0.2.5)
|
@@ -119,11 +108,8 @@ GEM
|
|
119
108
|
rack (~> 1.4)
|
120
109
|
rack-protection (~> 1.4)
|
121
110
|
tilt (~> 1.3, >= 1.3.4)
|
122
|
-
slop (3.5.0)
|
123
|
-
thor (0.19.1)
|
124
111
|
thread_safe (0.3.5)
|
125
112
|
tilt (1.4.1)
|
126
|
-
timers (1.1.0)
|
127
113
|
tzinfo (1.2.2)
|
128
114
|
thread_safe (~> 0.1)
|
129
115
|
wait (0.5.1)
|
@@ -140,11 +126,10 @@ PLATFORMS
|
|
140
126
|
DEPENDENCIES
|
141
127
|
activesupport
|
142
128
|
capybara
|
143
|
-
guard
|
144
|
-
guard-ctags-bundler
|
145
129
|
jeweler
|
146
130
|
poltergeist
|
147
131
|
rspec
|
132
|
+
rubocop
|
148
133
|
simplecov
|
149
134
|
sinatra
|
150
135
|
wait
|
data/Rakefile
CHANGED
@@ -1,19 +1,21 @@
|
|
1
|
-
Bundler.require :test
|
1
|
+
Bundler.require :test, :development
|
2
|
+
|
3
|
+
RuboCop::RakeTask.new
|
2
4
|
|
3
5
|
RSpec::Core::RakeTask.new(:spec) do
|
4
|
-
ENV['coverage'] =
|
6
|
+
ENV['coverage'] = 'true'
|
5
7
|
end
|
6
8
|
|
7
9
|
Jeweler::Tasks.new do |gem|
|
8
|
-
gem.name =
|
9
|
-
gem.homepage =
|
10
|
-
gem.license =
|
11
|
-
gem.summary =
|
12
|
-
gem.description =
|
13
|
-
gem.email =
|
14
|
-
gem.authors = [
|
10
|
+
gem.name = 'page_magic'
|
11
|
+
gem.homepage = 'https://github.com/ladtech/page_magic'
|
12
|
+
gem.license = 'ruby'
|
13
|
+
gem.summary = 'Framework for modeling and interacting with webpages'
|
14
|
+
gem.description = 'Framework for modeling and interacting with webpages which wraps capybara'
|
15
|
+
gem.email = 'info@lad-tech.com'
|
16
|
+
gem.authors = ['Leon Davis']
|
15
17
|
end
|
16
18
|
|
17
19
|
Jeweler::RubygemsDotOrgTasks.new
|
18
20
|
|
19
|
-
task :
|
21
|
+
task default: :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.0.
|
1
|
+
1.0.0.alpha5
|
data/lib/ext/string.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
class String
|
2
2
|
def to_snake_case
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
gsub(/::/, '/')
|
4
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
5
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
6
|
+
.tr('-', '_')
|
7
|
+
.downcase
|
8
8
|
end
|
9
|
-
end
|
9
|
+
end
|
data/lib/page_magic/driver.rb
CHANGED
@@ -6,7 +6,7 @@ module PageMagic
|
|
6
6
|
@supported_browsers = supported_browsers
|
7
7
|
end
|
8
8
|
|
9
|
-
def support?
|
9
|
+
def support?(browser)
|
10
10
|
supported_browsers.include?(browser)
|
11
11
|
end
|
12
12
|
|
@@ -16,4 +16,4 @@ module PageMagic
|
|
16
16
|
driver_clazz.new(app, options)
|
17
17
|
end
|
18
18
|
end
|
19
|
-
end
|
19
|
+
end
|
data/lib/page_magic/drivers.rb
CHANGED
@@ -2,19 +2,18 @@ require 'page_magic/driver'
|
|
2
2
|
module PageMagic
|
3
3
|
class Drivers
|
4
4
|
def all
|
5
|
-
@all ||=[]
|
5
|
+
@all ||= []
|
6
6
|
end
|
7
7
|
|
8
8
|
def register(driver)
|
9
9
|
all << driver
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
all.find{|driver|driver.support?(browser)}
|
12
|
+
def find(browser)
|
13
|
+
all.find { |driver| driver.support?(browser) }
|
15
14
|
end
|
16
15
|
|
17
|
-
def load
|
16
|
+
def load(path = "#{__dir__}/drivers")
|
18
17
|
require 'active_support/inflector'
|
19
18
|
|
20
19
|
Dir["#{path}/*.rb"].each do |driver_file|
|
@@ -24,7 +23,7 @@ module PageMagic
|
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
27
|
-
def ==
|
26
|
+
def ==(other)
|
28
27
|
other.is_a?(Drivers) && other.all == other.all
|
29
28
|
end
|
30
29
|
end
|
data/lib/page_magic/element.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module PageMagic
|
2
|
-
|
3
2
|
module MethodObserver
|
4
|
-
def singleton_method_added
|
3
|
+
def singleton_method_added(arg)
|
5
4
|
@singleton_methods_added = true unless arg == :singleton_method_added
|
6
5
|
end
|
7
6
|
|
@@ -16,34 +15,36 @@ module PageMagic
|
|
16
15
|
include Elements
|
17
16
|
|
18
17
|
class << self
|
19
|
-
def inherited
|
18
|
+
def inherited(clazz)
|
20
19
|
clazz.extend(Elements)
|
21
20
|
|
22
|
-
def clazz.selector
|
21
|
+
def clazz.selector(selector = nil)
|
23
22
|
return @selector unless selector
|
24
23
|
@selector = selector
|
25
24
|
end
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
29
|
-
def initialize
|
30
|
-
options = {type: :element, selector: {}, browser_element: nil}.merge(options)
|
28
|
+
def initialize(name, parent_page_element, options, &block)
|
29
|
+
options = { type: :element, selector: {}, browser_element: nil }.merge(options)
|
31
30
|
@browser_element = options[:browser_element]
|
32
31
|
@selector = options[:selector]
|
33
32
|
|
34
33
|
@before_hook = proc {}
|
35
34
|
@after_hook = proc {}
|
36
|
-
@parent_page_element
|
35
|
+
@parent_page_element = parent_page_element
|
36
|
+
@type = options[:type]
|
37
|
+
@name = name.to_s.downcase.to_sym
|
37
38
|
|
38
39
|
extend MethodObserver
|
39
40
|
expand &block if block
|
40
41
|
end
|
41
42
|
|
42
|
-
def expand
|
43
|
+
def expand(*args, &block)
|
43
44
|
instance_exec *args, &block
|
44
45
|
end
|
45
46
|
|
46
|
-
def selector
|
47
|
+
def selector(selector = nil)
|
47
48
|
return @selector unless selector
|
48
49
|
@selector = selector
|
49
50
|
end
|
@@ -56,62 +57,62 @@ module PageMagic
|
|
56
57
|
@parent_page_element.session
|
57
58
|
end
|
58
59
|
|
59
|
-
def before
|
60
|
+
def before(&block)
|
60
61
|
return @before_hook unless block
|
61
62
|
@before_hook = block
|
62
63
|
end
|
63
64
|
|
64
|
-
def after
|
65
|
+
def after(&block)
|
65
66
|
return @after_hook unless block
|
66
67
|
@after_hook = block
|
67
68
|
end
|
68
69
|
|
69
|
-
def method_missing
|
70
|
+
def method_missing(method, *args)
|
71
|
+
element_context(args).send(method, args.first)
|
72
|
+
rescue ElementMissingException
|
70
73
|
begin
|
71
|
-
|
72
|
-
rescue
|
73
|
-
|
74
|
-
@browser_element.send(method, *args)
|
75
|
-
rescue
|
76
|
-
super
|
77
|
-
end
|
74
|
+
@browser_element.send(method, *args)
|
75
|
+
rescue
|
76
|
+
super
|
78
77
|
end
|
79
78
|
end
|
80
79
|
|
81
|
-
def
|
80
|
+
def respond_to?(*args)
|
81
|
+
super || element_context.respond_to?(*args) || @browser_element.respond_to?(*args)
|
82
|
+
end
|
83
|
+
|
84
|
+
def browser_element(*_args)
|
82
85
|
return @browser_element if @browser_element
|
83
|
-
|
86
|
+
fail UndefinedSelectorException, 'Pass a selector/define one on the class' if @selector.empty?
|
84
87
|
if @selector
|
85
88
|
selector_copy = @selector.dup
|
86
89
|
method = selector.keys.first
|
87
90
|
selector = selector_copy.delete(method)
|
88
91
|
options = selector_copy
|
89
92
|
|
90
|
-
|
91
93
|
finder_method, selector_type, selector_arg = case method
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
else
|
108
|
-
raise UnsupportedSelectorException
|
109
|
-
end
|
110
|
-
|
94
|
+
when :id
|
95
|
+
[:find, "##{selector}"]
|
96
|
+
when :xpath
|
97
|
+
[:find, :xpath, selector]
|
98
|
+
when :name
|
99
|
+
[:find, "*[name='#{selector}']"]
|
100
|
+
when :css
|
101
|
+
[:find, :css, selector]
|
102
|
+
when :label
|
103
|
+
[:find_field, selector]
|
104
|
+
when :text
|
105
|
+
if @type == :link
|
106
|
+
[:find_link, selector]
|
107
|
+
elsif @type == :button
|
108
|
+
[:find_button, selector]
|
111
109
|
else
|
112
|
-
|
113
|
-
|
110
|
+
fail UnsupportedSelectorException
|
111
|
+
end
|
114
112
|
|
113
|
+
else
|
114
|
+
fail UnsupportedSelectorException
|
115
|
+
end
|
115
116
|
|
116
117
|
finder_args = [selector_type, selector_arg].compact
|
117
118
|
finder_args << options unless options.empty?
|
@@ -119,5 +120,11 @@ module PageMagic
|
|
119
120
|
end
|
120
121
|
@browser_element
|
121
122
|
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def element_context(*args)
|
127
|
+
ElementContext.new(self, @browser_element, self, *args)
|
128
|
+
end
|
122
129
|
end
|
123
130
|
end
|
@@ -1,26 +1,23 @@
|
|
1
1
|
module PageMagic
|
2
|
-
|
3
2
|
class ElementMissingException < Exception
|
4
|
-
|
5
3
|
end
|
6
4
|
|
7
5
|
class ElementContext
|
8
|
-
|
9
6
|
attr_reader :caller, :page_element
|
10
7
|
|
11
|
-
def initialize
|
8
|
+
def initialize(page_element, browser, caller, *_args)
|
12
9
|
@page_element = page_element
|
13
10
|
@browser = browser
|
14
11
|
@caller = caller
|
15
12
|
end
|
16
13
|
|
17
|
-
def method_missing
|
14
|
+
def method_missing(method, *args)
|
18
15
|
return @caller.send(method, *args) if @executing_hooks
|
19
16
|
return @page_element.send(method, *args) if @page_element.methods.include?(method)
|
20
17
|
|
21
|
-
element_locator_factory =
|
18
|
+
element_locator_factory = @page_element.element_definitions[method]
|
22
19
|
|
23
|
-
|
20
|
+
fail ElementMissingException, "Could not find: #{method}" unless element_locator_factory
|
24
21
|
|
25
22
|
if args.empty?
|
26
23
|
element_locator = element_locator_factory.call(@page_element, nil)
|
@@ -32,16 +29,21 @@ module PageMagic
|
|
32
29
|
apply_hooks(page_element: element_locator.browser_element,
|
33
30
|
capybara_method: action_method,
|
34
31
|
before_hook: element_locator.before,
|
35
|
-
after_hook: element_locator.after
|
36
|
-
|
32
|
+
after_hook: element_locator.after
|
33
|
+
)
|
37
34
|
end
|
38
35
|
|
39
36
|
element_locator.section? ? element_locator : element_locator.browser_element
|
40
37
|
end
|
41
38
|
|
39
|
+
def respond_to?(*args)
|
40
|
+
@page_element.element_definitions.keys.include?(args.first)
|
41
|
+
end
|
42
|
+
|
42
43
|
def apply_hooks(options)
|
43
44
|
_self = self
|
44
|
-
page_element
|
45
|
+
page_element = options[:page_element]
|
46
|
+
capybara_method = options[:capybara_method]
|
45
47
|
if page_element.respond_to?(capybara_method)
|
46
48
|
original_method = page_element.method(capybara_method)
|
47
49
|
|
@@ -53,13 +55,11 @@ module PageMagic
|
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
56
|
-
|
57
|
-
def call_hook &block
|
58
|
+
def call_hook(&block)
|
58
59
|
@executing_hooks = true
|
59
|
-
result =
|
60
|
+
result = instance_exec @browser, &block
|
60
61
|
@executing_hooks = false
|
61
62
|
result
|
62
63
|
end
|
63
|
-
|
64
64
|
end
|
65
65
|
end
|
data/lib/page_magic/elements.rb
CHANGED
@@ -8,7 +8,7 @@ module PageMagic
|
|
8
8
|
class InvalidMethodNameException < Exception
|
9
9
|
end
|
10
10
|
|
11
|
-
def self.extended
|
11
|
+
def self.extended(clazz)
|
12
12
|
clazz.class_eval do
|
13
13
|
unless instance_methods.include?(:browser_element)
|
14
14
|
attr_reader :browser_element
|
@@ -20,8 +20,8 @@ module PageMagic
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
def method_added
|
24
|
-
|
23
|
+
def method_added(method)
|
24
|
+
fail InvalidMethodNameException, 'method name matches element name' if element_definitions[method]
|
25
25
|
end
|
26
26
|
|
27
27
|
def elements(browser_element, *args)
|
@@ -31,11 +31,10 @@ module PageMagic
|
|
31
31
|
TYPES = [:element, :text_field, :button, :link, :checkbox, :select_list, :radios, :textarea, :section]
|
32
32
|
TYPES.each do |type|
|
33
33
|
define_method type do |*args, &block|
|
34
|
-
|
35
34
|
first_arg = args.first
|
36
35
|
if first_arg.is_a?(Symbol)
|
37
36
|
name, object = args
|
38
|
-
options = {type: type}
|
37
|
+
options = { type: type }
|
39
38
|
if object.is_a?(Hash)
|
40
39
|
options[:selector] = object
|
41
40
|
else
|
@@ -44,7 +43,7 @@ module PageMagic
|
|
44
43
|
|
45
44
|
add_element_definition(name) do |*args_for_block|
|
46
45
|
page_section = PageMagic::Element.new name, args_for_block.delete_at(0), options
|
47
|
-
page_section.expand *args_for_block, &(block ||
|
46
|
+
page_section.expand *args_for_block, &(block || proc {})
|
48
47
|
page_section
|
49
48
|
end
|
50
49
|
|
@@ -64,11 +63,11 @@ module PageMagic
|
|
64
63
|
end
|
65
64
|
end
|
66
65
|
|
67
|
-
def add_element_definition
|
68
|
-
|
66
|
+
def add_element_definition(name, &block)
|
67
|
+
fail InvalidElementNameException, 'duplicate page element defined' if element_definitions[name]
|
69
68
|
|
70
69
|
methods = respond_to?(:instance_methods) ? instance_methods : methods()
|
71
|
-
|
70
|
+
fail InvalidElementNameException, 'a method already exists with this method name' if methods.find { |method| method == name }
|
72
71
|
|
73
72
|
element_definitions[name] = block
|
74
73
|
end
|
@@ -77,4 +76,4 @@ module PageMagic
|
|
77
76
|
@element_definitions ||= {}
|
78
77
|
end
|
79
78
|
end
|
80
|
-
end
|
79
|
+
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
module PageMagic
|
2
2
|
attr_reader :browser, :session
|
3
3
|
|
4
|
-
def initialize
|
5
|
-
|
4
|
+
def initialize(session = Session.new(Capybara.current_session), options = {}, &block)
|
6
5
|
@browser = session.raw_session
|
7
6
|
@session = session
|
8
7
|
|
@@ -15,8 +14,8 @@ module PageMagic
|
|
15
14
|
@browser.title
|
16
15
|
end
|
17
16
|
|
18
|
-
def text_on_page?
|
19
|
-
text
|
17
|
+
def text_on_page?(text)
|
18
|
+
text.downcase.include?(text.downcase)
|
20
19
|
end
|
21
20
|
|
22
21
|
def visit
|
@@ -28,11 +27,15 @@ module PageMagic
|
|
28
27
|
@browser.text
|
29
28
|
end
|
30
29
|
|
31
|
-
def method_missing
|
32
|
-
|
30
|
+
def method_missing(method, *args)
|
31
|
+
element_context.send(method, *args)
|
33
32
|
end
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
33
|
|
34
|
+
def respond_to?(*args)
|
35
|
+
super || element_context.respond_to?(*args)
|
36
|
+
end
|
38
37
|
|
38
|
+
def element_context
|
39
|
+
ElementContext.new(self, @browser, self)
|
40
|
+
end
|
41
|
+
end
|