test-page 0.0.1 → 0.0.2
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.
- data/lib/test/page.rb +35 -3
- data/lib/test/page/version.rb +1 -1
- data/spec/test/page_spec.rb +23 -2
- metadata +2 -2
data/lib/test/page.rb
CHANGED
@@ -57,12 +57,14 @@ module Test
|
|
57
57
|
#
|
58
58
|
# @return [Object] if element is specified for {#initialize}.
|
59
59
|
# @return [Object] otherwise {.element} block is evaluated once per {Page} instance and its value will be returned.
|
60
|
+
# @raise [NoBrowserSetException] if {.element} has been set via block and browser has not been set.
|
60
61
|
def element
|
61
62
|
@setup_done ||= begin
|
62
63
|
setup if respond_to?(:setup)
|
63
64
|
true
|
64
65
|
end
|
65
66
|
@element ||= begin
|
67
|
+
raise_no_browser_set_exception unless browser
|
66
68
|
element_proc = self.class.element_block
|
67
69
|
element_proc && instance_eval(&element_proc)
|
68
70
|
end
|
@@ -133,9 +135,14 @@ module Test
|
|
133
135
|
# Proxies every method call not found on {Page} to element instance.
|
134
136
|
# Subsequent executions of the same method will be invoked on the {Page} object directly.
|
135
137
|
def method_missing(name, *args)
|
136
|
-
|
138
|
+
begin
|
139
|
+
el = element
|
140
|
+
rescue SystemStackError
|
141
|
+
raise_invalid_element_definition
|
142
|
+
end
|
143
|
+
if el.respond_to?(name)
|
137
144
|
self.class.send :define_method, name do |*args|
|
138
|
-
|
145
|
+
el.send(name, *args) {yield}
|
139
146
|
end
|
140
147
|
self.send(name, *args) {yield}
|
141
148
|
else
|
@@ -151,6 +158,31 @@ module Test
|
|
151
158
|
end
|
152
159
|
page_with_browser ? page_with_browser.browser : nil
|
153
160
|
end
|
154
|
-
|
161
|
+
|
162
|
+
def raise_no_browser_set_exception
|
163
|
+
raise NoBrowserSetException.new %q[No browser has been set to the page!
|
164
|
+
|
165
|
+
Set it to the class directly:
|
166
|
+
Test::Page.browser = browser_instance
|
167
|
+
|
168
|
+
Or set it to the instance of page:
|
169
|
+
page = MyPage.new
|
170
|
+
page.browser = browser_instance]
|
171
|
+
end
|
172
|
+
|
173
|
+
def raise_invalid_element_definition
|
174
|
+
raise InvalidElementDefinition.new %q[Element defined via block cannot be evaluated, because it is causing SystemStackError.
|
175
|
+
|
176
|
+
This is usually caused by the fact that the browser instance is not used to search that element.
|
177
|
+
|
178
|
+
For example, this is not a correct way to define an element:
|
179
|
+
element { div(:id => "something") }
|
180
|
+
|
181
|
+
Correct way would be like this:
|
182
|
+
element { browser.div(:id => "something") }]
|
183
|
+
end
|
184
|
+
|
185
|
+
NoBrowserSetException = Class.new(RuntimeError)
|
186
|
+
InvalidElementDefinition = Class.new(RuntimeError)
|
155
187
|
end
|
156
188
|
end
|
data/lib/test/page/version.rb
CHANGED
data/spec/test/page_spec.rb
CHANGED
@@ -3,10 +3,9 @@ require File.expand_path("../../lib/test/page", File.dirname(__FILE__))
|
|
3
3
|
|
4
4
|
describe Test::Page do
|
5
5
|
let(:page_class) { Class.new(Test::Page) }
|
6
|
+
before { Test::Page.browser = nil }
|
6
7
|
|
7
8
|
context ".browser" do
|
8
|
-
before { Test::Page.browser = nil }
|
9
|
-
|
10
9
|
it "sets the browser object for page" do
|
11
10
|
Test::Page.browser = "my browser"
|
12
11
|
Test::Page.browser.should == "my browser"
|
@@ -32,6 +31,8 @@ describe Test::Page do
|
|
32
31
|
end
|
33
32
|
|
34
33
|
context ".element" do
|
34
|
+
before { page_class.browser = "foo" }
|
35
|
+
|
35
36
|
it "sets the element via block" do
|
36
37
|
page_class.element { "my element" }
|
37
38
|
page = page_class.new
|
@@ -48,6 +49,7 @@ describe Test::Page do
|
|
48
49
|
|
49
50
|
context "#element" do
|
50
51
|
it "evaluates element provided by the block only once per instance" do
|
52
|
+
page_class.browser = "foo"
|
51
53
|
block_called = false
|
52
54
|
page_class.element do
|
53
55
|
raise "block should have been called only once!" if block_called
|
@@ -58,6 +60,23 @@ describe Test::Page do
|
|
58
60
|
2.times { page.element.should == "my element in block" }
|
59
61
|
block_called.should be_true
|
60
62
|
end
|
63
|
+
|
64
|
+
it "raises an exception if browser is not set" do
|
65
|
+
page_class.element { "whatever" }
|
66
|
+
|
67
|
+
expect {
|
68
|
+
page_class.new.element
|
69
|
+
}.to raise_error(Test::Page::NoBrowserSetException)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "raises an exception if element is set via block without using browser" do
|
73
|
+
page_class.element { foo_bar }
|
74
|
+
page_class.browser = "foo"
|
75
|
+
|
76
|
+
expect {
|
77
|
+
page_class.new.element
|
78
|
+
}.to raise_error(Test::Page::InvalidElementDefinition)
|
79
|
+
end
|
61
80
|
end
|
62
81
|
|
63
82
|
context "#setup" do
|
@@ -121,6 +140,7 @@ describe Test::Page do
|
|
121
140
|
it "returns the new page instance" do
|
122
141
|
second_page = Class.new(Test::Page)
|
123
142
|
page_class.send(:define_method, :redirect_me) { redirect_to second_page }
|
143
|
+
page_class.browser = "foo"
|
124
144
|
page = page_class.new
|
125
145
|
page.redirect_me.should be_an_instance_of(second_page)
|
126
146
|
end
|
@@ -128,6 +148,7 @@ describe Test::Page do
|
|
128
148
|
it "reuses the existing page element" do
|
129
149
|
second_page = Class.new(Test::Page)
|
130
150
|
page_class.send(:define_method, :redirect_me) { redirect_to second_page }
|
151
|
+
page_class.browser = "foo"
|
131
152
|
page = page_class.new "provided element"
|
132
153
|
redirected_page = page.redirect_me
|
133
154
|
redirected_page.element.should == "provided element"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test-page
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|