druid-ts 1.1.2 → 1.1.3

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +21 -0
  3. data/README.md +42 -32
  4. data/features/button.feature +1 -0
  5. data/features/element.feature +4 -0
  6. data/features/generic_elements.feature +24 -0
  7. data/features/html/multi_elements.html +4 -0
  8. data/features/html/nested_elements.html +3 -0
  9. data/features/html/static_elements.html +14 -1
  10. data/features/javascript.feature +6 -0
  11. data/features/label.feature +44 -0
  12. data/features/link.feature +1 -0
  13. data/features/multi_elements.feature +7 -0
  14. data/features/nested_elements.feature +4 -0
  15. data/features/page_level_actions.feature +12 -0
  16. data/features/select_list.feature +5 -3
  17. data/features/step_definations/element_steps.rb +14 -0
  18. data/features/step_definations/generic_element_steps.rb +19 -0
  19. data/features/step_definations/javasript_steps.rb +8 -0
  20. data/features/step_definations/label_steps.rb +19 -0
  21. data/features/step_definations/multi_elements_steps.rb +12 -0
  22. data/features/step_definations/nested_elements_steps.rb +9 -1
  23. data/features/step_definations/page_level_actions_steps.rb +17 -0
  24. data/features/step_definations/select_list_steps.rb +5 -0
  25. data/features/support/page.rb +21 -0
  26. data/lib/druid.rb +17 -0
  27. data/lib/druid/accessors.rb +110 -2
  28. data/lib/druid/assist.rb +26 -1
  29. data/lib/druid/element_locators.rb +42 -6
  30. data/lib/druid/elements.rb +2 -1
  31. data/lib/druid/elements/button.rb +1 -1
  32. data/lib/druid/elements/element.rb +1 -1
  33. data/lib/druid/elements/label.rb +11 -0
  34. data/lib/druid/elements/link.rb +1 -1
  35. data/lib/druid/nested_elements.rb +9 -1
  36. data/lib/druid/page_factory.rb +6 -0
  37. data/lib/druid/version.rb +1 -1
  38. data/spec/druid/accessors_spec.rb +48 -4
  39. data/spec/druid/druid_spec.rb +11 -0
  40. data/spec/druid/element_locators_spec.rb +12 -0
  41. data/spec/druid/elements/button_spec.rb +1 -1
  42. data/spec/druid/elements/label_spec.rb +19 -0
  43. data/spec/druid/elements/link_spec.rb +1 -1
  44. data/spec/druid/page_factory_spec.rb +26 -0
  45. metadata +12 -1
@@ -15,7 +15,7 @@ module Druid
15
15
  # method to return the element for a tag_name
16
16
  #
17
17
  def element_class_for(tag_name, type=nil)
18
- return type_to_class[type] if type
18
+ return type_to_class[type.to_sym] if type
19
19
  tag_to_class[tag_name.to_sym] || Druid::Elements::Element
20
20
  end
21
21
  end
@@ -45,3 +45,4 @@ require 'druid/elements/option.rb'
45
45
  require 'druid/elements/heading.rb'
46
46
  require 'druid/elements/paragraph.rb'
47
47
  require 'druid/elements/file_field.rb'
48
+ require 'druid/elements/label.rb'
@@ -3,7 +3,7 @@ module Druid
3
3
  class Button < Element
4
4
 
5
5
  def self.finders
6
- super + [:value, :text, :src, :alt]
6
+ super + [:value, :text, :src, :alt, :css]
7
7
  end
8
8
 
9
9
  end
@@ -35,7 +35,7 @@ module Druid
35
35
  end
36
36
 
37
37
  def self.have_to_build_xpath(identifier)
38
- ['table', 'span', 'div', 'td', 'li', 'ol', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p'].include? identifier[:tag_name] and identifier[:name]
38
+ ['table', 'span', 'div', 'td', 'li', 'ol', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'label'].include? identifier[:tag_name] and identifier[:name]
39
39
  end
40
40
 
41
41
  def self.build_xpath_for identifier
@@ -0,0 +1,11 @@
1
+ module Druid
2
+ module Elements
3
+ class Label < Element
4
+ def self.finders
5
+ super + [:text]
6
+ end
7
+
8
+ Druid::Elements.tag_to_class[:label] = Druid::Elements::Label
9
+ end
10
+ end
11
+ end
@@ -5,7 +5,7 @@ module Druid
5
5
  protected
6
6
 
7
7
  def self.finders
8
- super + [:href, :text]
8
+ super + [:href, :text, :css]
9
9
  end
10
10
 
11
11
  def self.mapping
@@ -192,8 +192,16 @@ module Druid
192
192
  paragraphs_for(identifier)
193
193
  end
194
194
 
195
- def file_field_element(identifier={:index =>0})
195
+ def file_field_element(identifier={:index => 0})
196
196
  file_field_for(identifier)
197
197
  end
198
+
199
+ def label_element(identifier={:index => 0})
200
+ label_for(identifier)
201
+ end
202
+
203
+ def label_elements(identifier={:index => 0})
204
+ labels_for(identifier)
205
+ end
198
206
  end
199
207
  end
@@ -41,6 +41,9 @@ module Druid
41
41
  def visit_page(page_class, &block)
42
42
  on_page page_class, true, &block
43
43
  end
44
+
45
+ # Support 'visit' for readability of usage
46
+ alias_method :visit, :visit_page
44
47
  #
45
48
  # Create a page object.
46
49
  #
@@ -55,6 +58,9 @@ module Druid
55
58
  @current_page
56
59
  end
57
60
 
61
+ # Support 'on' for readability of usage
62
+ alias_method :on, :on_page
63
+
58
64
  #
59
65
  # Navigate to a specific page following a predefined path.
60
66
  #
data/lib/druid/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Druid
2
- VERSION = "1.1.2"
2
+ VERSION = "1.1.3"
3
3
  end
@@ -4,6 +4,8 @@ class AccessorsTestDruid
4
4
  include Druid
5
5
 
6
6
  page_url "http://apple.com"
7
+ expected_title "Expected Title"
8
+ expected_element :google_search
7
9
  link(:google_search, :link => 'Google Search')
8
10
  text_field(:first_name, :id => 'first_name')
9
11
  select_list(:state, :id => 'state')
@@ -124,17 +126,57 @@ describe Druid::Accessors do
124
126
  describe "goto a page" do
125
127
  it "should navigate to a page when requested" do
126
128
  expect(driver).to receive(:goto)
127
- page = AccessorsTestDruid.new(driver, true)
129
+ AccessorsTestDruid.new(driver, true)
130
+ end
131
+
132
+ it "should call a method when page_url called with a symbol" do
133
+ class SymbolPageUrl
134
+ include Druid
135
+ page_url :custom_url
136
+ def custom_url
137
+ 'custom'
138
+ end
139
+ end
140
+ expect(driver).to receive(:goto).with("custom")
141
+ SymbolPageUrl.new(driver, true)
128
142
  end
129
143
 
130
144
  it "should not navigate to a page when not requested" do
131
145
  expect(driver).not_to receive(:goto)
132
- page = AccessorsTestDruid.new(driver)
146
+ AccessorsTestDruid.new(driver)
133
147
  end
134
148
 
135
149
  it "should not navigate to a page when 'page_url' not specified" do
136
150
  expect(driver).not_to receive(:goto)
137
- page = TestDruidBackUp.new(driver,true)
151
+ TestDruidBackUp.new(driver,true)
152
+ end
153
+ end
154
+
155
+ describe "validating the page title" do
156
+ it "should validate the title" do
157
+ expect(driver).to receive(:title).and_return("Expected Title")
158
+ expect(druid).to have_expected_title
159
+ end
160
+
161
+ it "should raise error when it does not have expected title" do
162
+ expect(driver).to receive(:title).twice.and_return("Not Expected")
163
+ expect {druid.has_expected_title? }.to raise_error
164
+ end
165
+ end
166
+
167
+ describe "validating the existence of an element" do
168
+ it "should validate an element exists" do
169
+ allow(druid).to receive(:google_search_element).and_return(driver)
170
+ allow(driver).to receive(:when_present).and_return(true)
171
+ druid.has_expected_element?
172
+ end
173
+
174
+ it "should handle non-existent elements gracefully" do
175
+ class FakePage
176
+ include Druid
177
+ expected_element :foo
178
+ end
179
+ expect(FakePage.new(driver)).not_to have_expected_element
138
180
  end
139
181
  end
140
182
 
@@ -217,7 +259,9 @@ describe Druid::Accessors do
217
259
 
218
260
  context "implementation" do
219
261
  it "should get the current item from a select list" do
220
- expect(driver).to receive_message_chain(:select_list, :value).and_return('OH')
262
+ allow(driver).to receive(:selected?).and_return(driver)
263
+ allow(driver).to receive(:text).and_return('OH')
264
+ expect(driver).to receive_message_chain(:select_list, :options).and_return([driver])
221
265
  expect(druid.state).to eql 'OH'
222
266
  end
223
267
 
@@ -170,6 +170,17 @@ describe Druid do
170
170
  Druid.add_framework(:foo, :bar)
171
171
  end
172
172
 
173
+ it "should execute javascript on the browser" do
174
+ expect(driver).to receive(:execute_script).and_return("abc")
175
+ expect(druid.execute_script("333")).to eql "abc"
176
+ end
177
+
178
+ it "should know which element has focus" do
179
+ expect(driver).to receive(:execute_script).and_return(driver)
180
+ expect(driver).to receive(:tag_name).twice.and_return(:input)
181
+ expect(driver).to receive(:type).and_return(:submit)
182
+ expect(druid.element_with_focus.class).to eql Druid::Elements::Button
183
+ end
173
184
  end
174
185
  end
175
186
 
@@ -304,4 +304,16 @@ describe Druid::ElementLocators do
304
304
  element = page.file_field_element(:id => 'blah')
305
305
  expect(element).to be_instance_of Druid::Elements::FileField
306
306
  end
307
+
308
+ it "should find a label" do
309
+ expect(driver).to receive(:label).with(:id => 'blah').and_return(driver)
310
+ element = page.label_element(:id => 'blah')
311
+ expect(element).to be_instance_of Druid::Elements::Label
312
+ end
313
+
314
+ it "should find all label elements" do
315
+ expect(driver).to receive(:labels).with(:id => 'blah').and_return([driver])
316
+ elements = page.label_elements(:id => 'blah')
317
+ expect(elements[0]).to be_instance_of Druid::Elements::Label
318
+ end
307
319
  end
@@ -4,7 +4,7 @@ require 'druid/elements'
4
4
  describe Druid::Elements::Button do
5
5
  describe "when mapping how to find an element" do
6
6
  it "should map watir types to same" do
7
- [:class, :id, :index, :name, :value, :xpath, :src, :alt].each do |t|
7
+ [:class, :id, :index, :name, :value, :xpath, :src, :alt, :css].each do |t|
8
8
  identifier = Druid::Elements::Button.identifier_for t => 'value'
9
9
  expect(identifier.keys.first).to eql t
10
10
  end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'druid/elements'
3
+
4
+ describe Druid::Elements::Label do
5
+ describe "when mapping how to find an element" do
6
+ it "should map watir types to same" do
7
+ [:class, :id, :text, :index, :xpath].each do |t|
8
+ identifier = Druid::Elements::Label.identifier_for t => 'value'
9
+ expect(identifier.keys.first).to eql t
10
+ end
11
+ end
12
+ end
13
+
14
+ describe "interface" do
15
+ it "should register with tag :label" do
16
+ expect(Druid::Elements.element_class_for(:label)).to be Druid::Elements::Label
17
+ end
18
+ end
19
+ end
@@ -4,7 +4,7 @@ require 'druid/elements'
4
4
  describe Druid::Elements::Link do
5
5
  describe "when mapping how to find an element" do
6
6
  it "should map watir types to same" do
7
- [:class, :href, :id, :name, :text, :xpath].each do |t|
7
+ [:class, :href, :id, :name, :text, :xpath, :css].each do |t|
8
8
  identifier = Druid::Elements::Link.identifier_for t => 'value'
9
9
  expect(identifier.keys.first).to eql t
10
10
  end
@@ -6,6 +6,11 @@ class FactoryTestDruid
6
6
  page_url "http://google.com"
7
7
  end
8
8
 
9
+ class TestPageWithDirectUrl
10
+ include Druid
11
+ direct_url "http://google.com"
12
+ end
13
+
9
14
  class AnotherPage
10
15
  include Druid
11
16
  end
@@ -37,6 +42,13 @@ describe Druid::PageFactory do
37
42
  end
38
43
  end
39
44
 
45
+ it "should create a new page object and execute a block using 'on'" do
46
+ expect(driver).not_to receive(:goto)
47
+ world.on FactoryTestDruid do |page|
48
+ expect(page).to be_instance_of FactoryTestDruid
49
+ end
50
+ end
51
+
40
52
  it "should create and visit a new page" do
41
53
  expect(driver).to receive(:goto)
42
54
  world.visit_page FactoryTestDruid do |page|
@@ -44,6 +56,20 @@ describe Druid::PageFactory do
44
56
  end
45
57
  end
46
58
 
59
+ it "should create and visit a new page using 'visit'" do
60
+ expect(driver).to receive(:goto)
61
+ world.visit FactoryTestDruid do |page|
62
+ expect(page).to be_instance_of FactoryTestDruid
63
+ end
64
+ end
65
+
66
+ it "should create and visit a new page when url is defined as 'direct_url'" do
67
+ expect(driver).to receive(:goto)
68
+ world.visit TestPageWithDirectUrl do |page|
69
+ expect(page).to be_instance_of TestPageWithDirectUrl
70
+ end
71
+ end
72
+
47
73
  it "should set an instance variable that can be used outside of the block" do
48
74
  expect(driver).not_to receive(:goto)
49
75
  page = world.on_page FactoryTestDruid
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: druid-ts
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Sheng
@@ -91,6 +91,7 @@ files:
91
91
  - features/file_field.feature
92
92
  - features/form.feature
93
93
  - features/frames.feature
94
+ - features/generic_elements.feature
94
95
  - features/heading.feature
95
96
  - features/hidden_field.feature
96
97
  - features/html/async.html
@@ -113,6 +114,7 @@ files:
113
114
  - features/html/success.html
114
115
  - features/image.feature
115
116
  - features/javascript.feature
117
+ - features/label.feature
116
118
  - features/link.feature
117
119
  - features/list_item.feature
118
120
  - features/modal_dialog.feature
@@ -137,10 +139,12 @@ files:
137
139
  - features/step_definations/file_field_steps.rb
138
140
  - features/step_definations/form_steps.rb
139
141
  - features/step_definations/frame_steps.rb
142
+ - features/step_definations/generic_element_steps.rb
140
143
  - features/step_definations/heading_steps.rb
141
144
  - features/step_definations/hidden_field_steps.rb
142
145
  - features/step_definations/image_steps.rb
143
146
  - features/step_definations/javasript_steps.rb
147
+ - features/step_definations/label_steps.rb
144
148
  - features/step_definations/link_steps.rb
145
149
  - features/step_definations/list_item_steps.rb
146
150
  - features/step_definations/modal_dialog_steps.rb
@@ -184,6 +188,7 @@ files:
184
188
  - lib/druid/elements/heading.rb
185
189
  - lib/druid/elements/hidden_field.rb
186
190
  - lib/druid/elements/image.rb
191
+ - lib/druid/elements/label.rb
187
192
  - lib/druid/elements/link.rb
188
193
  - lib/druid/elements/list_item.rb
189
194
  - lib/druid/elements/option.rb
@@ -217,6 +222,7 @@ files:
217
222
  - spec/druid/elements/heading_spec.rb
218
223
  - spec/druid/elements/hidden_field_spec.rb
219
224
  - spec/druid/elements/image_spec.rb
225
+ - spec/druid/elements/label_spec.rb
220
226
  - spec/druid/elements/link_spec.rb
221
227
  - spec/druid/elements/list_item_spec.rb
222
228
  - spec/druid/elements/option_spec.rb
@@ -270,6 +276,7 @@ test_files:
270
276
  - features/file_field.feature
271
277
  - features/form.feature
272
278
  - features/frames.feature
279
+ - features/generic_elements.feature
273
280
  - features/heading.feature
274
281
  - features/hidden_field.feature
275
282
  - features/html/async.html
@@ -292,6 +299,7 @@ test_files:
292
299
  - features/html/success.html
293
300
  - features/image.feature
294
301
  - features/javascript.feature
302
+ - features/label.feature
295
303
  - features/link.feature
296
304
  - features/list_item.feature
297
305
  - features/modal_dialog.feature
@@ -316,10 +324,12 @@ test_files:
316
324
  - features/step_definations/file_field_steps.rb
317
325
  - features/step_definations/form_steps.rb
318
326
  - features/step_definations/frame_steps.rb
327
+ - features/step_definations/generic_element_steps.rb
319
328
  - features/step_definations/heading_steps.rb
320
329
  - features/step_definations/hidden_field_steps.rb
321
330
  - features/step_definations/image_steps.rb
322
331
  - features/step_definations/javasript_steps.rb
332
+ - features/step_definations/label_steps.rb
323
333
  - features/step_definations/link_steps.rb
324
334
  - features/step_definations/list_item_steps.rb
325
335
  - features/step_definations/modal_dialog_steps.rb
@@ -360,6 +370,7 @@ test_files:
360
370
  - spec/druid/elements/heading_spec.rb
361
371
  - spec/druid/elements/hidden_field_spec.rb
362
372
  - spec/druid/elements/image_spec.rb
373
+ - spec/druid/elements/label_spec.rb
363
374
  - spec/druid/elements/link_spec.rb
364
375
  - spec/druid/elements/list_item_spec.rb
365
376
  - spec/druid/elements/option_spec.rb