centric_page_object 2.3.1

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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +8 -0
  4. data/.rspec +2 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +17 -0
  8. data/ChangeLog +931 -0
  9. data/Gemfile +12 -0
  10. data/Guardfile +20 -0
  11. data/LICENSE +20 -0
  12. data/README.md +114 -0
  13. data/Rakefile +29 -0
  14. data/centric_page_object.gemspec +31 -0
  15. data/cucumber.yml +8 -0
  16. data/lib/page-object/accessors.rb +1201 -0
  17. data/lib/page-object/element_locators.rb +21 -0
  18. data/lib/page-object/elements/area.rb +9 -0
  19. data/lib/page-object/elements/audio.rb +9 -0
  20. data/lib/page-object/elements/bold.rb +9 -0
  21. data/lib/page-object/elements/button.rb +12 -0
  22. data/lib/page-object/elements/canvas.rb +10 -0
  23. data/lib/page-object/elements/check_box.rb +9 -0
  24. data/lib/page-object/elements/date_field.rb +10 -0
  25. data/lib/page-object/elements/div.rb +9 -0
  26. data/lib/page-object/elements/element.rb +212 -0
  27. data/lib/page-object/elements/file_field.rb +9 -0
  28. data/lib/page-object/elements/form.rb +9 -0
  29. data/lib/page-object/elements/heading.rb +14 -0
  30. data/lib/page-object/elements/hidden_field.rb +9 -0
  31. data/lib/page-object/elements/image.rb +10 -0
  32. data/lib/page-object/elements/italic.rb +9 -0
  33. data/lib/page-object/elements/label.rb +9 -0
  34. data/lib/page-object/elements/link.rb +9 -0
  35. data/lib/page-object/elements/list_item.rb +9 -0
  36. data/lib/page-object/elements/media.rb +11 -0
  37. data/lib/page-object/elements/option.rb +9 -0
  38. data/lib/page-object/elements/ordered_list.rb +43 -0
  39. data/lib/page-object/elements/paragraph.rb +9 -0
  40. data/lib/page-object/elements/radio_button.rb +9 -0
  41. data/lib/page-object/elements/select_list.rb +42 -0
  42. data/lib/page-object/elements/span.rb +9 -0
  43. data/lib/page-object/elements/table.rb +85 -0
  44. data/lib/page-object/elements/table_cell.rb +10 -0
  45. data/lib/page-object/elements/table_row.rb +52 -0
  46. data/lib/page-object/elements/text_area.rb +9 -0
  47. data/lib/page-object/elements/text_field.rb +10 -0
  48. data/lib/page-object/elements/unordered_list.rb +42 -0
  49. data/lib/page-object/elements/video.rb +9 -0
  50. data/lib/page-object/elements.rb +62 -0
  51. data/lib/page-object/indexed_properties.rb +41 -0
  52. data/lib/page-object/javascript/angularjs.rb +14 -0
  53. data/lib/page-object/javascript/jquery.rb +14 -0
  54. data/lib/page-object/javascript/prototype.rb +14 -0
  55. data/lib/page-object/javascript/yui.rb +19 -0
  56. data/lib/page-object/javascript_framework_facade.rb +80 -0
  57. data/lib/page-object/locator_generator.rb +183 -0
  58. data/lib/page-object/nested_elements.rb +17 -0
  59. data/lib/page-object/page_factory.rb +108 -0
  60. data/lib/page-object/page_populator.rb +105 -0
  61. data/lib/page-object/platforms/watir/page_object.rb +1155 -0
  62. data/lib/page-object/platforms/watir.rb +50 -0
  63. data/lib/page-object/section_collection.rb +16 -0
  64. data/lib/page-object/version.rb +4 -0
  65. data/lib/page-object/widgets.rb +98 -0
  66. data/lib/page-object.rb +431 -0
  67. data/pageobject.gems +1 -0
  68. metadata +239 -0
@@ -0,0 +1,1155 @@
1
+ require 'page-object/elements'
2
+
3
+
4
+ module PageObject
5
+ module Platforms
6
+ module Watir
7
+
8
+ #
9
+ # Watir implementation of the page object platform driver. You should not use the
10
+ # class directly. Instead you should include the PageObject module in your page object
11
+ # and use the methods dynamically added from the PageObject::Accessors module.
12
+ #
13
+ class PageObject
14
+ attr_reader :browser
15
+
16
+ def self.define_widget_accessors(widget_tag, widget_class, base_element_tag)
17
+ define_widget_singular_accessor(base_element_tag, widget_class, widget_tag)
18
+ define_widget_multiple_accessor(base_element_tag, widget_class, widget_tag)
19
+ end
20
+
21
+ def initialize(browser)
22
+ @browser = browser
23
+ end
24
+
25
+ #
26
+ # platform method to navigate to a provided url
27
+ # See PageObject#navigate_to
28
+ #
29
+ def navigate_to(url)
30
+ @browser.goto url
31
+ end
32
+
33
+ #
34
+ # platform method to get the current url
35
+ # See PageObject#current_url
36
+ #
37
+ def current_url
38
+ @browser.url
39
+ end
40
+
41
+ #
42
+ # platform method to retrieve the text from the current page
43
+ # See PageObject#text
44
+ #
45
+ def text
46
+ @browser.text
47
+ end
48
+
49
+ #
50
+ # platform method to retrieve the html for the current page
51
+ # See PageObject#html
52
+ #
53
+ def html
54
+ @browser.html
55
+ end
56
+
57
+ #
58
+ # platform method to retrieve the title for the current page
59
+ # See PageObject#title
60
+ #
61
+ def title
62
+ @browser.title
63
+ end
64
+
65
+ #
66
+ # platform method to wait for a block to return true
67
+ # See PageObject#wait_until
68
+ def wait_until(timeout, message = nil, &block)
69
+ @browser.wait_until(timeout: timeout, message: message, &block)
70
+ end
71
+
72
+ #
73
+ # platform method to handle an alert popup
74
+ # See PageObject#alert
75
+ #
76
+ def alert(frame=nil, &block)
77
+ switch_to_frame(frame)
78
+ yield
79
+ value = nil
80
+ if @browser.alert.exists?
81
+ value = @browser.alert.text
82
+ @browser.alert.ok
83
+ end
84
+ switch_to_default_content(frame)
85
+ value
86
+ end
87
+
88
+ #
89
+ # platform method to handle a confirm popup
90
+ # See PageObject#confirm
91
+ #
92
+ def confirm(response, frame=nil, &block)
93
+ switch_to_frame(frame)
94
+ yield
95
+ value = nil
96
+ if @browser.alert.exists?
97
+ value = @browser.alert.text
98
+ response ? @browser.alert.ok : @browser.alert.close
99
+ end
100
+ switch_to_default_content(frame)
101
+ value
102
+ end
103
+
104
+ #
105
+ # platform method to handle a prompt popup
106
+ # See PageObject#prompt
107
+ #
108
+ def prompt(answer, frame=nil, &block)
109
+ switch_to_frame(frame)
110
+ @browser.wd.execute_script "window.prompt = function(text, value) { window.__lastWatirPrompt = { message: text, default_value: value }; return #{answer}; }"
111
+ yield
112
+ result = @browser.wd.execute_script "return window.__lastWatirPrompt"
113
+ switch_to_default_content(frame)
114
+ result && result.dup.each_key { |k| result[k.to_sym] = result.delete(k) }
115
+ result
116
+ end
117
+
118
+ #
119
+ # platform method to execute javascript on the browser
120
+ # See PageObject#execute_script
121
+ #
122
+ def execute_script(script, *args)
123
+ @browser.execute_script(script, *args)
124
+ end
125
+
126
+ #
127
+ # platform method to handle attaching to a running window
128
+ # See PageObject#attach_to_window
129
+ #
130
+ def attach_to_window(identifier, &block)
131
+ win_id = {identifier.keys.first => /#{Regexp.escape(identifier.values.first)}/}
132
+ @browser.window(win_id).use &block
133
+ end
134
+
135
+ def element_with_focus
136
+ element = browser.execute_script("return document.activeElement")
137
+ type = element.type.to_sym if element.tag_name.to_sym == :input
138
+ cls = ::PageObject::Elements.element_class_for(element.tag_name, type)
139
+ cls.new(element)
140
+ end
141
+
142
+ #
143
+ # platform method to switch to a frame and execute a block
144
+ # See PageObject#in_frame
145
+ #
146
+ def in_frame(identifier, frame=nil, &block)
147
+ frame = [] if frame.nil?
148
+ frame << {frame: identifier}
149
+ block.call(frame)
150
+ end
151
+
152
+ #
153
+ # platform method to switch to an iframe and execute a block
154
+ # See PageObject#in_frame
155
+ #
156
+ def in_iframe(identifier, frame=nil, &block)
157
+ frame = [] if frame.nil?
158
+ frame << {iframe: identifier}
159
+ block.call(frame)
160
+ end
161
+
162
+ #
163
+ # platform method to refresh the page
164
+ # See PageObject#refresh
165
+ #
166
+ def refresh
167
+ @browser.refresh
168
+ end
169
+
170
+ #
171
+ # platform method to go back to the previous page
172
+ # See PageObject#back
173
+ #
174
+ def back
175
+ @browser.back
176
+ end
177
+
178
+ #
179
+ # platform method to go forward to the next page
180
+ # See PageObject#forward
181
+ #
182
+ def forward
183
+ @browser.forward
184
+ end
185
+
186
+ #
187
+ # platform method to clear the cookies from the browser
188
+ # See PageObject#clear_cookies
189
+ #
190
+ def clear_cookies
191
+ @browser.cookies.clear
192
+ end
193
+
194
+ #
195
+ # platform method to save the current screenshot to a file
196
+ # See PageObject#save_screenshot
197
+ #
198
+ def save_screenshot(file_name)
199
+ @browser.wd.save_screenshot(file_name)
200
+ end
201
+
202
+ #
203
+ # platform method to get the value stored in a text field
204
+ # See PageObject::Accessors#text_field
205
+ #
206
+ def text_field_value_for(identifier)
207
+ process_watir_call("text_field(identifier).value", Elements::TextField, identifier)
208
+ end
209
+
210
+ #
211
+ # platform method to set the value for a text field
212
+ # See PageObject::Accessors#text_field
213
+ #
214
+ def text_field_value_set(identifier, value)
215
+ process_watir_call("text_field(identifier).set(value)", Elements::TextField, identifier, value)
216
+ end
217
+
218
+ #
219
+ # platform method to retrieve a text field element
220
+ # See PageObject::Accessors#text_field
221
+ #
222
+ def text_field_for(identifier)
223
+ find_watir_element("text_field(identifier)", Elements::TextField, identifier)
224
+ end
225
+
226
+ #
227
+ # platform method to retrieve an array of text field elements
228
+ #
229
+ def text_fields_for(identifier)
230
+ elements = find_watir_elements("text_fields(identifier)", Elements::TextField, identifier)
231
+ elements.select { |e| e.element.tag_name == 'input' }
232
+ end
233
+
234
+ #
235
+ # platform method to get the value stored in a date field
236
+ # See PageObject::Accessors#date_field
237
+ #
238
+ def date_field_value_for(identifier)
239
+ process_watir_call("date_field(identifier).value", Elements::DateField, identifier)
240
+ end
241
+
242
+ #
243
+ # platform method to set the value for a date field
244
+ # See PageObject::Accessors#date_field
245
+ #
246
+ def date_field_value_set(identifier, value)
247
+ process_watir_call("date_field(identifier).set(value)", Elements::DateField, identifier, value)
248
+ end
249
+
250
+ #
251
+ # platform method to retrieve a date field element
252
+ # See PageObject::Accessors#date_field
253
+ #
254
+ def date_field_for(identifier)
255
+ find_watir_element("date_field(identifier)", Elements::DateField, identifier)
256
+ end
257
+
258
+ #
259
+ # platform method to retrieve an array of date field elements
260
+ #
261
+ def date_fields_for(identifier)
262
+ find_watir_elements("date_fields(identifier)", Elements::DateField, identifier)
263
+ end
264
+
265
+ #
266
+ # platform method to get the value stored in a hidden field
267
+ # See PageObject::Accessors#hidden_field
268
+ #
269
+ def hidden_field_value_for(identifier)
270
+ process_watir_call("hidden(identifier).value", Elements::HiddenField, identifier)
271
+ end
272
+
273
+ #
274
+ # platform method to retrieve a hidden field element
275
+ # See PageObject::Accessors#hidden_field
276
+ #
277
+ def hidden_field_for(identifier)
278
+ find_watir_element("hidden(identifier)", Elements::HiddenField, identifier)
279
+ end
280
+
281
+ #
282
+ # platform method to retrieve an array of hidden field elements
283
+ #
284
+ def hidden_fields_for(identifier)
285
+ find_watir_elements("hiddens(identifier)", Elements::HiddenField, identifier)
286
+ end
287
+
288
+ #
289
+ # platform method to set text in a textarea
290
+ # See PageObject::Accessors#text_area
291
+ #
292
+ def text_area_value_set(identifier, value)
293
+ process_watir_call("textarea(identifier).set(value)", Elements::TextArea,
294
+ identifier, value)
295
+ end
296
+
297
+ #
298
+ # platform method to get the text from a textarea
299
+ # See PageObject::Accessors#text_area
300
+ #
301
+ def text_area_value_for(identifier)
302
+ process_watir_call("textarea(identifier).value", Elements::TextArea, identifier)
303
+ end
304
+
305
+ #
306
+ # platform method to get the text area element
307
+ # See PageObject::Accessors#text_area
308
+ #
309
+ def text_area_for(identifier)
310
+ find_watir_element("textarea(identifier)", Elements::TextArea, identifier)
311
+ end
312
+
313
+ #
314
+ # platform method to retrieve an array of textarea elements
315
+ #
316
+ def text_areas_for(identifier)
317
+ find_watir_elements("textareas(identifier)", Elements::TextArea, identifier)
318
+ end
319
+
320
+ #
321
+ # platform method to get the currently selected value from a select list
322
+ # See PageObject::Accessors#select_list
323
+ #
324
+ def select_list_value_for(identifier)
325
+ options = find_watir_elements("select_list(identifier).selected_options",
326
+ Elements::SelectList, identifier)
327
+ return nil if options.empty?
328
+ options.first.text
329
+ end
330
+
331
+ #
332
+ # platform method to select a value from a select list
333
+ # See PageObject::Accessors#select_list
334
+ #
335
+ def select_list_value_set(identifier, value)
336
+ process_watir_call("select_list(identifier).select(value)", Elements::SelectList,
337
+ identifier, value)
338
+ end
339
+
340
+ #
341
+ # platform method to return the select list element
342
+ # See PageObject::Accessors#select_list
343
+ #
344
+ def select_list_for(identifier)
345
+ find_watir_element("select_list(identifier)", Elements::SelectList, identifier)
346
+ end
347
+
348
+ #
349
+ # platform method to retrieve an array of select_list elements
350
+ #
351
+ def select_lists_for(identifier)
352
+ find_watir_elements("select_lists(identifier)", Elements::SelectList, identifier)
353
+ end
354
+
355
+ #
356
+ # platform method to click a link
357
+ # See PageObject::Accessors#link
358
+ #
359
+ def click_link_for(identifier)
360
+ call = "link(identifier)"
361
+ process_watir_call("#{call}.click if identifier", Elements::Link, identifier)
362
+ end
363
+
364
+ #
365
+ # platform method to return a PageObject::Elements::Link object
366
+ # see PageObject::Accessors#link
367
+ #
368
+ def link_for(identifier)
369
+ call = "link(identifier)"
370
+ find_watir_element(call, Elements::Link, identifier)
371
+ end
372
+
373
+ #
374
+ # platform method to retrieve an array of link elements
375
+ #
376
+ def links_for(identifier)
377
+ call = "links(identifier)"
378
+ find_watir_elements(call, Elements::Link, identifier)
379
+ end
380
+
381
+ #
382
+ # platform method to check a checkbox
383
+ # See PageObject::Accessors#checkbox
384
+ #
385
+ def check_checkbox(identifier)
386
+ process_watir_call("checkbox(identifier).set", Elements::CheckBox, identifier)
387
+ end
388
+
389
+ #
390
+ # platform method to uncheck a checkbox
391
+ # See PageObject::Accessors#checkbox
392
+ #
393
+ def uncheck_checkbox(identifier)
394
+ process_watir_call("checkbox(identifier).clear", Elements::CheckBox, identifier)
395
+ end
396
+
397
+ #
398
+ # platform method to determine if a checkbox is checked
399
+ # See PageObject::Accessors#checkbox
400
+ #
401
+ def checkbox_checked?(identifier)
402
+ process_watir_call("checkbox(identifier).set?", Elements::CheckBox, identifier)
403
+ end
404
+
405
+ #
406
+ # platform method to return a PageObject::Elements::CheckBox element
407
+ # See PageObject::Accessors#checkbox
408
+ #
409
+ def checkbox_for(identifier)
410
+ find_watir_element("checkbox(identifier)", Elements::CheckBox, identifier)
411
+ end
412
+
413
+ #
414
+ # platform method to retrieve an array of checkbox elements
415
+ #
416
+ def checkboxs_for(identifier)
417
+ find_watir_elements("checkboxes(identifier)", Elements::CheckBox, identifier)
418
+ end
419
+
420
+ #
421
+ # platform method to select a radio button
422
+ # See PageObject::Accessors#radio_button
423
+ #
424
+ def select_radio(identifier)
425
+ process_watir_call("radio(identifier).set", Elements::RadioButton, identifier)
426
+ end
427
+
428
+ #
429
+ # platform method to determine if a radio button is selected
430
+ # See PageObject::Accessors#radio_button
431
+ #
432
+ def radio_selected?(identifier)
433
+ process_watir_call("radio(identifier).set?", Elements::RadioButton, identifier)
434
+ end
435
+
436
+ #
437
+ # platform method to return a PageObject::Eements::RadioButton element
438
+ # See PageObject::Accessors#radio_button
439
+ #
440
+ def radio_button_for(identifier)
441
+ find_watir_element("radio(identifier)", Elements::RadioButton, identifier)
442
+ end
443
+
444
+ #
445
+ # platform method to retrieve an array of radio button elements
446
+ #
447
+ def radio_buttons_for(identifier)
448
+ find_watir_elements("radios(identifier)", Elements::RadioButton, identifier)
449
+ end
450
+
451
+ #
452
+ # platform method to return the text for a div
453
+ # See PageObject::Accessors#div
454
+ #
455
+ def div_text_for(identifier)
456
+ process_watir_call("div(identifier).text", Elements::Div, identifier, nil, 'div')
457
+ end
458
+
459
+ #
460
+ # platform method to return a PageObject::Elements::Div element
461
+ # See PageObject::Accessors#div
462
+ #
463
+ def div_for(identifier)
464
+ find_watir_element("div(identifier)", Elements::Div, identifier, 'div')
465
+ end
466
+
467
+ #
468
+ # platform method to retrieve an array of div elements
469
+ #
470
+ def divs_for(identifier)
471
+ find_watir_elements("divs(identifier)", Elements::Div, identifier, 'div')
472
+ end
473
+
474
+ #
475
+ # platform method to return the text for a span
476
+ # See PageObject::Accessors#span
477
+ #
478
+ def span_text_for(identifier)
479
+ process_watir_call("span(identifier).text", Elements::Span, identifier, nil, 'span')
480
+ end
481
+
482
+ #
483
+ # platform method to return a PageObject::Elements::Span element
484
+ # See PageObject::Accessors#span
485
+ #
486
+ def span_for(identifier)
487
+ find_watir_element("span(identifier)", Elements::Span, identifier, 'span')
488
+ end
489
+
490
+ #
491
+ # platform method to retrieve an array of span elements
492
+ #
493
+ def spans_for(identifier)
494
+ find_watir_elements("spans(identifier)", Elements::Span, identifier, 'span')
495
+ end
496
+
497
+ #
498
+ # platform method to click a button
499
+ # See PageObject::Accessors#button
500
+ #
501
+ def click_button_for(identifier)
502
+ call = "button(identifier)"
503
+ process_watir_call("#{call}.click", Elements::Button, identifier)
504
+ end
505
+
506
+ #
507
+ # platform method to retrieve a button element
508
+ # See PageObject::Accessors#button
509
+ #
510
+ def button_for(identifier)
511
+ call = "button(identifier)"
512
+ find_watir_element(call, Elements::Button, identifier)
513
+ end
514
+
515
+ #
516
+ # platform method to retrieve an array of button elements
517
+ #
518
+ def buttons_for(identifier)
519
+ call = "buttons(identifier)"
520
+ find_watir_elements(call, Elements::Button, identifier)
521
+ end
522
+
523
+ #
524
+ # platform method to return the text for a table
525
+ # See PageObject::Accessors#table
526
+ #
527
+ def table_text_for(identifier)
528
+ process_watir_call("table(identifier).text", Elements::Table, identifier, nil, 'table')
529
+ end
530
+
531
+ #
532
+ # platform method to retrieve a table element
533
+ # See PageObject::Accessors#table
534
+ #
535
+ def table_for(identifier)
536
+ find_watir_element("table(identifier)", Elements::Table, identifier, 'table')
537
+ end
538
+
539
+ #
540
+ # platform method to retrieve an array of table elements
541
+ #
542
+ def tables_for(identifier)
543
+ find_watir_elements("tables(identifier)", Elements::Table, identifier, 'table')
544
+ end
545
+
546
+ #
547
+ # platform method to retrieve the text from a table cell
548
+ # See PageObject::Accessors#cell
549
+ #
550
+ def cell_text_for(identifier)
551
+ process_watir_call("td(identifier).text", Elements::TableCell, identifier,
552
+ nil, 'td')
553
+ end
554
+
555
+ #
556
+ # platform method to retrieve a table cell element
557
+ # See PageObject::Accessors#cell
558
+ #
559
+ def cell_for(identifier)
560
+ find_watir_element("td(identifier)", Elements::TableCell, identifier, 'td')
561
+ end
562
+
563
+ #
564
+ # platform method to retrieve an array of table cell elements
565
+ #
566
+ def cells_for(identifier)
567
+ find_watir_elements("tds(identifier)", Elements::TableCell, identifier, 'td')
568
+ end
569
+
570
+ #
571
+ # platform method to retrieve the text from a table row
572
+ # See PageObject::Accessors#row
573
+ #
574
+ def row_text_for(identifier)
575
+ process_watir_call("tr(identifier).text", Elements::TableRow, identifier,
576
+ nil, 'tr')
577
+ end
578
+
579
+ #
580
+ # platform method to retrieve a table row element
581
+ # See PageObject::Accessors#row
582
+ #
583
+ def row_for(identifier)
584
+ find_watir_element("tr(identifier)", Elements::TableRow, identifier, 'tr')
585
+ end
586
+
587
+ #
588
+ # platform method to retrieve an array of table row elements
589
+ #
590
+ def rows_for(identifier)
591
+ find_watir_elements("trs(identifier)", Elements::TableRow, identifier, 'tr')
592
+ end
593
+
594
+ #
595
+ # platform method to retrieve load status of an image element
596
+ # See PageObject::Accessors#image
597
+ #
598
+ def image_loaded_for(identifier)
599
+ process_watir_call("image(identifier).loaded?", Elements::Image, identifier)
600
+ end
601
+
602
+ #
603
+ # platform method to retrieve an image element
604
+ # See PageObject::Accessors#image
605
+ #
606
+ def image_for(identifier)
607
+ find_watir_element("image(identifier)", Elements::Image, identifier)
608
+ end
609
+
610
+ #
611
+ # platform method to retrieve an array of image elements
612
+ #
613
+ def images_for(identifier)
614
+ find_watir_elements("images(identifier)", Elements::Image, identifier)
615
+ end
616
+
617
+ #
618
+ # platform method to retrieve a form element
619
+ # See PageObject::Accessors#form
620
+ #
621
+ def form_for(identifier)
622
+ find_watir_element("form(identifier)", Elements::Form, identifier)
623
+ end
624
+
625
+ #
626
+ # platform method to retrieve an array of forms
627
+ #
628
+ def forms_for(identifier)
629
+ find_watir_elements("forms(identifier)", Elements::Form, identifier)
630
+ end
631
+
632
+ #
633
+ # platform method to retrieve the text from a list item
634
+ # See PageObject::Accessors#list_item
635
+ #
636
+ def list_item_text_for(identifier)
637
+ process_watir_call("li(identifier).text", Elements::ListItem, identifier, nil, 'li')
638
+ end
639
+
640
+ #
641
+ # platform method to retrieve a list item element
642
+ # See PageObject::Accessors#list_item
643
+ #
644
+ def list_item_for(identifier)
645
+ find_watir_element("li(identifier)", Elements::ListItem, identifier, 'li')
646
+ end
647
+
648
+ #
649
+ # platform method to retrieve an array of list items
650
+ #
651
+ def list_items_for(identifier)
652
+ find_watir_elements("lis(identifier)", Elements::ListItem, identifier, 'li')
653
+ end
654
+
655
+ #
656
+ # platform method to retrieve the text from an unordered list
657
+ # See PageObject::Accessors#unordered_list
658
+ #
659
+ def unordered_list_text_for(identifier)
660
+ process_watir_call("ul(identifier).text", Elements::UnorderedList, identifier, nil, 'ul')
661
+ end
662
+
663
+ #
664
+ # platform method to retrieve an unordered list element
665
+ # See PageObject::Accessors#unordered_list
666
+ #
667
+ def unordered_list_for(identifier)
668
+ find_watir_element("ul(identifier)", Elements::UnorderedList, identifier, 'ul')
669
+ end
670
+
671
+ #
672
+ # platform method to retrieve an array of unordered lists
673
+ #
674
+ def unordered_lists_for(identifier)
675
+ find_watir_elements("uls(identifier)", Elements::UnorderedList, identifier, 'ul')
676
+ end
677
+
678
+ #
679
+ # platform method to retrieve the text from an ordered list
680
+ # See PageObject::Accessors#ordered_list
681
+ #
682
+ def ordered_list_text_for(identifier)
683
+ process_watir_call("ol(identifier).text", Elements::OrderedList, identifier, nil, 'ol')
684
+ end
685
+
686
+ #
687
+ # platform method to retrieve an ordered list element
688
+ # See PageObject::Accessors#ordered_list
689
+ #
690
+ def ordered_list_for(identifier)
691
+ find_watir_element("ol(identifier)", Elements::OrderedList, identifier, 'ol')
692
+ end
693
+
694
+ #
695
+ # platform method to retrieve an array of ordered lists
696
+ #
697
+ def ordered_lists_for(identifier)
698
+ find_watir_elements("ols(identifier)", Elements::OrderedList, identifier, 'ol')
699
+ end
700
+
701
+ #
702
+ # platform method to retrieve the text for a h1
703
+ # See PageObject::Accessors#h1
704
+ #
705
+ def h1_text_for(identifier)
706
+ process_watir_call("h1(identifier).text", Elements::Heading, identifier, nil, 'h1')
707
+ end
708
+
709
+ #
710
+ # platform method to retrieve the h1 element
711
+ # See PageObject::Accessors#h1
712
+ #
713
+ def h1_for(identifier)
714
+ find_watir_element("h1(identifier)", Elements::Heading, identifier, 'h1')
715
+ end
716
+
717
+ #
718
+ # platform method to retrieve an array of h1s
719
+ #
720
+ def h1s_for(identifier)
721
+ find_watir_elements("h1s(identifier)", Elements::Heading, identifier, 'h1')
722
+ end
723
+
724
+ #
725
+ # platform method to retrieve the text for a h2
726
+ # See PageObject::Accessors#h2
727
+ #
728
+ def h2_text_for(identifier)
729
+ process_watir_call("h2(identifier).text", Elements::Heading, identifier, nil, 'h2')
730
+ end
731
+
732
+ #
733
+ # platform method to retrieve the h2 element
734
+ # See PageObject::Accessors#h2
735
+ #
736
+ def h2_for(identifier)
737
+ find_watir_element("h2(identifier)", Elements::Heading, identifier, 'h2')
738
+ end
739
+
740
+ #
741
+ # platform method to retrieve an array of h2s
742
+ #
743
+ def h2s_for(identifier)
744
+ find_watir_elements("h2s(identifier)", Elements::Heading, identifier, 'h2')
745
+ end
746
+
747
+ #
748
+ # platform method to retrieve the text for a h3
749
+ # See PageObject::Accessors#h3
750
+ #
751
+ def h3_text_for(identifier)
752
+ process_watir_call("h3(identifier).text", Elements::Heading, identifier, nil, 'h3')
753
+ end
754
+
755
+ #
756
+ # platform method to retrieve the h3 element
757
+ # See PageObject::Accessors#h3
758
+ #
759
+ def h3_for(identifier)
760
+ find_watir_element("h3(identifier)", Elements::Heading, identifier, 'h3')
761
+ end
762
+
763
+ #
764
+ # platform method to retrieve an array of h3s
765
+ #
766
+ def h3s_for(identifier)
767
+ find_watir_elements("h3s(identifier)", Elements::Heading, identifier, 'h3')
768
+ end
769
+
770
+ #
771
+ # platform method to retrieve the text for a h4
772
+ # See PageObject::Accessors#h4
773
+ #
774
+ def h4_text_for(identifier)
775
+ process_watir_call("h4(identifier).text", Elements::Heading, identifier, nil, 'h4')
776
+ end
777
+
778
+ #
779
+ # platform method to retrieve the h4 element
780
+ # See PageObject::Accessors#h4
781
+ #
782
+ def h4_for(identifier)
783
+ find_watir_element("h4(identifier)", Elements::Heading, identifier, 'h4')
784
+ end
785
+
786
+ #
787
+ # platform method to retrieve an array of h4s
788
+ #
789
+ def h4s_for(identifier)
790
+ find_watir_elements("h4s(identifier)", Elements::Heading, identifier, 'h4')
791
+ end
792
+
793
+ #
794
+ # platform method to retrieve the text for a h5
795
+ # See PageObject::Accessors#h5
796
+ #
797
+ def h5_text_for(identifier)
798
+ process_watir_call("h5(identifier).text", Elements::Heading, identifier, nil, 'h5')
799
+ end
800
+
801
+ #
802
+ # platform method to retrieve the h5 element
803
+ # See PageObject::Accessors#h5
804
+ #
805
+ def h5_for(identifier)
806
+ find_watir_element("h5(identifier)", Elements::Heading, identifier, 'h5')
807
+ end
808
+
809
+ #
810
+ # platform method to retrieve an array of h5s
811
+ #
812
+ def h5s_for(identifier)
813
+ find_watir_elements("h5s(identifier)", Elements::Heading, identifier, 'h5')
814
+ end
815
+
816
+ #
817
+ # platform method to retrieve the text for a h6
818
+ # See PageObject::Accessors#h6
819
+ #
820
+ def h6_text_for(identifier)
821
+ process_watir_call("h6(identifier).text", Elements::Heading, identifier, nil, 'h6')
822
+ end
823
+
824
+ #
825
+ # platform method to retrieve the h6 element
826
+ # See PageObject::Accessors#h6
827
+ #
828
+ def h6_for(identifier)
829
+ find_watir_element("h6(identifier)", Elements::Heading, identifier, 'h6')
830
+ end
831
+
832
+ #
833
+ # platform method to retrieve an array of h6s
834
+ #
835
+ def h6s_for(identifier)
836
+ find_watir_elements("h6s(identifier)", Elements::Heading, identifier, 'h6')
837
+ end
838
+
839
+ #
840
+ # platform method to retrieve the text for a paragraph
841
+ # See PageObject::Accessors#paragraph
842
+ #
843
+ def paragraph_text_for(identifier)
844
+ process_watir_call("p(identifier).text", Elements::Paragraph, identifier, nil, 'p')
845
+ end
846
+
847
+ #
848
+ # platform method to retrieve the paragraph element
849
+ # See PageObject::Accessors#paragraph
850
+ #
851
+ def paragraph_for(identifier)
852
+ find_watir_element("p(identifier)", Elements::Paragraph, identifier, 'p')
853
+ end
854
+
855
+ #
856
+ # platform method to retrieve an array of paragraph elements
857
+ #
858
+ def paragraphs_for(identifier)
859
+ find_watir_elements("ps(identifier)", Elements::Paragraph, identifier, 'p')
860
+ end
861
+
862
+ #
863
+ # platform method to return the text for a label
864
+ # See PageObject::Accessors#label
865
+ #
866
+ def label_text_for(identifier)
867
+ process_watir_call("label(identifier).text", Elements::Label, identifier, nil, 'label')
868
+ end
869
+
870
+ #
871
+ # platform method to return a PageObject::Elements::Label element
872
+ # See PageObject::Accessors#label
873
+ #
874
+ def label_for(identifier)
875
+ find_watir_element("label(identifier)", Elements::Label, identifier, 'label')
876
+ end
877
+
878
+ #
879
+ #
880
+ # platform method to retrieve an array of label elements
881
+ #
882
+ def labels_for(identifier)
883
+ find_watir_elements("labels(identifier)", Elements::Label, identifier, 'label')
884
+ end
885
+
886
+ #
887
+ # platform method to set the file on a file_field element
888
+ # See PageObject::Accessors#file_field
889
+ #
890
+ def file_field_value_set(identifier, value)
891
+ process_watir_call("file_field(identifier).set(value)", Elements::FileField,
892
+ identifier, value)
893
+ end
894
+
895
+ #
896
+ # platform method to retrieve a file_field element
897
+ # See PageObject::Accessors#file_field
898
+ #
899
+ def file_field_for(identifier)
900
+ find_watir_element("file_field(identifier)", Elements::FileField, identifier)
901
+ end
902
+
903
+ #
904
+ # platform method to retrieve an array of file field elements
905
+ #
906
+ def file_fields_for(identifier)
907
+ find_watir_elements("file_fields(identifier)", Elements::FileField, identifier)
908
+ end
909
+
910
+ #
911
+ # platform method to click on an area
912
+ #
913
+ def click_area_for(identifier)
914
+ process_watir_call("area(identifier).click", Elements::Area, identifier, nil, 'area')
915
+ end
916
+
917
+ #
918
+ # platform method to retrieve an area element
919
+ #
920
+ def area_for(identifier)
921
+ find_watir_element("area(identifier)", Elements::Area, identifier, 'area')
922
+ end
923
+
924
+ #
925
+ # platform method to retrieve an array of area elements
926
+ #
927
+ def areas_for(identifier)
928
+ find_watir_elements("areas(identifier)", Elements::Area, identifier, 'area')
929
+ end
930
+
931
+ #
932
+ # platform method to retrieve a canvas element
933
+ #
934
+ def canvas_for(identifier)
935
+ find_watir_element("canvas(identifier)", Elements::Canvas, identifier, 'canvas')
936
+ end
937
+
938
+ #
939
+ # platform method to retrieve an array of canvas elements
940
+ #
941
+ def canvass_for(identifier)
942
+ find_watir_elements("canvases(identifier)", Elements::Canvas, identifier, 'canvas')
943
+ end
944
+
945
+ #
946
+ # platform method to retrieve an audio element
947
+ #
948
+ def audio_for(identifier)
949
+ find_watir_element("audio(identifier)", Elements::Audio, identifier, 'audio')
950
+ end
951
+
952
+ #
953
+ # platform method to retrieve an array of audio elements
954
+ #
955
+ def audios_for(identifier)
956
+ find_watir_elements("audios(identifier)", Elements::Audio, identifier, 'audio')
957
+ end
958
+
959
+ #
960
+ # platform method to retrieve a video element
961
+ #
962
+ def video_for(identifier)
963
+ find_watir_element("video(identifier)", Elements::Video, identifier, 'video')
964
+ end
965
+
966
+ #
967
+ # platform method to retrieve an array of video elements
968
+ #
969
+ def videos_for(identifier)
970
+ find_watir_elements("videos(identifier)", Elements::Video, identifier, 'video')
971
+ end
972
+
973
+ #
974
+ # platform method to return a PageObject::Elements::Element element
975
+ # See PageObject::Accessors#element
976
+ #
977
+ def element_for(tag, identifier)
978
+ find_watir_element("#{tag.to_s}(identifier)", Elements::Element, identifier, tag.to_s)
979
+ end
980
+
981
+ #
982
+ # platform method to return an array of PageObject::Elements::Element elements
983
+ # See PageObject::Accessors#element
984
+ #
985
+ def elements_for(tag, identifier)
986
+ find_watir_elements("#{tag.to_s}s(identifier)", Elements::Element, identifier, tag.to_s)
987
+ end
988
+
989
+ #
990
+ # platform method to return a PageObject rooted at an element
991
+ # See PageObject::Accessors#page_section
992
+ #
993
+ def page_for(identifier, page_class)
994
+ find_watir_page(identifier, page_class)
995
+ end
996
+
997
+ #
998
+ # platform method to return a collection of PageObjects rooted at elements
999
+ # See PageObject::Accessors#page_sections
1000
+ #
1001
+ def pages_for(identifier, page_class)
1002
+ SectionCollection[*find_watir_pages(identifier, page_class)]
1003
+ end
1004
+
1005
+ #
1006
+ # platform method to return a svg element
1007
+ #
1008
+ def svg_for(identifier)
1009
+ find_watir_element("element(identifier)", Elements::Element, identifier)
1010
+ end
1011
+
1012
+ #
1013
+ # platform method to return an array of svg elements
1014
+ #
1015
+ def svgs_for(identifier)
1016
+ find_watir_elements("element(identifier)", Elements::Element, identifier)
1017
+ end
1018
+
1019
+ #
1020
+ # platform method to retrieve the text for a b
1021
+ # See PageObject::Accessors#b
1022
+ #
1023
+ def b_text_for(identifier)
1024
+ process_watir_call("b(identifier).text", Elements::Bold, identifier, nil, 'b')
1025
+ end
1026
+
1027
+ #
1028
+ # platform method to retrieve the b element
1029
+ # See PageObject::Accessors#b
1030
+ #
1031
+ def b_for(identifier)
1032
+ find_watir_element("b(identifier)", Elements::Bold, identifier, 'b')
1033
+ end
1034
+
1035
+ #
1036
+ # platform method to retrieve an array of bs
1037
+ #
1038
+ def bs_for(identifier)
1039
+ find_watir_elements("bs(identifier)", Elements::Bold, identifier, 'b')
1040
+ end
1041
+
1042
+ #
1043
+ # platform method to retrieve the text for a i
1044
+ # See PageObject::Accessors#i
1045
+ #
1046
+ def i_text_for(identifier)
1047
+ process_watir_call("i(identifier).text", Elements::Italic, identifier, nil, 'i')
1048
+ end
1049
+
1050
+ #
1051
+ # platform method to retrieve the i element
1052
+ # See PageObject::Accessors#i
1053
+ #
1054
+ def i_for(identifier)
1055
+ find_watir_element("i(identifier)", Elements::Italic, identifier, 'i')
1056
+ end
1057
+
1058
+ #
1059
+ # platform method to retrieve an array of is
1060
+ #
1061
+ def is_for(identifier)
1062
+ find_watir_elements("is(identifier)", Elements::Italic, identifier, 'i')
1063
+ end
1064
+
1065
+ private
1066
+
1067
+ def find_watir_elements(the_call, type, identifier, tag_name=nil)
1068
+ identifier, frame_identifiers = parse_identifiers(identifier, type, tag_name)
1069
+ elements = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}"
1070
+ switch_to_default_content(frame_identifiers)
1071
+ elements.map { |element| type.new(element) }
1072
+ end
1073
+
1074
+ def find_watir_element(the_call, type, identifier, tag_name=nil)
1075
+ identifier, frame_identifiers = parse_identifiers(identifier, type, tag_name)
1076
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}"
1077
+ switch_to_default_content(frame_identifiers)
1078
+ type.new(element)
1079
+ end
1080
+
1081
+ def find_watir_pages(identifier, page_class)
1082
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Element, 'element')
1083
+ elements = @browser.instance_eval "#{nested_frames(frame_identifiers)}elements(identifier)"
1084
+ switch_to_default_content(frame_identifiers)
1085
+ elements.map { |element| page_class.new(element) }
1086
+ end
1087
+
1088
+ def find_watir_page(identifier, page_class)
1089
+ identifier, frame_identifiers = parse_identifiers(identifier, Elements::Element, 'element')
1090
+ element = @browser.instance_eval "#{nested_frames(frame_identifiers)}element(identifier)"
1091
+ switch_to_default_content(frame_identifiers)
1092
+ page_class.new(element)
1093
+ end
1094
+
1095
+ def process_watir_call(the_call, type, identifier, value=nil, tag_name=nil)
1096
+ identifier, frame_identifiers = parse_identifiers(identifier, type, tag_name)
1097
+ value = @browser.instance_eval "#{nested_frames(frame_identifiers)}#{the_call}"
1098
+ switch_to_default_content(frame_identifiers)
1099
+ value
1100
+ end
1101
+
1102
+ def parse_identifiers(identifier, element, tag_name=nil)
1103
+ new_identifiers = identifier.dup
1104
+ frame_identifiers = new_identifiers.delete(:frame)
1105
+ return new_identifiers, frame_identifiers
1106
+ end
1107
+
1108
+ def nested_frames(frame_identifiers)
1109
+ return if frame_identifiers.nil?
1110
+ frame_str = ''
1111
+ frame_identifiers.each do |frame|
1112
+ type = frame.keys.first
1113
+ identifier = frame.values.first.map do |key, value|
1114
+ if value.is_a?(Regexp)
1115
+ ":#{key} => #{value.inspect}"
1116
+ elsif value.is_a?(Integer) || value.is_a?(TrueClass) || value.is_a?(FalseClass)
1117
+ ":#{key} => #{value}"
1118
+ else
1119
+ ":#{key} => '#{value}'"
1120
+ end
1121
+ end.join(', ')
1122
+ frame_str += "#{type.to_s}(#{identifier})."
1123
+ end
1124
+ frame_str
1125
+ end
1126
+
1127
+ def switch_to_default_content(frame_identifiers)
1128
+ @browser.browser.wd.switch_to.default_content unless frame_identifiers.nil?
1129
+ end
1130
+
1131
+ def switch_to_frame(frame_identifiers)
1132
+ unless frame_identifiers.nil?
1133
+ frame_identifiers.each do |frame|
1134
+ frame_id = frame.values.first
1135
+ value = frame_id.values.first
1136
+ @browser.wd.switch_to.frame(value)
1137
+ end
1138
+ end
1139
+ end
1140
+
1141
+ def self.define_widget_multiple_accessor(base_element_tag, widget_class, widget_tag)
1142
+ send(:define_method, "#{widget_tag}s_for") do |identifier|
1143
+ find_watir_elements("#{base_element_tag}s(identifier)", widget_class, identifier, base_element_tag)
1144
+ end
1145
+ end
1146
+
1147
+ def self.define_widget_singular_accessor(base_element_tag, widget_class, widget_tag)
1148
+ send(:define_method, "#{widget_tag}_for") do |identifier|
1149
+ find_watir_element("#{base_element_tag}(identifier)", widget_class, identifier, base_element_tag)
1150
+ end
1151
+ end
1152
+ end
1153
+ end
1154
+ end
1155
+ end