page-object 0.7.6 → 0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +37 -0
- data/features/element.feature +2 -1
- data/features/gxt_table_extension.feature +24 -0
- data/features/multi_elements.feature +182 -0
- data/features/ordered_list.feature +5 -0
- data/features/step_definitions/element_steps.rb +7 -2
- data/features/step_definitions/gxt_table_steps.rb +40 -0
- data/features/step_definitions/multi_elements_steps.rb +111 -0
- data/features/step_definitions/ordered_list_steps.rb +4 -0
- data/features/step_definitions/table_steps.rb +4 -0
- data/features/step_definitions/unordered_list_steps.rb +5 -1
- data/features/table.feature +4 -0
- data/features/unordered_list.feature +5 -0
- data/lib/page-object.rb +16 -11
- data/lib/page-object/accessors.rb +71 -6
- data/lib/page-object/platforms/selenium_webdriver/element.rb +10 -0
- data/lib/page-object/platforms/selenium_webdriver/page_object.rb +30 -0
- data/lib/page-object/platforms/watir_webdriver/element.rb +9 -0
- data/lib/page-object/platforms/watir_webdriver/page_object.rb +24 -0
- data/lib/page-object/version.rb +1 -1
- data/lib/page-object/widgets.rb +120 -0
- data/page-object.gemspec +2 -2
- data/spec/page-object/widget_spec.rb +194 -0
- metadata +15 -8
data/ChangeLog
CHANGED
@@ -1,3 +1,40 @@
|
|
1
|
+
=== Version 0.8 / 2012-12-22
|
2
|
+
* Enhancements
|
3
|
+
* Added the following class level methods to return all elements matching the locator
|
4
|
+
* divs
|
5
|
+
* buttons
|
6
|
+
* text_fields
|
7
|
+
* hidden_fields
|
8
|
+
* text_areas
|
9
|
+
* select_lists
|
10
|
+
* links
|
11
|
+
* checkboxes
|
12
|
+
* radio_buttons
|
13
|
+
* spans
|
14
|
+
* tables
|
15
|
+
* cells
|
16
|
+
* images
|
17
|
+
* forms
|
18
|
+
* list_items
|
19
|
+
* unordered_lists
|
20
|
+
* ordered_lists
|
21
|
+
* h1s
|
22
|
+
* h2s
|
23
|
+
* h3s
|
24
|
+
* h4s
|
25
|
+
* h5s
|
26
|
+
* h6s
|
27
|
+
* paragraphs
|
28
|
+
* labels
|
29
|
+
* file_fields
|
30
|
+
* Added ability to register and use custom elements based on standard elements (William Powell)
|
31
|
+
* Added generated method to return text for a table
|
32
|
+
* Added generated method to return text for an unordered list
|
33
|
+
* Added generated method to return text for an ordered list
|
34
|
+
* Added html method to Element
|
35
|
+
* Updated to use the latest selenium-webdriver 2.27.2
|
36
|
+
* Updated to use the latest watir-webdriver 0.6.2
|
37
|
+
|
1
38
|
=== Version 0.7.6 / 2012-11-28
|
2
39
|
* Fixes
|
3
40
|
* Fixed attach_to_window workes with partial url on Selenium (George Shakhnazaryan)
|
data/features/element.feature
CHANGED
@@ -26,6 +26,7 @@ Feature: Elements
|
|
26
26
|
Then I should know it exists
|
27
27
|
And I should know it is visible
|
28
28
|
And I should know the text is "Google Search"
|
29
|
+
And I should know the html is "<a href="success.html" id="link_id" name="link_name" class="link_class" title="link_title">Google Search</a>"
|
29
30
|
And I should know it is equal to itself
|
30
31
|
And I should know the tag name is "a"
|
31
32
|
And I should know the attribute "readonly" is false
|
@@ -289,4 +290,4 @@ Feature: Elements
|
|
289
290
|
Scenario: Double Clicking
|
290
291
|
Given I am on the Double Click page
|
291
292
|
When I double click the button
|
292
|
-
Then the paragraph should read "Double Click Received"
|
293
|
+
Then the paragraph should read "Double Click Received"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: Gxt Table Extension
|
2
|
+
As a Quality Engineer working on a Gxt or Gwt project
|
3
|
+
In order to easily create test widgets to interact with application widgets
|
4
|
+
I need to define, register and use widgets as if they were normal elements
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I have defined a GxtTable class extending Table
|
8
|
+
And I have registered the GxtTable with PageObject
|
9
|
+
And I define a page-object using that widget
|
10
|
+
And I am on the Gxt Examples page
|
11
|
+
And I have the Basic Grid opened
|
12
|
+
|
13
|
+
Scenario: Retrieve a GxtTable
|
14
|
+
When I retrieve a GxtTable widget
|
15
|
+
Then I should know it is visible
|
16
|
+
|
17
|
+
@watir_only
|
18
|
+
Scenario: Determine if a GxtTable exists
|
19
|
+
When I retrieve a GxtTable widget
|
20
|
+
Then I should know it exists
|
21
|
+
|
22
|
+
Scenario: Confirm a correct row count from a GxtTable
|
23
|
+
When I retrieve a GxtTable widget
|
24
|
+
And the GxtTable should have "13" rows
|
@@ -288,3 +288,185 @@ Feature: Multi Elements
|
|
288
288
|
Scenario: Selecting file fields using no identifier
|
289
289
|
When I select the file fields using no identifier
|
290
290
|
Then I should have 3 file fields
|
291
|
+
|
292
|
+
Scenario: Selecting all divs based on a class declaration
|
293
|
+
When I select the divs using the generated method
|
294
|
+
Then I should have 3 divs
|
295
|
+
And the text of div 1 should be "Div 1"
|
296
|
+
And the text of div 2 should be "Div 2"
|
297
|
+
And the text of div 3 should be "Div 3"
|
298
|
+
|
299
|
+
Scenario: Selecting buttons based on a class declaration
|
300
|
+
When I select the buttons using the generated method
|
301
|
+
Then I should have 3 buttons
|
302
|
+
And the value of button 1 should be "Button 1"
|
303
|
+
And the value of button 2 should be "Button 2"
|
304
|
+
And the value of button 3 should be "Button 3"
|
305
|
+
|
306
|
+
Scenario: Selecting text fields based on a class declaration
|
307
|
+
When I select the text fields using the generated method
|
308
|
+
Then I should have 3 text fields
|
309
|
+
And the value of text field 1 should be "text 1"
|
310
|
+
And the value of text field 2 should be "text 2"
|
311
|
+
And the value of text field 3 should be "text 3"
|
312
|
+
|
313
|
+
Scenario: Selecting hidden fields based on a class declaration
|
314
|
+
When I select the hidden fields using the generated method
|
315
|
+
Then I should have 3 hidden fields
|
316
|
+
And the value of hidden field 1 should be "hidden 1"
|
317
|
+
And the value of hidden field 2 should be "hidden 2"
|
318
|
+
And the value of hidden field 3 should be "hidden 3"
|
319
|
+
|
320
|
+
Scenario: Selecting text areas based on a class declaration
|
321
|
+
When I select the text areas using the generated method
|
322
|
+
Then I should have 3 text areas
|
323
|
+
And the value of text area 1 should be "textarea 1"
|
324
|
+
And the value of text area 2 should be "textarea 2"
|
325
|
+
And the value of text area 3 should be "textarea 3"
|
326
|
+
|
327
|
+
Scenario: Selecting select lists based on a class declaration
|
328
|
+
When I select the select lists using the generated method
|
329
|
+
Then I should have 3 select lists
|
330
|
+
And the value of select list 1 should be "selectlist 1"
|
331
|
+
And the value of select list 2 should be "selectlist 2"
|
332
|
+
And the value of select list 3 should be "selectlist 3"
|
333
|
+
|
334
|
+
Scenario: Selecting links based on a class declaration
|
335
|
+
When I select the link using the generated method
|
336
|
+
Then I should have 3 links
|
337
|
+
And the text of link 1 should be "link 1"
|
338
|
+
And the text of link 2 should be "link 2"
|
339
|
+
And the text of link 3 should be "link 3"
|
340
|
+
|
341
|
+
Scenario: Selecting checkboxes based on a class declaration
|
342
|
+
When I select the check boxes using the generated method
|
343
|
+
Then I should have 3 checkboxes
|
344
|
+
And the value of checkbox 1 should be "checkbox 1"
|
345
|
+
And the value of checkbox 2 should be "checkbox 2"
|
346
|
+
And the value of checkbox 3 should be "checkbox 3"
|
347
|
+
|
348
|
+
Scenario: Selecting radio buttons based on a class declaration
|
349
|
+
When I select the radio button using the generated method
|
350
|
+
Then I should have 3 radio buttons
|
351
|
+
And the value of radio button 1 should be "radio 1"
|
352
|
+
And the value of radio button 2 should be "radio 2"
|
353
|
+
And the value of radio button 3 should be "radio 3"
|
354
|
+
|
355
|
+
Scenario: Selecting spans based on a class declaration
|
356
|
+
When I select the spans using the generated method
|
357
|
+
Then I should have 3 spans
|
358
|
+
And the text of span 1 should be "Span 1"
|
359
|
+
And the text of span 2 should be "Span 2"
|
360
|
+
And the text of span 3 should be "Span 3"
|
361
|
+
|
362
|
+
Scenario: Selecting tables based on a class declaration
|
363
|
+
When I select the tables using the generated method
|
364
|
+
Then I should have 3 tables
|
365
|
+
And the first row first column for table 1 should have "Data 1"
|
366
|
+
And the first row first column for table 2 should have "Data 4"
|
367
|
+
And the first row first column for table 3 should have "Data 7"
|
368
|
+
|
369
|
+
Scenario: Selecting cells based on a class declaration
|
370
|
+
When I select the cells using the generated method
|
371
|
+
Then I should have 3 cells
|
372
|
+
And the text for cell 1 should be "Data 1"
|
373
|
+
And the text for cell 2 should be "Data 2"
|
374
|
+
And the text for cell 3 should be "Data 3"
|
375
|
+
|
376
|
+
Scenario: Selecting images based on a class declaration
|
377
|
+
When I select the images using the generated method
|
378
|
+
Then I should have 3 images
|
379
|
+
And the alt for image 1 should be "image 1"
|
380
|
+
And the alt for image 2 should be "image 2"
|
381
|
+
And the alt for image 3 should be "image 3"
|
382
|
+
|
383
|
+
Scenario: Selecting forms based on a class declaration
|
384
|
+
When I select the forms using the generated method
|
385
|
+
Then I should have 3 forms
|
386
|
+
And the action for form 1 should be "form1"
|
387
|
+
And the action for form 2 should be "form2"
|
388
|
+
And the action for form 3 should be "form3"
|
389
|
+
|
390
|
+
Scenario: Selecting list items based on a class declaration
|
391
|
+
When I select the list items using the generated method
|
392
|
+
Then I should have 3 list items
|
393
|
+
And the text for list item 1 should be "Item One"
|
394
|
+
And the text for list item 2 should be "Item Two"
|
395
|
+
And the text for list item 3 should be "Item Three"
|
396
|
+
|
397
|
+
Scenario: Selecting unordered lists based on a class declaration
|
398
|
+
When I select the unordered list using the generated method
|
399
|
+
Then I should have 3 unordered lists
|
400
|
+
And the text for the first item in unordered list 1 should be "Item One"
|
401
|
+
And the text for the first item in unordered list 2 should be "Item Four"
|
402
|
+
And the text for the first item in unordered list 3 should be "Item Five"
|
403
|
+
|
404
|
+
Scenario: Selecting ordered lists based on a class declaration
|
405
|
+
When I select the ordered lists using the generated method
|
406
|
+
Then I should have 3 ordered lists
|
407
|
+
And the text for the first item in ordered list 1 should be "Number One"
|
408
|
+
And the text for the first item in ordered list 2 should be "Number Two"
|
409
|
+
And the text for the first item in ordered list 3 should be "Number Three"
|
410
|
+
|
411
|
+
Scenario: Selecting h1s based on a class declaration
|
412
|
+
When I select the h1s using the generated method
|
413
|
+
Then I should have 3 h1s
|
414
|
+
And the text for h1 1 should be "H1 One"
|
415
|
+
And the text for h1 2 should be "H1 Two"
|
416
|
+
And the text for h1 3 should be "H1 Three"
|
417
|
+
|
418
|
+
Scenario: Selecting h2s based on a class declaration
|
419
|
+
When I select the h2s using the generated method
|
420
|
+
Then I should have 3 h2s
|
421
|
+
And the text for h2 1 should be "H2 One"
|
422
|
+
And the text for h2 2 should be "H2 Two"
|
423
|
+
And the text for h2 3 should be "H2 Three"
|
424
|
+
|
425
|
+
Scenario: Selecting h3s based on a class declaration
|
426
|
+
When I select the h3s using the generated method
|
427
|
+
Then I should have 3 h3s
|
428
|
+
And the text for h3 1 should be "H3 One"
|
429
|
+
And the text for h3 2 should be "H3 Two"
|
430
|
+
And the text for h3 3 should be "H3 Three"
|
431
|
+
|
432
|
+
Scenario: Selecting h4s based on a class declaration
|
433
|
+
When I select the h4s using the generated method
|
434
|
+
Then I should have 3 h4s
|
435
|
+
And the text for H4 1 should be "H4 One"
|
436
|
+
And the text for H4 2 should be "H4 Two"
|
437
|
+
And the text for H4 3 should be "H4 Three"
|
438
|
+
|
439
|
+
Scenario: Selecting h5s based on a class declaration
|
440
|
+
When I select the h5s using the generated method
|
441
|
+
Then I should have 3 h5s
|
442
|
+
And the text for H5 1 should be "H5 One"
|
443
|
+
And the text for H5 2 should be "H5 Two"
|
444
|
+
And the text for H5 3 should be "H5 Three"
|
445
|
+
|
446
|
+
Scenario: Selecting h6s based on a class declaration
|
447
|
+
When I select the h6s using the generated method
|
448
|
+
Then I should have 3 h6s
|
449
|
+
And the text for H6 1 should be "H6 One"
|
450
|
+
And the text for H6 2 should be "H6 Two"
|
451
|
+
And the text for H6 3 should be "H6 Three"
|
452
|
+
|
453
|
+
Scenario: Selecting paragraphs based on a class declaration
|
454
|
+
When I select the paragraph using the generated method
|
455
|
+
Then I should have 3 paragraphs
|
456
|
+
And the text for paragraph 1 should be "Paragraph One"
|
457
|
+
And the text for paragraph 2 should be "Paragraph Two"
|
458
|
+
And the text for paragraph 3 should be "Paragraph Three"
|
459
|
+
|
460
|
+
Scenario: Selecting labels based on a class declaration
|
461
|
+
When I select the labels using the generated method
|
462
|
+
Then I should have 3 labels
|
463
|
+
And the text for label 1 should be "Label 1"
|
464
|
+
And the text for label 2 should be "Label 2"
|
465
|
+
And the text for label 3 should be "Label 3"
|
466
|
+
|
467
|
+
Scenario: Selecting file fields based on a class declaration
|
468
|
+
When I select the file fields using the generated method
|
469
|
+
Then I should have 3 file fields
|
470
|
+
And the title for file field 1 should be "File Field 1"
|
471
|
+
And the title for file field 2 should be "File Field 2"
|
472
|
+
And the title for file field 3 should be "File Field 3"
|
@@ -49,3 +49,8 @@ Feature: Ordered list
|
|
49
49
|
Then I should see that the ordered list exists
|
50
50
|
When I get the first item from the list
|
51
51
|
Then the list items text should be "Number One"
|
52
|
+
|
53
|
+
Scenario: Getting the test for an ordered list
|
54
|
+
Then the text for the ordered list should contain "Number One"
|
55
|
+
And the text for the ordered list should contain "Number Two"
|
56
|
+
And the text for the ordered list should contain "Number Three"
|
@@ -78,6 +78,10 @@ Then /^I should know the text is "(.*)"$/ do |text|
|
|
78
78
|
@element.text.should == text
|
79
79
|
end
|
80
80
|
|
81
|
+
Then /^I should know the html is "(.*)"$/ do |html|
|
82
|
+
@element.html.should == html
|
83
|
+
end
|
84
|
+
|
81
85
|
Then /^I should know the text includes "(.*)"$/ do |text|
|
82
86
|
@element.text.should include text
|
83
87
|
end
|
@@ -228,6 +232,7 @@ When /^I double click the button$/ do
|
|
228
232
|
@page.click_element.double_click
|
229
233
|
end
|
230
234
|
|
231
|
-
Then /^the paragraph should read "([
|
235
|
+
Then /^the paragraph should read "([^\"]*)"$/ do |expected_text|
|
232
236
|
@page.text.should == expected_text
|
233
|
-
end
|
237
|
+
end
|
238
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
Given /^I am on the Gxt Examples page$/ do
|
2
|
+
@page = GxtSamplePageObject.new(@browser)
|
3
|
+
@page.navigate_to "http://gxtexamplegallery.appspot.com/"
|
4
|
+
end
|
5
|
+
|
6
|
+
When /^I have the Basic Grid opened$/ do
|
7
|
+
@page.basic_grid_element.click
|
8
|
+
end
|
9
|
+
|
10
|
+
When /^I have defined a GxtTable class extending Table$/ do
|
11
|
+
class GxtTable < PageObject::Elements::Table
|
12
|
+
|
13
|
+
protected
|
14
|
+
def child_xpath
|
15
|
+
".//descendant::tr"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
When /^I have registered the GxtTable with PageObject$/ do
|
21
|
+
PageObject.register_widget :gxt_table, GxtTable, 'div'
|
22
|
+
end
|
23
|
+
|
24
|
+
When /^I retrieve a GxtTable widget$/ do
|
25
|
+
@element = @page.gxt_table_element
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
When /^the GxtTable should have "(\d+)" rows$/ do |rows|
|
30
|
+
@element.rows.should == rows.to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
When /^I define a page-object using that widget$/ do
|
34
|
+
class GxtSamplePageObject
|
35
|
+
include PageObject
|
36
|
+
|
37
|
+
div(:basic_grid, :class => "label_basic_grid")
|
38
|
+
gxt_table(:gxt_table, :class => "x-grid3")
|
39
|
+
end
|
40
|
+
end
|
@@ -1,5 +1,32 @@
|
|
1
1
|
class MultiElementsPage
|
2
2
|
include PageObject
|
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')
|
3
30
|
end
|
4
31
|
|
5
32
|
|
@@ -403,3 +430,87 @@ end
|
|
403
430
|
When /^I select the file fields using no identifier$/ do
|
404
431
|
@elements = @page.file_field_elements
|
405
432
|
end
|
433
|
+
|
434
|
+
When /^I select the divs using the generated method$/ do
|
435
|
+
@elements = @page.the_divs_elements
|
436
|
+
end
|
437
|
+
|
438
|
+
When /^I select the buttons using the generated method$/ do
|
439
|
+
@elements = @page.the_buttons_elements
|
440
|
+
end
|
441
|
+
|
442
|
+
When /^I select the text fields using the generated method$/ do
|
443
|
+
@elements = @page.the_text_fields_elements
|
444
|
+
end
|
445
|
+
|
446
|
+
When /^I select the hidden fields using the generated method$/ do
|
447
|
+
@elements = @page.the_hidden_fields_elements
|
448
|
+
end
|
449
|
+
|
450
|
+
When /^I select the text areas using the generated method$/ do
|
451
|
+
@elements = @page.the_text_areas_elements
|
452
|
+
end
|
453
|
+
|
454
|
+
When /^I select the select lists using the generated method$/ do
|
455
|
+
@elements = @page.the_select_lists_elements
|
456
|
+
end
|
457
|
+
|
458
|
+
When /^I select the link using the generated method$/ do
|
459
|
+
@elements = @page.the_links_elements
|
460
|
+
end
|
461
|
+
|
462
|
+
When /^I select the check boxes using the generated method$/ do
|
463
|
+
@elements = @page.the_checkboxes_elements
|
464
|
+
end
|
465
|
+
|
466
|
+
When /^I select the radio button using the generated method$/ do
|
467
|
+
@elements = @page.the_radio_buttons_elements
|
468
|
+
end
|
469
|
+
|
470
|
+
When /^I select the spans using the generated method$/ do
|
471
|
+
@elements = @page.the_spans_elements
|
472
|
+
end
|
473
|
+
|
474
|
+
When /^I select the tables using the generated method$/ do
|
475
|
+
@elements = @page.the_tables_elements
|
476
|
+
end
|
477
|
+
|
478
|
+
When /^I select the cells using the generated method$/ do
|
479
|
+
@elements = @page.the_cells_elements
|
480
|
+
end
|
481
|
+
|
482
|
+
When /^I select the images using the generated method$/ do
|
483
|
+
@elements = @page.the_images_elements
|
484
|
+
end
|
485
|
+
|
486
|
+
When /^I select the forms using the generated method$/ do
|
487
|
+
@elements = @page.the_forms_elements
|
488
|
+
end
|
489
|
+
|
490
|
+
When /^I select the list items using the generated method$/ do
|
491
|
+
@elements = @page.the_list_items_elements
|
492
|
+
end
|
493
|
+
|
494
|
+
When /^I select the unordered list using the generated method$/ do
|
495
|
+
@elements = @page.the_unordered_lists_elements
|
496
|
+
end
|
497
|
+
|
498
|
+
When /^I select the ordered lists using the generated method$/ do
|
499
|
+
@elements = @page.the_ordered_lists_elements
|
500
|
+
end
|
501
|
+
|
502
|
+
When /^I select the h(\d+)s using the generated method$/ do |num|
|
503
|
+
@elements = @page.send "the_h#{num.to_i}s_elements"
|
504
|
+
end
|
505
|
+
|
506
|
+
When /^I select the paragraph using the generated method$/ do
|
507
|
+
@elements = @page.the_paragraphs_elements
|
508
|
+
end
|
509
|
+
|
510
|
+
When /^I select the labels using the generated method$/ do
|
511
|
+
@elements = @page.the_labels_elements
|
512
|
+
end
|
513
|
+
|
514
|
+
When /^I select the file fields using the generated method$/ do
|
515
|
+
@elements = @page.the_file_fields_elements
|
516
|
+
end
|