druid-ts 1.1.6 → 1.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,35 @@
1
1
  class MultiElementsPage
2
2
  include Druid
3
+
4
+ divs(:the_divs, :class => 'div')
5
+ buttons(:the_buttons, :class => 'button')
6
+ text_fields(:the_text_fields, :class => 'textfield')
7
+ hidden_fields(:the_hidden_fields, :class => 'hiddenfield')
8
+ text_areas(:the_text_areas, :class => 'textarea')
9
+ select_lists(:the_select_lists, :class => 'selectlist')
10
+ links(:the_links, :class => 'link')
11
+ checkboxes(:the_checkboxes, :class => 'checkbox')
12
+ radio_buttons(:the_radio_buttons, :class => 'radio')
13
+ spans(:the_spans, :class => 'span')
14
+ tables(:the_tables, :class => 'table')
15
+ cells(:the_cells, :class => 'td')
16
+ images(:the_images, :class => 'image')
17
+ forms(:the_forms, :class => 'form')
18
+ list_items(:the_list_items, :class => 'li')
19
+ unordered_lists(:the_unordered_lists, :class => 'ul')
20
+ ordered_lists(:the_ordered_lists, :class => 'ol')
21
+ h1s(:the_h1s, :class => 'h1')
22
+ h2s(:the_h2s, :class => 'h2')
23
+ h3s(:the_h3s, :class => 'h3')
24
+ h4s(:the_h4s, :class => 'h4')
25
+ h5s(:the_h5s, :class => 'h5')
26
+ h6s(:the_h6s, :class => 'h6')
27
+ paragraphs(:the_paragraphs, :class => 'p')
28
+ labels(:the_labels, :class => 'label')
29
+ file_fields(:the_file_fields, :class => 'file_field_class')
30
+ divs(:block_divs) do |page|
31
+ page.div_elements(:class => 'div')
32
+ end
3
33
  end
4
34
 
5
35
  Given(/^I am on the multi elements page$/) do
@@ -402,3 +432,91 @@ end
402
432
  When(/^I select all file fields using no identifier$/) do
403
433
  @elements = @page.file_field_elements
404
434
  end
435
+
436
+ When(/^I select the divs using the generated method$/) do
437
+ @elements = @page.the_divs_elements
438
+ end
439
+
440
+ When(/^I select the buttons using the generated method$/) do
441
+ @elements = @page.the_buttons_elements
442
+ end
443
+
444
+ When(/^I select the text field using the generated method$/) do
445
+ @elements = @page.the_text_fields_elements
446
+ end
447
+
448
+ When(/^I select the hidden fields using the generated method$/) do
449
+ @elements = @page.the_hidden_fields_elements
450
+ end
451
+
452
+ When(/^I select the text areas using the generated method$/) do
453
+ @elements = @page.the_text_areas_elements
454
+ end
455
+
456
+ When(/^I select the select lists using the generated method$/) do
457
+ @elements = @page.the_select_lists_elements
458
+ end
459
+
460
+ When(/^I select the links using the generated method$/) do
461
+ @elements = @page.the_links_elements
462
+ end
463
+
464
+ When(/^I select the check boxes using the generated method$/) do
465
+ @elements = @page.the_checkboxes_elements
466
+ end
467
+
468
+ When(/^I select the radio buttons using the generated method$/) do
469
+ @elements = @page.the_radio_buttons_elements
470
+ end
471
+
472
+ When(/^I select the spans using the generated method$/) do
473
+ @elements = @page.the_spans_elements
474
+ end
475
+
476
+ When(/^I select the tables using the generated method$/) do
477
+ @elements = @page.the_tables_elements
478
+ end
479
+
480
+ When(/^I select the cells using the generated method$/) do
481
+ @elements = @page.the_cells_elements
482
+ end
483
+
484
+ When(/^I select the images using the generated method$/) do
485
+ @elements = @page.the_images_elements
486
+ end
487
+
488
+ When(/^I select the forms using the generated method$/) do
489
+ @elements = @page.the_forms_elements
490
+ end
491
+
492
+ When(/^I select the list items using the generated method$/) do
493
+ @elements = @page.the_list_items_elements
494
+ end
495
+
496
+ When(/^I select the unordered lists using the generated method$/) do
497
+ @elements = @page.the_unordered_lists_elements
498
+ end
499
+
500
+ When(/^I select the ordered lists using the generated method$/) do
501
+ @elements = @page.the_ordered_lists_elements
502
+ end
503
+
504
+ When(/^I select the h(\d+)s using the generated method$/) do |num|
505
+ @elements = @page.send("the_h#{num.to_i}s_elements")
506
+ end
507
+
508
+ When(/^I select the paragraphs using the generated method$/) do
509
+ @elements = @page.the_paragraphs_elements
510
+ end
511
+
512
+ When(/^I select the labels using the generated method$/) do
513
+ @elements = @page.the_labels_elements
514
+ end
515
+
516
+ When(/^I select the file fields using the generated method$/) do
517
+ @elements = @page.the_file_fields_elements
518
+ end
519
+
520
+ When(/^I select the divs using a block$/) do
521
+ @elements = @page.block_divs_elements
522
+ end
@@ -1,10 +1,19 @@
1
+ require 'selenium/webdriver/remote/http/persistent'
2
+
1
3
  module Druid
2
4
  module PersistantBrowser
3
5
  @@driver = false
4
6
  def self.get_browser
5
7
  if !@@driver
6
- target_browser = ENV['BROWSER'].to_sym
7
- @@driver = Watir::Browser.new target_browser if ENV['DRIVER'] == 'WATIR'
8
+ target = ENV['BROWSER']
9
+ target = 'firefox_local' unless target
10
+
11
+ if is_remote?(target)
12
+ require File.dirname(__FILE__) + "/targets/#{target}"
13
+ extend Target
14
+ end
15
+
16
+ @@driver = watir_browser(target) if ENV['DRIVER'] == 'WATIR'
8
17
  end
9
18
  @@driver
10
19
  end
@@ -12,5 +21,38 @@ module Druid
12
21
  def self.quit
13
22
  @@driver.quit
14
23
  end
24
+
25
+ private
26
+
27
+ def self.is_remote?(target)
28
+ not target.include? 'local'
29
+ end
30
+
31
+ def self.watir_browser(target)
32
+ if is_remote?(target)
33
+ Watir::Browser.new(:remote,
34
+ :http_client => client,
35
+ :url => url,
36
+ :desired_capabilities => desired_capabilities )
37
+ else
38
+ Watir::Browser.new :firefox
39
+ end
40
+ end
41
+
42
+ def self.client
43
+ Selenium::WebDriver::Remote::Http::Persistent.new
44
+ end
45
+
46
+ def self.capabilities(browser, version, platform, name)
47
+ caps = Selenium::WebDriver::Remote::Capabilities.send browser
48
+ caps.version = version
49
+ caps.platform = platform
50
+ caps[:name] = name
51
+ caps
52
+ end
53
+
54
+ def self.url
55
+ "http://pageobject:18002ee8-963b-472e-9425-2baf0a2b6d95@ondemand.saucelabs.com:80/wd/hub"
56
+ end
15
57
  end
16
58
  end
@@ -0,0 +1,5 @@
1
+ module Target
2
+ def desired_capabilities
3
+ capabilities(:firefox, '14', 'Mac 10.6', 'Testing page-object with Firefox 14 on OS X')
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Target
2
+ def desired_capabilities
3
+ capabilities(:firefox, '14', 'Windows 2008', 'Testing page-object with Firefox 15 on Windows 7')
4
+ end
5
+ end
@@ -5,7 +5,9 @@ module UrlHelper
5
5
  end
6
6
 
7
7
  def files
8
- "file://#{html}"
8
+ target = ENV['BROWSER']
9
+ return "file://#{html}" if target.nil? or target.include? 'local'
10
+ 'http://ec2-107-22-131-88.compute-1.amazonaws.com'
9
11
  end
10
12
 
11
13
  def static_elements
@@ -1,54 +1,54 @@
1
- #Feature: Support for video element
2
-
3
- #Background:
4
- #Given I am on the static elements page
5
-
6
- #Scenario: Finding an video element
7
- #When I retrieve the video element
8
- #Then I should know it exists
9
- #And I should know it is visible
10
-
11
- #Scenario Outline: Locating a video element on the page
12
- #When I search for the video element by "<search_by>"
13
- #Then I should know it is visible
14
-
15
- #Examples:
16
- #| search_by |
17
- #| id |
18
- #| class |
19
- #| name |
20
- #| xpath |
21
- #| index |
22
-
23
- #Scenario Outline: Locating videos using multiple parameters
24
- #When I search for the video element by "<param1>" and "<param2>"
25
- #Then I should know it is visible
26
-
27
- #Examples:
28
- # | param1 | param2 |
29
- #| class | index |
30
- #| name | index |
31
-
32
- #Scenario Outline: Locating videos using multiple parameters
33
- #When I search for the video element by "<param1>" and "<param2>"
34
- #Then I should know it is visible
35
-
36
- #Examples:
37
- #| param1 | param2 |
38
- #| class | index |
39
- #| name | index |
40
-
41
- #Scenario: Should know if it is autoplay
42
- # When I retrieve the video element
43
- # Then I should know the video is not autoplay
44
-
45
- #Scenario: Should know if the controls are displayed
46
- # When I retrieve the video element
47
- # Then I should know that the controls are displayed
48
-
49
- #Scenario: Should know if it is paused
50
- # When I retrieve the video element
51
- # Then I should know that the video is paused
1
+ Feature: Support for video element
2
+
3
+ Background:
4
+ Given I am on the static elements page
5
+
6
+ Scenario: Finding an video element
7
+ When I retrieve the video element
8
+ Then I should know it exists
9
+ And I should know it is visible
10
+
11
+ Scenario Outline: Locating a video element on the page
12
+ When I search for the video element by "<search_by>"
13
+ Then I should know it is visible
14
+
15
+ Examples:
16
+ | search_by |
17
+ | id |
18
+ | class |
19
+ | name |
20
+ | xpath |
21
+ | index |
22
+
23
+ Scenario Outline: Locating videos using multiple parameters
24
+ When I search for the video element by "<param1>" and "<param2>"
25
+ Then I should know it is visible
26
+
27
+ Examples:
28
+ | param1 | param2 |
29
+ | class | index |
30
+ | name | index |
31
+
32
+ Scenario Outline: Locating videos using multiple parameters
33
+ When I search for the video element by "<param1>" and "<param2>"
34
+ Then I should know it is visible
35
+
36
+ Examples:
37
+ | param1 | param2 |
38
+ | class | index |
39
+ | name | index |
40
+
41
+ Scenario: Should know if it is autoplay
42
+ When I retrieve the video element
43
+ Then I should know the video is not autoplay
44
+
45
+ Scenario: Should know if the controls are displayed
46
+ When I retrieve the video element
47
+ Then I should know that the controls are displayed
48
+
49
+ Scenario: Should know if it is paused
50
+ When I retrieve the video element
51
+ Then I should know that the video is paused
52
52
 
53
53
  #Scenario: Should know its duration
54
54
  # When I retrieve the video element
@@ -58,8 +58,9 @@ module Druid
58
58
  #
59
59
  def expected_title(expected_title)
60
60
  define_method("has_expected_title?") do
61
- has_expected_title = expected_title === title
62
- raise "Expected title '#{expected_title}' instead of '#{title}'" unless has_expected_title
61
+ page_title = title
62
+ has_expected_title = (expected_title === page_title)
63
+ raise "Expected title '#{expected_title}' instead of '#{page_title}'" unless has_expected_title
63
64
  has_expected_title
64
65
  end
65
66
  end
@@ -75,7 +76,7 @@ module Druid
75
76
  # expected_element(:address, 10)
76
77
  # page.has_expected_element?
77
78
  #
78
- def expected_element(element_name, timeout=5)
79
+ def expected_element(element_name, timeout=Druid.default_element_wait)
79
80
  define_method("has_expected_element?") do
80
81
  self.respond_to? "#{element_name}_element" and self.send("#{element_name}_element").when_present timeout
81
82
  end
@@ -156,16 +157,7 @@ module Druid
156
157
  return click_link_for identifier.clone unless block_given?
157
158
  self.send("#{name}_element").click
158
159
  end
159
- define_method("#{name}_element") do
160
- return call_block(&block) if block_given?
161
- link_for(identifier.clone)
162
- # block ? call_block(&block) : link_for(identifier.clone)
163
- end
164
- define_method("#{name}?") do
165
- return call_block(&block).exist? if block_given?
166
- link_for(identifier.clone).exist?
167
- end
168
- alias_method "#{name}_link".to_sym, "#{name}_element".to_sym
160
+ standard_methods(name, identifier, 'link_for', &block)
169
161
  end
170
162
 
171
163
  alias_method :a, :link
@@ -203,16 +195,7 @@ module Druid
203
195
  return text_field_value_set(identifier.clone, value) unless block_given?
204
196
  self.send("#{name}_element").value = value
205
197
  end
206
- define_method("#{name}_element") do
207
- return call_block(&block) if block_given?
208
- text_field_for(identifier.clone)
209
- # block ? call_block(&block) : text_field_for(identifier.clone)
210
- end
211
- define_method("#{name}?") do
212
- return call_block(&block).exist? if block_given?
213
- text_field_for(identifier.clone).exist?
214
- end
215
- alias_method "#{name}_text_field".to_sym, "#{name}_element".to_sym
198
+ standard_methods(name, identifier, 'text_field_for', &block)
216
199
  end
217
200
 
218
201
  #
@@ -250,27 +233,19 @@ module Druid
250
233
  return checkbox_checked? identifier.clone unless block_given?
251
234
  self.send("#{name}_element").checked?
252
235
  end
253
- define_method("#{name}_element") do
254
- return call_block(&block) if block_given?
255
- checkbox_for(identifier.clone)
256
- # block ? call_block(&block) : checkbox_for(identifier.clone)
257
- end
258
- define_method("#{name}?") do
259
- return call_block(&block).exist? if block_given?
260
- checkbox_for(identifier.clone).exist?
261
- end
262
- alias_method "#{name}_checkbox".to_sym, "#{name}_element".to_sym
236
+ standard_methods(name, identifier, 'checkbox_for', &block)
263
237
  end
264
238
 
265
239
  #
266
- # adds four methods - one to select an item in a drop-down,
240
+ # adds five methods - one to select an item in a drop-down,
267
241
  # another to fetch the currently selected item text, another
268
242
  # to retrieve the select list element, and another to check the
269
- # drop down's existence.
243
+ # drop down's existence and another to get all the available options
244
+ # to select from
270
245
  #
271
246
  # @example
272
247
  # select_list(:state, :id => "state")
273
- # # will generate 'state', 'state=', 'state_element', 'state?' methods
248
+ # # will generate 'state', 'state=', 'state_element', 'state?', 'state_options' methods
274
249
  #
275
250
  # @param [Symbol] the name used for the generated methods
276
251
  # @param [Hash] identifier how we find a select_list. You can use a multiple parameters
@@ -291,16 +266,11 @@ module Druid
291
266
  return select_list_value_set(identifier.clone, value) unless block_given?
292
267
  self.send("#{name}_element").select(value)
293
268
  end
294
- define_method("#{name}_element") do
295
- return call_block(&block) if block_given?
296
- select_list_for(identifier.clone)
297
- # block ? call_block(&block) : select_list_for(identifier.clone)
298
- end
299
- define_method("#{name}?") do
300
- return call_block(&block).exist? if block_given?
301
- select_list_for(identifier.clone).exist?
269
+ define_method("#{name}_options") do
270
+ element = self.send("#{name}_element")
271
+ (element && element.options) ? element.options.collect(&:text) : []
302
272
  end
303
- alias_method "#{name}_select_list".to_sym, "#{name}_element".to_sym
273
+ standard_methods(name, identifier, 'select_list_for', &block)
304
274
  end
305
275
  alias_method :select, :select_list
306
276
 
@@ -340,16 +310,7 @@ module Druid
340
310
  return radio_selected? identifier.clone unless block_given?
341
311
  self.send("#{name}_element").selected?
342
312
  end
343
- define_method("#{name}_element") do
344
- return call_block(&block) if block_given?
345
- radio_button_for(identifier.clone)
346
- # block ? call_block(&block) : radio_button_for(identifier.clone)
347
- end
348
- define_method("#{name}?") do
349
- return call_block(&block).exist? if block_given?
350
- radio_button_for(identifier.clone).exist?
351
- end
352
- alias_method "#{name}_radio_button".to_sym, "#{name}_element".to_sym
313
+ standard_methods(name, identifier, 'radio_button_for', &block)
353
314
  end
354
315
  alias_method :radio, :radio_button
355
316
 
@@ -380,16 +341,7 @@ module Druid
380
341
  return click_button_for identifier.clone unless block_given?
381
342
  self.send("#{name}_element").click
382
343
  end
383
- define_method("#{name}_element") do
384
- return call_block(&block) if block_given?
385
- button_for(identifier.clone)
386
- # block ? call_block(&block) : button_for(identifier.clone)
387
- end
388
- define_method("#{name}?") do
389
- return call_block(&block).exist? if block_given?
390
- button_for(identifier.clone).exist?
391
- end
392
- alias_method "#{name}_button".to_sym, "#{name}_element".to_sym
344
+ standard_methods(name, identifier, 'button_for', &block)
393
345
  end
394
346
 
395
347
  #
@@ -418,16 +370,7 @@ module Druid
418
370
  return div_text_for identifier.clone unless block_given?
419
371
  self.send("#{name}_element").text
420
372
  end
421
- define_method("#{name}_element") do
422
- return call_block(&block) if block_given?
423
- div_for(identifier.clone)
424
- # block ? call_block(&block) : div_for(identifier.clone)
425
- end
426
- define_method("#{name}?") do
427
- return call_block(&block).exist? if block_given?
428
- div_for(identifier.clone).exist?
429
- end
430
- alias_method "#{name}_div".to_sym, "#{name}_element".to_sym
373
+ standard_methods(name, identifier, 'div_for', &block)
431
374
  end
432
375
 
433
376
  #
@@ -454,16 +397,7 @@ module Druid
454
397
  return table_text_for identifier.clone unless block_given?
455
398
  self.send("#{name}_element").text
456
399
  end
457
- define_method("#{name}_element") do
458
- return call_block(&block) if block_given?
459
- table_for(identifier.clone)
460
- # block ? call_block(&block) : table_for(identifier.clone)
461
- end
462
- define_method("#{name}?") do
463
- return call_block(&block).exist? if block_given?
464
- table_for(identifier.clone).exist?
465
- end
466
- alias_method "#{name}_table".to_sym, "#{name}_element".to_sym
400
+ standard_methods(name, identifier, 'table_for', &block)
467
401
  end
468
402
 
469
403
  #
@@ -491,16 +425,7 @@ module Druid
491
425
  return cell_text_for identifier.clone unless block_given?
492
426
  self.send("#{name}_element").text
493
427
  end
494
- define_method("#{name}_element") do
495
- return call_block(&block) if block_given?
496
- cell_for(identifier.clone)
497
- # block ? call_block(&block) : cell_for(identifier.clone)
498
- end
499
- define_method("#{name}?") do
500
- return call_block(&block).exist? if block_given?
501
- cell_for(identifier.clone).exist?
502
- end
503
- alias_method "#{name}_cell".to_sym, "#{name}_element".to_sym
428
+ standard_methods(name, identifier, 'cell_for', &block)
504
429
  end
505
430
  alias_method :td, :cell
506
431
 
@@ -529,16 +454,7 @@ module Druid
529
454
  return span_text_for identifier.clone unless block_given?
530
455
  self.send("#{name}_element").text
531
456
  end
532
- define_method("#{name}_element") do
533
- return call_block(&block) if block_given?
534
- span_for(identifier.clone)
535
- # block ? call_block(&block) : span_for(identifier.clone)
536
- end
537
- define_method("#{name}?") do
538
- return call_block(&block).exist? if block_given?
539
- span_for(identifier.clone).exist?
540
- end
541
- alias_method "#{name}_span".to_sym, "#{name}_element".to_sym
457
+ standard_methods(name, identifier, 'span_for', &block)
542
458
  end
543
459
 
544
460
  #
@@ -562,16 +478,7 @@ module Druid
562
478
  # @param optional block to be invoked when element method is called
563
479
  #
564
480
  def image(name, identifier={:index => 0}, &block)
565
- define_method("#{name}_element") do
566
- return call_block(&block) if block_given?
567
- image_for(identifier.clone)
568
- # block ? call_block(&block) : image_for(identifier.clone)
569
- end
570
- define_method("#{name}?") do
571
- return call_block(&block).exist? if block_given?
572
- image_for(identifier.clone).exist?
573
- end
574
- alias_method "#{name}_image".to_sym, "#{name}_element".to_sym
481
+ standard_methods(name, identifier, 'image_for', &block)
575
482
  end
576
483
  alias_method :img, :image
577
484
 
@@ -595,16 +502,7 @@ module Druid
595
502
  # @param optional block to be invoked when element method is called
596
503
  #
597
504
  def form(name, identifier={:index => 0}, &block)
598
- define_method("#{name}_element") do
599
- return call_block(&block) if block_given?
600
- form_for(identifier.clone)
601
- # block ? call_block(&block) : form_for(identifier.clone)
602
- end
603
- define_method("#{name}?") do
604
- return call_block(&block).exist? if block_given?
605
- form_for(identifier.clone).exist?
606
- end
607
- alias_method "#{name}_form".to_sym, "#{name}_element".to_sym
505
+ standard_methods(name, identifier, 'form_for', &block)
608
506
  end
609
507
 
610
508
  #
@@ -629,20 +527,11 @@ module Druid
629
527
  # @param optional block to be invoked when element method is called
630
528
  #
631
529
  def hidden_field(name, identifier={:index => 0}, &block)
632
- define_method("#{name}_element") do
633
- return call_block(&block) if block_given?
634
- hidden_field_for(identifier.clone)
635
- # block ? call_block(&block) : hidden_field_for(identifier.clone)
636
- end
637
530
  define_method(name) do
638
531
  return hidden_field_value_for identifier.clone unless block_given?
639
532
  self.send("#{name}_element").value
640
533
  end
641
- define_method("#{name}?") do
642
- return call_block(&block).exist? if block_given?
643
- hidden_field_for(identifier.clone).exist?
644
- end
645
- alias_method "#{name}_hidden_field".to_sym, "#{name}_element".to_sym
534
+ standard_methods(name, identifier, 'hidden_field_for', &block)
646
535
  end
647
536
  alias_method :hidden, :hidden_field
648
537
 
@@ -671,16 +560,7 @@ module Druid
671
560
  return list_item_text_for identifier.clone unless block_given?
672
561
  self.send("#{name}_element").text
673
562
  end
674
- define_method("#{name}_element") do
675
- return call_block(&block) if block_given?
676
- list_item_for(identifier.clone)
677
- # block ? call_block(&block) : list_item_for(identifier.clone)
678
- end
679
- define_method("#{name}?") do
680
- return call_block(&block).exist? if block_given?
681
- list_item_for(identifier.clone).exist?
682
- end
683
- alias_method "#{name}_list_item".to_sym, "#{name}_element".to_sym
563
+ standard_methods(name, identifier, 'list_item_for', &block)
684
564
  end
685
565
  alias_method :li, :list_item
686
566
 
@@ -708,16 +588,7 @@ module Druid
708
588
  return ordered_list_text_for identifier.clone unless block_given?
709
589
  self.send("#{name}_element").text
710
590
  end
711
- define_method("#{name}_element") do
712
- return call_block(&block) if block_given?
713
- ordered_list_for(identifier.clone)
714
- # block ? call_block(&block) : ordered_list_for(identifier.clone)
715
- end
716
- define_method("#{name}?") do
717
- return call_block(&block).exist? if block_given?
718
- ordered_list_for(identifier.clone).exist?
719
- end
720
- alias_method "#{name}_ordered_list".to_sym, "#{name}_element".to_sym
591
+ standard_methods(name, identifier, 'ordered_list_for', &block)
721
592
  end
722
593
  alias_method :ol, :ordered_list
723
594
 
@@ -750,16 +621,7 @@ module Druid
750
621
  return text_area_value_for identifier.clone unless block_given?
751
622
  self.send("#{name}_element").value
752
623
  end
753
- define_method("#{name}_element") do
754
- return call_block(&block) if block_given?
755
- text_area_for(identifier.clone)
756
- # block ? call_block(&block) : text_area_for(identifier.clone)
757
- end
758
- define_method("#{name}?") do
759
- return call_block(&block).exist? if block_given?
760
- text_area_for(identifier.clone).exist?
761
- end
762
- alias_method "#{name}_text_area".to_sym, "#{name}_element".to_sym
624
+ standard_methods(name, identifier, 'text_area_for', &block)
763
625
  end
764
626
  alias_method :textarea, :text_area
765
627
 
@@ -785,16 +647,7 @@ module Druid
785
647
  return unordered_list_text_for identifier.clone unless block_given?
786
648
  self.send("#{name}_element").text
787
649
  end
788
- define_method("#{name}_element") do
789
- return call_block(&block) if block_given?
790
- unordered_list_for(identifier.clone)
791
- # block ? call_block(&block) : unordered_list_for(identifier.clone)
792
- end
793
- define_method("#{name}?") do
794
- return call_block(&block).exist? if block_given?
795
- unordered_list_for(identifier.clone).exist?
796
- end
797
- alias_method "#{name}_unordered_list".to_sym, "#{name}_element".to_sym
650
+ standard_methods(name, identifier, 'unordered_list_for', &block)
798
651
  end
799
652
  alias_method :ul, :unordered_list
800
653
 
@@ -821,15 +674,7 @@ module Druid
821
674
  return h1_text_for identifier.clone unless block_given?
822
675
  self.send("#{name}_element").text
823
676
  end
824
- define_method("#{name}_element") do
825
- return call_block(&block) if block_given?
826
- h1_for(identifier.clone)
827
- end
828
- define_method("#{name}?") do
829
- return call_block(&block).exist? if block_given?
830
- h1_for(identifier.clone).exist?
831
- end
832
- alias_method "#{name}_h1".to_sym, "#{name}_element".to_sym
677
+ standard_methods(name, identifier, 'h1_for', &block)
833
678
  end
834
679
 
835
680
  #
@@ -855,15 +700,7 @@ module Druid
855
700
  return h2_text_for identifier.clone unless block_given?
856
701
  self.send("#{name}_element").text
857
702
  end
858
- define_method("#{name}_element") do
859
- return call_block(&block) if block_given?
860
- h2_for(identifier.clone)
861
- end
862
- define_method("#{name}?") do
863
- return call_block(&block).exist? if block_given?
864
- h2_for(identifier.clone).exist?
865
- end
866
- alias_method "#{name}_h2".to_sym, "#{name}_element".to_sym
703
+ standard_methods(name, identifier, 'h2_for', &block)
867
704
  end
868
705
 
869
706
  #
@@ -889,15 +726,7 @@ module Druid
889
726
  return h3_text_for identifier.clone unless block_given?
890
727
  self.send("#{name}_element").text
891
728
  end
892
- define_method("#{name}_element") do
893
- return call_block(&block) if block_given?
894
- h3_for(identifier.clone)
895
- end
896
- define_method("#{name}?") do
897
- return call_block(&block).exist? if block_given?
898
- h3_for(identifier.clone).exist?
899
- end
900
- alias_method "#{name}_h3".to_sym, "#{name}_element".to_sym
729
+ standard_methods(name, identifier, 'h3_for', &block)
901
730
  end
902
731
 
903
732
  #
@@ -923,15 +752,7 @@ module Druid
923
752
  return h4_text_for identifier.clone unless block_given?
924
753
  self.send("#{name}_element").text
925
754
  end
926
- define_method("#{name}_element") do
927
- return call_block(&block) if block_given?
928
- h4_for(identifier.clone)
929
- end
930
- define_method("#{name}?") do
931
- return call_block(&block).exist? if block_given?
932
- h4_for(identifier.clone).exist?
933
- end
934
- alias_method "#{name}_h4".to_sym, "#{name}_element".to_sym
755
+ standard_methods(name, identifier, 'h4_for', &block)
935
756
  end
936
757
 
937
758
  #
@@ -957,15 +778,7 @@ module Druid
957
778
  return h5_text_for identifier.clone unless block_given?
958
779
  self.send("#{name}_element").text
959
780
  end
960
- define_method("#{name}_element") do
961
- return call_block(&block) if block_given?
962
- h5_for(identifier.clone)
963
- end
964
- define_method("#{name}?") do
965
- return call_block(&block).exist? if block_given?
966
- h5_for(identifier.clone).exist?
967
- end
968
- alias_method "#{name}_h5".to_sym, "#{name}_element".to_sym
781
+ standard_methods(name, identifier, 'h5_for', &block)
969
782
  end
970
783
 
971
784
  #
@@ -991,15 +804,7 @@ module Druid
991
804
  return h6_text_for identifier.clone unless block_given?
992
805
  self.send("#{name}_element").text
993
806
  end
994
- define_method("#{name}_element") do
995
- return call_block(&block) if block_given?
996
- h6_for(identifier.clone)
997
- end
998
- define_method("#{name}?") do
999
- return call_block(&block).exist? if block_given?
1000
- h6_for(identifier.clone).exist?
1001
- end
1002
- alias_method "#{name}_h6".to_sym, "#{name}_element".to_sym
807
+ standard_methods(name, identifier, 'h6_for', &block)
1003
808
  end
1004
809
 
1005
810
  #
@@ -1025,15 +830,7 @@ module Druid
1025
830
  return paragraph_text_for identifier.clone unless block_given?
1026
831
  self.send("#{name}_element").text
1027
832
  end
1028
- define_method("#{name}_element") do
1029
- return call_block(&block) if block_given?
1030
- paragraph_for(identifier.clone)
1031
- end
1032
- define_method("#{name}?") do
1033
- return call_block(&block).exist? if block_given?
1034
- paragraph_for(identifier.clone).exist?
1035
- end
1036
- alias_method "#{name}_paragraph".to_sym, "#{name}_element".to_sym
833
+ standard_methods(name, identifier, 'paragraph_for', &block)
1037
834
  end
1038
835
  alias_method :p, :paragraph
1039
836
 
@@ -1061,14 +858,7 @@ module Druid
1061
858
  return file_field_value_set(identifier.clone, value) unless block_given?
1062
859
  self.send("#{name}_element").value = value
1063
860
  end
1064
- define_method("#{name}_element") do
1065
- return call_block(&block) if block_given?
1066
- file_field_for(identifier.clone)
1067
- end
1068
- define_method("#{name}?") do
1069
- return call_block(&block).exist? if block_given?
1070
- file_field_for(identifier.clone).exist?
1071
- end
861
+ standard_methods(name, identifier, 'file_field_for', &block)
1072
862
  end
1073
863
 
1074
864
  #
@@ -1095,15 +885,7 @@ module Druid
1095
885
  return label_text_for identifier.clone unless block_given?
1096
886
  self.send("#{name}_element").text
1097
887
  end
1098
- define_method("#{name}_element") do
1099
- return call_block(&block) if block_given?
1100
- label_for(identifier.clone)
1101
- end
1102
- define_method("#{name}?") do
1103
- return call_block(&block).exist? if block_given?
1104
- label_for(identifier.clone).exist?
1105
- end
1106
- alias_method "#{name}_label".to_sym, "#{name}_element".to_sym
888
+ standard_methods(name, identifier, 'label_for', &block)
1107
889
  end
1108
890
 
1109
891
  #
@@ -1130,14 +912,7 @@ module Druid
1130
912
  return click_area_for identifier.clone unless block_given?
1131
913
  self.send("#{name}_element").click
1132
914
  end
1133
- define_method("#{name}_element") do
1134
- return call_block(&block) if block_given?
1135
- area_for(identifier.clone)
1136
- end
1137
- define_method("#{name}?") do
1138
- return call_block(&block).exist? if block_given?
1139
- area_for(identifier.clone).exist?
1140
- end
915
+ standard_methods(name, identifier, 'area_for', &block)
1141
916
  end
1142
917
 
1143
918
  #
@@ -1159,14 +934,7 @@ module Druid
1159
934
  # @param optional block to be invoked when element method is called
1160
935
  #
1161
936
  def canvas(name, identifier={:index => 0}, &block)
1162
- define_method("#{name}_element") do
1163
- return call_block(&block) if block_given?
1164
- canvas_for(identifier.clone)
1165
- end
1166
- define_method("#{name}?") do
1167
- return call_block(&block).exist? if block_given?
1168
- canvas_for(identifier.clone).exist?
1169
- end
937
+ standard_methods(name, identifier, 'canvas_for', &block)
1170
938
  end
1171
939
 
1172
940
  #
@@ -1188,14 +956,7 @@ module Druid
1188
956
  # @param optional block to be invoked when element method is called
1189
957
  #
1190
958
  def audio(name, identifier={:index => 0}, &block)
1191
- define_method("#{name}_element") do
1192
- return call_block(&block) if block_given?
1193
- audio_for(identifier.clone)
1194
- end
1195
- define_method("#{name}?") do
1196
- return call_block(&block).exist? if block_given?
1197
- audio_for(identifier.clone).exist?
1198
- end
959
+ standard_methods(name, identifier, 'audio_for', &block)
1199
960
  end
1200
961
 
1201
962
  #
@@ -1217,14 +978,7 @@ module Druid
1217
978
  # @param optional block to be invoked when element method is called
1218
979
  #
1219
980
  def video(name, identifier={:index => 0}, &block)
1220
- define_method("#{name}_element") do
1221
- return call_block(&block) if block_given?
1222
- video_for(identifier.clone)
1223
- end
1224
- define_method("#{name}?") do
1225
- return call_block(&block).exist? if block_given?
1226
- video_for(identifier.clone).exist?
1227
- end
981
+ standard_methods(name, identifier, 'video_for', &block)
1228
982
  end
1229
983
 
1230
984
  #
@@ -1257,5 +1011,124 @@ module Druid
1257
1011
  self.send("#{name}_element").exist?
1258
1012
  end
1259
1013
  end
1014
+
1015
+ #
1016
+ # methods to generate accessors for types that follow the same
1017
+ # pattern as element
1018
+ #
1019
+ # @example
1020
+ # address(:home_address, :id => "home_address")
1021
+ # will generate 'home_address', 'home_address_element' and 'home_address?'
1022
+ #
1023
+ # @param [Symbol] the name used for the generated methods
1024
+ # @param [Symbol] the name of the tag for the element
1025
+ # @param [Hash] identifier how we find an element. You can use a multiple paramaters
1026
+ # by combining of any of the following except xpath. The valid keys are:
1027
+ # * :class
1028
+ # * :css
1029
+ # * :id
1030
+ # * :index
1031
+ # * :name
1032
+ # * :xpath
1033
+ # @param optional block to be invoked when element method is called
1034
+ #
1035
+ [:abbr,
1036
+ :address,
1037
+ :article,
1038
+ :aside,
1039
+ :bdi,
1040
+ :bdo,
1041
+ :cite,
1042
+ :code,
1043
+ :dd,
1044
+ :dfn,
1045
+ :dt,
1046
+ :em,
1047
+ :figcaption,
1048
+ :figure,
1049
+ :footer,
1050
+ :header,
1051
+ :hgroup,
1052
+ :kbd,
1053
+ :mark,
1054
+ :nav,
1055
+ :noscript,
1056
+ :rp,
1057
+ :rt,
1058
+ :ruby,
1059
+ :samp,
1060
+ :section,
1061
+ :sub,
1062
+ :summary,
1063
+ :sup,
1064
+ :var,
1065
+ :wbr].each do |type|
1066
+ define_method(type) do |name, *identifier, &block|
1067
+ identifier = identifier[0] ? identifier[0] : {:index => 0}
1068
+ element(name, type, identifier, &block)
1069
+ end
1070
+ end
1071
+
1072
+ def standard_methods(name, identifier, method, &block)
1073
+ define_method("#{name}_element") do
1074
+ return call_block(&block) if block_given?
1075
+ self.send(method, identifier.clone)
1076
+ end
1077
+ define_method("#{name}?") do
1078
+ return call_block(&block).exist? if block_given?
1079
+ self.send(method, identifier.clone).exist?
1080
+ end
1081
+ end
1082
+
1083
+ #
1084
+ # methods to fetch multiple elements of the same type
1085
+ #
1086
+ # adds a method to the page objec to retrun all of the matching elements
1087
+ #
1088
+ # @example
1089
+ # text_fields(:first_name, :id => "first_name")
1090
+ # # will generate 'first_name_elements'
1091
+ #
1092
+ # @param [String] the name used for the generated methods
1093
+ # @param [Hash] identifier how we find a text field. You can use a multiple paramaters
1094
+ # by combining of any of the following except xpath. The valid
1095
+ # keys are the same ones supported by the standard methods.
1096
+ # @param optional block to be invoked when element method is called
1097
+ #
1098
+ [:text_fields,
1099
+ :hidden_fields,
1100
+ :text_areas,
1101
+ :select_lists,
1102
+ :links,
1103
+ :checkboxes,
1104
+ :radio_buttons,
1105
+ :buttons,
1106
+ :divs,
1107
+ :spans,
1108
+ :tables,
1109
+ :cells,
1110
+ :images,
1111
+ :forms,
1112
+ :list_items,
1113
+ :unordered_lists,
1114
+ :ordered_lists,
1115
+ :h1s,
1116
+ :h2s,
1117
+ :h3s,
1118
+ :h4s,
1119
+ :h5s,
1120
+ :h6s,
1121
+ :paragraphs,
1122
+ :labels,
1123
+ :file_fields].each do |method_name|
1124
+ define_method(method_name) do |name, *identifier, &block|
1125
+ define_method("#{name}_elements") do
1126
+ return call_block(&block) unless block.nil?
1127
+ platform_method = (method_name == :checkboxes) ? 'checkboxs_for' : "#{method_name.to_s}_for"
1128
+ self.send platform_method, identifier.first.clone
1129
+ end
1130
+ end
1131
+ end
1132
+
1260
1133
  end
1261
1134
  end