marekj-watirloo 0.0.3 → 0.0.5
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/History.txt +12 -0
- data/Manifest.txt +59 -34
- data/README.rdoc +63 -80
- data/Rakefile.rb +32 -39
- data/config/locker.yml +0 -0
- data/lib/watirloo.rb +9 -162
- data/lib/watirloo/browsers.rb +73 -0
- data/lib/watirloo/desktop.rb +44 -0
- data/lib/watirloo/{firewatir_ducktape.rb → extension/firewatir_ducktape.rb} +0 -0
- data/lib/watirloo/extension/object.rb +26 -0
- data/lib/watirloo/{watir_ducktape.rb → extension/watir_ducktape.rb} +181 -16
- data/lib/watirloo/extension/watir_reflector.rb +83 -0
- data/lib/watirloo/locker.rb +84 -0
- data/lib/watirloo/page.rb +105 -0
- data/spec/browser_spec.rb +38 -0
- data/spec/browser_threads_spec.rb +45 -0
- data/spec/checkbox_group_spec.rb +136 -0
- data/spec/checkbox_groups_spec.rb +55 -0
- data/spec/checkboxes_value_spec.rb +35 -0
- data/spec/desktop_spec.rb +54 -0
- data/spec/extra/browser_events_spec.rb +76 -0
- data/spec/extra/page_objects_metrics.rb +139 -0
- data/spec/face_mixing_spec.rb +55 -0
- data/{test → spec}/firewatir/attach_instance_test.rb +0 -0
- data/spec/firewatir/spec_results.html +263 -0
- data/spec/firewatir/spec_results.txt +23 -0
- data/spec/firewatir/spec_results_failed.txt +3 -0
- data/{test → spec}/html/census.html +0 -0
- data/spec/html/checkbox_group1.html +33 -0
- data/spec/html/labels.html +53 -0
- data/spec/html/no_title.html +13 -0
- data/{test → spec}/html/person.html +0 -0
- data/spec/html/radio_group.html +35 -0
- data/{test → spec}/html/select_lists.html +0 -0
- data/spec/input_element_spec.rb +51 -0
- data/spec/label_spec.rb +65 -0
- data/spec/locker_spec.rb +49 -0
- data/spec/page_spec.rb +53 -0
- data/spec/person_def_wrappers_spec.rb +40 -0
- data/spec/radio_group_spec.rb +95 -0
- data/spec/radio_groups_spec.rb +55 -0
- data/spec/reflector_spec.rb +82 -0
- data/spec/select_list_options_spec.rb +40 -0
- data/spec/select_lists_spec.rb +151 -0
- data/{test/test_helper.rb → spec/spec_helper.rb} +6 -4
- data/spec/spec_helper_ff.rb +5 -0
- data/spec/spec_helper_runner.rb +13 -0
- data/spec/spec_results.html +566 -0
- data/spec/spec_results.txt +179 -0
- data/spec/spec_results_failed.txt +1 -0
- data/spec/text_fields_spec.rb +56 -0
- data/watirloo.gemspec +44 -44
- metadata +80 -39
- data/lib/watirloo/reflector.rb +0 -137
- data/test/checkbox_group_test.rb +0 -83
- data/test/checkboxes_value_test.rb +0 -50
- data/test/html/checkbox_group1.html +0 -20
- data/test/html/labels.html +0 -32
- data/test/html/radio_group.html +0 -41
- data/test/interfaces_test.rb +0 -79
- data/test/label_test.rb +0 -64
- data/test/person_def_wrappers_test.rb +0 -55
- data/test/radio_group_test.rb +0 -97
- data/test/select_list_in_class_test.rb +0 -39
- data/test/select_list_options_test.rb +0 -39
- data/test/select_lists_test.rb +0 -145
- data/test/text_fields_test.rb +0 -68
data/lib/watirloo/reflector.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
=begin rdoc
|
2
|
-
Look Ma!, I can Has Reflect The Browser
|
3
|
-
|
4
|
-
Watir::Reflector module added to watir.
|
5
|
-
Run the script to reflect watir elements. reflections create wrapper methods
|
6
|
-
with suggested semantic naming based on id, name, value or combination.
|
7
|
-
the intention is to create a scaffolding for Watirloo::Page elements.
|
8
|
-
author: marekj
|
9
|
-
works with IE class and DOM elements.
|
10
|
-
=end
|
11
|
-
module Watir
|
12
|
-
|
13
|
-
# Watirloo::Page objects scaffold creation. Talks to the current page and reflects
|
14
|
-
# the watir elements to be used for semantic test objects tests.
|
15
|
-
module Reflector
|
16
|
-
|
17
|
-
@@reflectable_list = [
|
18
|
-
:text_fields,
|
19
|
-
:radios,
|
20
|
-
:checkboxes,
|
21
|
-
:select_lists
|
22
|
-
]
|
23
|
-
|
24
|
-
#cleanup the def name for some kind of semantic name
|
25
|
-
def suggest_def_name(how)
|
26
|
-
how.gsub!(/_+/,'_') # double underscores to one
|
27
|
-
how.gsub!(/^_/, '') # if it begins with undrscore kill it.
|
28
|
-
how.gsub!(/\s+/, '_') # kill spaces if for some strange reason exist
|
29
|
-
how = how[0,1].downcase << how[1,how.size] #downcase firs char
|
30
|
-
end
|
31
|
-
|
32
|
-
# glean(:text_fields, [:id, :name, :value]
|
33
|
-
# glean(:radios, [:id, :name, :value])
|
34
|
-
# glean and make a map of types and attributes needed for reflection
|
35
|
-
# this should be private I think
|
36
|
-
def glean(types, attribs)
|
37
|
-
result = []
|
38
|
-
send(types).each do |el|
|
39
|
-
subresult = {}
|
40
|
-
attribs.each do |key|
|
41
|
-
v = el.attribute_value key.to_s
|
42
|
-
subresult.update key => v
|
43
|
-
end
|
44
|
-
result << subresult
|
45
|
-
end
|
46
|
-
return result
|
47
|
-
end
|
48
|
-
|
49
|
-
# example make_reflection(:checkboxes) # => [ defs, setters, faces]
|
50
|
-
# returns array of def wrappers, setters for elements and face definitions configs.
|
51
|
-
def make_reflection(types)
|
52
|
-
attribs = [:id, :name, :value]
|
53
|
-
faces = glean(types, attribs)
|
54
|
-
watir_method = types.id2name.chop
|
55
|
-
if watir_method == 'checkboxe'
|
56
|
-
watir_method = 'checkbox' #ooopps ... irregular plural
|
57
|
-
end
|
58
|
-
def_results = "# #{types.id2name.upcase}: def wrappers with suggested semantic names for elements\n" #holds definition wrappers
|
59
|
-
set_results = "# #{types.id2name.upcase}: setters calling def wrappers with captured values\n" #holds setters with gleaned values
|
60
|
-
face_results = "# #{types.id2name.upcase}: face definitions\n" #holds faces
|
61
|
-
|
62
|
-
faces.each do |face|
|
63
|
-
id, name, value = face[:id], face[:name], face[:value]
|
64
|
-
|
65
|
-
if id != ''
|
66
|
-
how, how_s = id, :id
|
67
|
-
elsif name != ''
|
68
|
-
how, how_s = name, :name
|
69
|
-
elsif value != ''
|
70
|
-
how, how_s = value, :value
|
71
|
-
end
|
72
|
-
|
73
|
-
def_name = suggest_def_name(how)
|
74
|
-
|
75
|
-
case types
|
76
|
-
when :checkboxes, :radios
|
77
|
-
extra_value = ", '#{value}'" #for checkboxes and radios
|
78
|
-
def_value = "_#{value}" #for checkboxes and radios
|
79
|
-
def_results << "\ndef #{def_name}#{def_value}\n\s\s@b.#{watir_method}(:#{how_s}, '#{how}'#{extra_value})\nend\n"
|
80
|
-
set_results << "#{def_name}#{def_value}.set\n"
|
81
|
-
face_results << ":#{def_name}#{def_value} => [:#{watir_method}, :#{how_s}, '#{how}'#{extra_value}]\n"
|
82
|
-
|
83
|
-
when :select_lists
|
84
|
-
# round trip back to browser for items and contents
|
85
|
-
value = eval("select_list(:#{how_s}, '#{how}').getSelectedItems")
|
86
|
-
items = eval("select_list(:#{how_s}, '#{how}').getAllContents")
|
87
|
-
|
88
|
-
def_results << "def #{def_name}\n\s\s@b.select_list(:#{how_s}, '#{how}')\nend\n"
|
89
|
-
set_results << "@@#{def_name}_items=#{items.inspect}\n" #class vars for values collections
|
90
|
-
set_results << "#{def_name}.set #{value.inspect}\n"
|
91
|
-
face_results << "#:#{def_name} => [:select_list, :#{how_s}, '#{name}}']\n"
|
92
|
-
|
93
|
-
else
|
94
|
-
def_results << "\ndef #{def_name}#{def_value}\n\s\s@b.#{watir_method}(:#{how_s}, '#{how}'#{extra_value})\nend\n"
|
95
|
-
set_results << "#{def_name}#{def_value}.set\n"
|
96
|
-
face_results << "\n#:#{def_name}#{def_value} = [:#{watir_method}, :#{how_s}, '#{how}#{extra_value}']\n"
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
|
-
return [def_results, set_results, face_results]
|
103
|
-
end
|
104
|
-
private :suggest_def_name, :glean, :make_reflection
|
105
|
-
|
106
|
-
# public interface for Reflector.
|
107
|
-
# ie.reflect(:all) # => returns object definitions for entire dom using ie as container
|
108
|
-
# ie.frame('main').reflect(:select_lists) # => returns definitions for select_lists only contained by the frame
|
109
|
-
# ie.div(:id, 'main').div(:id, 'content').reflect(:all) # => definitions for all supported elements contained by a div 'content' inside div 'main'
|
110
|
-
# you can be as granular as needed
|
111
|
-
def reflect(watir_types=:all)
|
112
|
-
results = []
|
113
|
-
case watir_types
|
114
|
-
when :all
|
115
|
-
@@reflectable_list.each do |types|
|
116
|
-
results << make_reflection(types)
|
117
|
-
end
|
118
|
-
else
|
119
|
-
unless @@reflectable_list.include?(watir_types)
|
120
|
-
raise ArgumentError, "reflect method does not respond to this argument: #{watir_method}"
|
121
|
-
end
|
122
|
-
results << make_reflection(watir_types)
|
123
|
-
end
|
124
|
-
return results
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
# ducktape IE container and include the Reflector.
|
129
|
-
class IE
|
130
|
-
include Reflector
|
131
|
-
end
|
132
|
-
|
133
|
-
module Container
|
134
|
-
include Reflector
|
135
|
-
end
|
136
|
-
|
137
|
-
end
|
data/test/checkbox_group_test.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
describe 'checkbox_group access for browser' do
|
4
|
-
before :each do
|
5
|
-
page = Watirloo::Page.new
|
6
|
-
@browser = page.browser
|
7
|
-
@browser.goto testfile('checkbox_group1.html')
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'browser responds to checkbox_group' do
|
11
|
-
@browser.respond_to?(:checkbox_group).should == true
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns group object and its values from the page' do
|
15
|
-
cbg = @browser.checkbox_group('pets')
|
16
|
-
cbg.size.should == 5
|
17
|
-
cbg.values.should == %w[cat dog zook zebra wumpa]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'CheckboxGroup class access with page interface' do
|
22
|
-
|
23
|
-
class CheckboxGroupPage < Watirloo::Page
|
24
|
-
# semantic wrapper for the radio group object
|
25
|
-
face :pets => [:checkbox_group, 'pets']
|
26
|
-
end
|
27
|
-
|
28
|
-
before do
|
29
|
-
@page = CheckboxGroupPage.new
|
30
|
-
@page.b.goto testfile('checkbox_group1.html')
|
31
|
-
end
|
32
|
-
|
33
|
-
# let's check explicitly for test purpose what Class is we are dealing with
|
34
|
-
# if IE then Watir::CheckboxGroup
|
35
|
-
# if FF then FireWatir::CheckboxGroup
|
36
|
-
it 'checkbox_group container method returns CheckboxGroup class' do
|
37
|
-
if @page.b.kind_of?(FireWatir::Firefox)
|
38
|
-
@page.pets.kind_of?(FireWatir::CheckboxGroup).should == true
|
39
|
-
|
40
|
-
elsif @page.b.kind_of?(Watir::IE)
|
41
|
-
@page.pets.kind_of?(Watir::CheckboxGroup).should == true
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'size retuns checkboxes as items count in a group' do
|
46
|
-
@page.pets.size.should == 5
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'values returns array of value attributes for each checkbox in a group' do
|
50
|
-
@page.pets.values.should == ["cat", "dog", "zook", "zebra", "wumpa"]
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'selected_values returns array of value attributes of each selected checkbox' do
|
54
|
-
@page.pets.selected.should == nil
|
55
|
-
@page.pets.selected_value.should == nil
|
56
|
-
@page.pets.selected_values.should == []
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'set String checks the checkbox in a group where value is String' do
|
60
|
-
@page.pets.set 'dog'
|
61
|
-
@page.pets.selected.should == 'dog'
|
62
|
-
@page.pets.selected_value.should == 'dog'
|
63
|
-
@page.pets.selected_values.should == ['dog']
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'set String array checks each checkbox by hidden value String' do
|
67
|
-
@page.pets.set ['dog', 'zebra', 'cat'] # not in order
|
68
|
-
@page.pets.selected.should == ['cat', 'dog', 'zebra']
|
69
|
-
@page.pets.selected_value.should == ['cat', 'dog', 'zebra'] # bypass filter
|
70
|
-
@page.pets.selected_values.should == ['cat', 'dog', 'zebra']
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'set Fixnum checks checkbox by position in a group. Position is 1 based' do
|
74
|
-
@page.pets.set 3
|
75
|
-
@page.pets.selected_values.should == ['zook']
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'set array of Fixnums checks each checkbox by position' do
|
79
|
-
@page.pets.set [4,1,2] # not in order
|
80
|
-
@page.pets.selected_values.should == ["cat", "dog", "zebra"]
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
describe 'setting and getting values for individual checkboxes with value attributes in face definitions' do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@page = Watirloo::Page.new
|
7
|
-
@page.browser.goto testfile('checkbox_group1.html')
|
8
|
-
|
9
|
-
# instance method page.face adds defintion but only to the current instance of the page
|
10
|
-
# in watir you have to access each checkbox.
|
11
|
-
# in Watirloo you can access CheckboxGroup as shortcut using
|
12
|
-
# :pets => [:checkbox_group, 'pets']
|
13
|
-
@page.face(
|
14
|
-
:pets_cat => [:checkbox, :name, 'pets', 'cat'],
|
15
|
-
:pets_dog => [:checkbox, :name, 'pets', 'dog'],
|
16
|
-
:pets_zook => [:checkbox, :name, 'pets', 'zook'],
|
17
|
-
:pets_zebra => [:checkbox, :name, 'pets', 'zebra'],
|
18
|
-
:pets_wumpa => [:checkbox, :name, 'pets', 'wumpa'])
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'semantic name accesses individual CheckBox' do
|
22
|
-
if @page.b.kind_of?(FireWatir::Firefox)
|
23
|
-
@page.pets_cat.kind_of?(FireWatir::CheckBox).should == true
|
24
|
-
|
25
|
-
elsif @page.b.kind_of?(Watir::IE)
|
26
|
-
@page.pets_cat.kind_of?(Watir::CheckBox).should == true
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'set individual checkbox does not set other checkboxes sharing the same name' do
|
31
|
-
@page.pets_dog.checked?.should == false
|
32
|
-
@page.pets_dog.set
|
33
|
-
@page.pets_dog.checked?.should == true
|
34
|
-
@page.pets_cat.checked?.should == false
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'by default all are false. set each unchecked checkbox should have checked? true' do
|
38
|
-
@page.interfaces.keys.each do |key|
|
39
|
-
@page.get_face(key).checked?.should == false
|
40
|
-
end
|
41
|
-
|
42
|
-
@page.interfaces.keys.each do |key|
|
43
|
-
@page.get_face(key).set
|
44
|
-
end
|
45
|
-
|
46
|
-
@page.interfaces.keys.each do |key|
|
47
|
-
@page.get_face(key).checked?.should.be true
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
<!--
|
2
|
-
Document : checbox_group
|
3
|
-
-->
|
4
|
-
<!DOCtype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
5
|
-
<html>
|
6
|
-
<head>
|
7
|
-
<title></title>
|
8
|
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
9
|
-
</head>
|
10
|
-
<body>
|
11
|
-
<h3>Pets CheckboxGroup. Each has value. Acts like MultiSelectList. none, one ore more items can be checked.</h3>
|
12
|
-
<input name="pets" type="checkbox" value="cat">cat<br />
|
13
|
-
<input name="pets" type="checkbox" value="dog">dog<br />
|
14
|
-
<input name="pets" type="checkbox" value="zook">zook<br />
|
15
|
-
<input name="pets" type="checkbox" value="zebra">zebra<br />
|
16
|
-
<input name="pets" type="checkbox" value="wumpa">wumpa<br />
|
17
|
-
<h3>Single CheckboxToggle Only. Acts like RadioGroup on/off switch.</h3>
|
18
|
-
<input name="singleIndicator" type="checkbox">ToggleMe<br />
|
19
|
-
</body>
|
20
|
-
</html>
|
data/test/html/labels.html
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
<!--
|
2
|
-
Document : labels
|
3
|
-
http://www.w3.org/TR/html401/interact/forms.html#edef-LABEL
|
4
|
-
-->
|
5
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
6
|
-
<html>
|
7
|
-
<head>
|
8
|
-
<title></title>
|
9
|
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
10
|
-
</head>
|
11
|
-
<body>
|
12
|
-
|
13
|
-
<h3>Implicit label wraps text_field without for attribute. Click does not transfer focus to control</h3>
|
14
|
-
<form id="wrap_without_for"action="" method="get">
|
15
|
-
<p>
|
16
|
-
<label>First Name<INPUT type="text" name="fn"></label>
|
17
|
-
</p>
|
18
|
-
<p>
|
19
|
-
<label><INPUT type="text" name="ln">Last Name</label>
|
20
|
-
</p>
|
21
|
-
</form>
|
22
|
-
|
23
|
-
<h3>Explicit Label For Item with Id. Click transfers focus to control associated by id</h3>
|
24
|
-
<form id="label_for_id"action="" method="get">
|
25
|
-
<p>
|
26
|
-
<label for="first_nm">FirstName For</label><INPUT type="text" name="firstname" id="first_nm">
|
27
|
-
<INPUT type="text" name="lastname" id="last_nm"><label for="last_nm">LastName For</label>
|
28
|
-
</p>
|
29
|
-
</form>
|
30
|
-
|
31
|
-
</body>
|
32
|
-
</html>
|
data/test/html/radio_group.html
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
<!--
|
2
|
-
Document : radio_group
|
3
|
-
-->
|
4
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
5
|
-
<html>
|
6
|
-
<head>
|
7
|
-
<title>radio_groups</title>
|
8
|
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
9
|
-
</head>
|
10
|
-
<body>
|
11
|
-
<h3>wanna eat what?</h3>
|
12
|
-
<TABLE border="0">
|
13
|
-
<TBODY>
|
14
|
-
<TR>
|
15
|
-
<TD>
|
16
|
-
<INPUT type="radio" name="food" value="hotdog" />
|
17
|
-
</TD>
|
18
|
-
<TD>
|
19
|
-
Hothund
|
20
|
-
</TD>
|
21
|
-
</TR>
|
22
|
-
<TR>
|
23
|
-
<TD>
|
24
|
-
<INPUT type="radio" name="food" value="burger" checked />
|
25
|
-
</TD>
|
26
|
-
<TD>
|
27
|
-
Burgier
|
28
|
-
</TD>
|
29
|
-
</TR>
|
30
|
-
<TR>
|
31
|
-
<TD>
|
32
|
-
<INPUT type="radio" name="food" value="tofu" />
|
33
|
-
</TD>
|
34
|
-
<TD>
|
35
|
-
Tofoo
|
36
|
-
</TD>
|
37
|
-
</TR>
|
38
|
-
</TBODY>
|
39
|
-
</TABLE>
|
40
|
-
</body>
|
41
|
-
</html>
|
data/test/interfaces_test.rb
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
|
-
|
3
|
-
|
4
|
-
describe "SuperPage" do
|
5
|
-
|
6
|
-
class SuperPage < Watirloo::Page
|
7
|
-
face 'name' => 'vname'
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'class interface' do
|
11
|
-
SuperPage.interfaces.keys.should == ['name']
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'instance initialized from class interface' do
|
15
|
-
SuperPage.new.interfaces.keys.should == ['name']
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'adding interface to instance adds interface to initialize' do
|
19
|
-
page = SuperPage.new
|
20
|
-
page.face 'sub' => 'sub' # add new face to instance
|
21
|
-
page.interfaces.keys.sort.should == %w[name sub] # instnace has now two
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'but not to class' do
|
25
|
-
page = SuperPage.new
|
26
|
-
page.face 'sub' => 'sub'
|
27
|
-
page.interfaces.keys.sort.should == %w[name sub]
|
28
|
-
SuperPage.interfaces.keys.should == ['name'] # but the class has still only one
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'class interface can be updated' do
|
32
|
-
SuperPage.interfaces.update 'update' => 'vupdate'
|
33
|
-
SuperPage.interfaces.keys.sort.should == %w[name update]
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'instance gets interfaces from class but does not get them after updating class' do
|
37
|
-
page = SuperPage.new
|
38
|
-
page.interfaces.keys.sort.should == %w[name update] #previous example altered it
|
39
|
-
SuperPage.interfaces.update 'muddy' => 'vmuddy'
|
40
|
-
page.interfaces.keys.sort.should == %w[name update] #previous example altered it
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe "SuperPage and SubPage" do
|
45
|
-
|
46
|
-
class Page0 < Watirloo::Page
|
47
|
-
face 'higher' => 'vhigher'
|
48
|
-
end
|
49
|
-
class Page1 < Page0
|
50
|
-
face 'lower' => 'vlower'
|
51
|
-
end
|
52
|
-
class Page2 < Page1
|
53
|
-
face 'lowest' => 'vlowest'
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'Subpage inherits from Super its interfaces' do
|
57
|
-
p1 = Page1.new
|
58
|
-
p1.interfaces.keys.sort.should == %w[higher lower]
|
59
|
-
end
|
60
|
-
|
61
|
-
it "Super retains its interfaces and is not affected by Subpages" do
|
62
|
-
p0 = Page0.new
|
63
|
-
p0.face 'supinst' => 'vsupinst'
|
64
|
-
p0.interfaces.keys.sort.should == %w[higher supinst]
|
65
|
-
Page0.interfaces.keys.sort.should == ['higher']
|
66
|
-
|
67
|
-
p1 = Page1.new
|
68
|
-
p1.face 'subinst' => 'vsubinst'
|
69
|
-
p1.interfaces.keys.sort.should == %w[higher lower subinst]
|
70
|
-
Page1.interfaces.keys.sort.should == %w[higher lower]
|
71
|
-
|
72
|
-
# extra checks
|
73
|
-
p0.interfaces.keys.sort.should == %w[higher supinst] #super not affected by Sub
|
74
|
-
Page0.interfaces.keys.sort.should == ['higher'] #not affected by P1.instance face
|
75
|
-
Page2.interfaces.keys.sort.should == %w[higher lower lowest]
|
76
|
-
end
|
77
|
-
|
78
|
-
|
79
|
-
end
|