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.
- checksums.yaml +4 -4
- data/ChangeLog +68 -1
- data/Gemfile +1 -0
- data/cucumber.yml +1 -1
- data/features/audio.feature +33 -33
- data/features/element.feature +5 -0
- data/features/{sample-app/public → html}/04-Death_Becomes_Fur.mp4 +0 -0
- data/features/{sample-app/public → html}/04-Death_Becomes_Fur.oga +0 -0
- data/features/html/static_elements.html +2 -0
- data/features/multi_elements.feature +189 -0
- data/features/sample-app/sample_app.rb +5 -1
- data/features/step_definations/element_steps.rb +8 -0
- data/features/step_definations/form_steps.rb +2 -2
- data/features/step_definations/javasript_steps.rb +8 -2
- data/features/step_definations/multi_elements_steps.rb +118 -0
- data/features/support/persistent_browser.rb +44 -2
- data/features/support/targets/firefox14_osx.rb +5 -0
- data/features/support/targets/firefox14_windows7.rb +5 -0
- data/features/support/url_helper.rb +3 -1
- data/features/video.feature +51 -51
- data/lib/druid/accessors.rb +160 -287
- data/lib/druid/assist.rb +2 -2
- data/lib/druid/element_locators.rb +9 -1032
- data/lib/druid/elements/element.rb +7 -0
- data/lib/druid/locator_generator.rb +73 -0
- data/lib/druid/nested_elements.rb +50 -233
- data/lib/druid/page_factory.rb +7 -4
- data/lib/druid/version.rb +1 -1
- data/spec/druid/accessors_spec.rb +13 -2
- data/spec/druid/element_locators_spec.rb +5 -5
- data/spec/druid/elements/element_spec.rb +6 -0
- data/spec/druid/page_factory_spec.rb +10 -1
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fea63e0e39bb671b5e23a9be17e0b7e4f5dd947
|
4
|
+
data.tar.gz: 774a427a1de59e651cf3e04fe3beb74e75e2d33b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0cbcc12bd07002c104cd2917143d965c2d5a83d879f968afe4a787de343be843a962802985c0ed65b4f3ecf16776734dd3eaa70f3fa98a498dacddaeecdf90e
|
7
|
+
data.tar.gz: 14fc2d10172626f055c285414c4100d81199378bb1eab28af47779ff3aa03f6d10d648b315d252d309d04a40e8c7b63a0f65be1bdd02291e5a4ab41c3b78e957
|
data/ChangeLog
CHANGED
@@ -1,10 +1,77 @@
|
|
1
|
-
=== 2017-01-
|
1
|
+
=== Version-1.1.7/2017-01-16
|
2
|
+
* Enhancements
|
3
|
+
* Updated expected_element to use the global default element wait by default
|
4
|
+
* Added scroll_into_view method to Element
|
5
|
+
* Updated routes to accept more than two entries in the array which are passed as arguments
|
6
|
+
* Added *_element and *_elements methods to Druid and Element for the following types
|
7
|
+
* addr
|
8
|
+
* address
|
9
|
+
* article
|
10
|
+
* aside
|
11
|
+
* bdi
|
12
|
+
* bdo
|
13
|
+
* cite
|
14
|
+
* code
|
15
|
+
* dd
|
16
|
+
* dfn
|
17
|
+
* dt
|
18
|
+
* em
|
19
|
+
* figcaption
|
20
|
+
* figure
|
21
|
+
* footer
|
22
|
+
* header
|
23
|
+
* hgroup
|
24
|
+
* kbd
|
25
|
+
* mark
|
26
|
+
* nav
|
27
|
+
* noscript
|
28
|
+
* rp
|
29
|
+
* rt
|
30
|
+
* ruby
|
31
|
+
* samp
|
32
|
+
* section
|
33
|
+
* sub
|
34
|
+
* summary
|
35
|
+
* sup
|
36
|
+
* var
|
37
|
+
* wbr
|
38
|
+
=== 2017-01-15
|
39
|
+
* Fixes
|
40
|
+
* Fixed issue when calling new multi-element class methods using a block
|
41
|
+
=== Version 1.1.6/2017-01-13
|
2
42
|
* Enhancement
|
3
43
|
* Added callback to initialize_accessors method during initialization
|
4
44
|
* Added html method to Element
|
5
45
|
* Added generated method to return text for a table
|
6
46
|
* Added generated method to return text for an unordered list
|
7
47
|
* Added generated method to return text for an ordered list
|
48
|
+
* Added the following class level methods to return all elements matching the locator
|
49
|
+
* divs
|
50
|
+
* buttons
|
51
|
+
* text_fields
|
52
|
+
* hidden_fields
|
53
|
+
* text_areas
|
54
|
+
* select_lists
|
55
|
+
* links
|
56
|
+
* checkboxes
|
57
|
+
* radio_buttons
|
58
|
+
* spans
|
59
|
+
* tables
|
60
|
+
* cells
|
61
|
+
* images
|
62
|
+
* forms
|
63
|
+
* list_items
|
64
|
+
* unordered_lists
|
65
|
+
* ordered_lists
|
66
|
+
* h1s
|
67
|
+
* h2s
|
68
|
+
* h3s
|
69
|
+
* h4s
|
70
|
+
* h5s
|
71
|
+
* h6s
|
72
|
+
* paragraphs
|
73
|
+
* labels
|
74
|
+
* file_fields
|
8
75
|
=== 2017-01-09
|
9
76
|
* Enhancement
|
10
77
|
* Added params class instance variable to hold hash values that can be used in the page
|
data/Gemfile
CHANGED
data/cucumber.yml
CHANGED
data/features/audio.feature
CHANGED
@@ -1,45 +1,45 @@
|
|
1
|
-
|
1
|
+
Feature: Support for the audio element
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
Background:
|
4
|
+
Given I am on the static elements page
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
Scenario: Finding an audio element
|
7
|
+
When I retrieve the audio element
|
8
|
+
Then I should know it exists
|
9
|
+
And I should know it is visible
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
Scenario Outline: Locating an audio element on the page
|
12
|
+
When I search for the audio element by "<search_by>"
|
13
|
+
Then I should know it is visible
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
Examples:
|
16
|
+
| search_by |
|
17
|
+
| id |
|
18
|
+
| class |
|
19
|
+
| name |
|
20
|
+
| xpath |
|
21
|
+
| index |
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
Scenario Outline: Locating audios using multiple parameters
|
24
|
+
When I search for the audio element by "<param1>" and "<param2>"
|
25
|
+
Then I should know it is visible
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
Examples:
|
28
|
+
| param1 | param2 |
|
29
|
+
| class | index |
|
30
|
+
| name | index |
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
Scenario: Should know if it is autoplay
|
33
|
+
When I retrieve the audio element
|
34
|
+
Then I should know the audio is not autoplay
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
Scenario: Should know if the controls are displayed
|
37
|
+
When I retrieve the audio element
|
38
|
+
Then I should know that the controls are displayed
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
Scenario: Should know if it is paused
|
41
|
+
When I retrieve the audio element
|
42
|
+
Then I should know that the audio is paused
|
43
43
|
|
44
44
|
#Scenario: Should know its duration
|
45
45
|
#When I retrieve the audio element
|
data/features/element.feature
CHANGED
@@ -232,3 +232,8 @@ Feature: Elements
|
|
232
232
|
Scenario: Getting an element's id
|
233
233
|
When I retrieve a button element
|
234
234
|
Then I should know its id is "button_id"
|
235
|
+
|
236
|
+
Scenario: Scrolling so an element is visible
|
237
|
+
When I retrieve a heading element
|
238
|
+
And I scroll the heading element into view
|
239
|
+
Then the heading element should be visible
|
File without changes
|
File without changes
|
@@ -40,6 +40,8 @@
|
|
40
40
|
</script>
|
41
41
|
|
42
42
|
<audio controls id="audio" name="audio" class="audio">
|
43
|
+
<!-- <source src="04-Death_Becomes_Fur.mp4" type='audio/mp4'/> -->
|
44
|
+
<!-- <source src="04-Death_Becomes_Fur.oga" type='audio/ogg; codecs=vorbis'/> -->
|
43
45
|
<p>Your user agent does not support the HTML5 Audio element.</p>
|
44
46
|
</audio>
|
45
47
|
|
@@ -288,3 +288,192 @@ Feature: Multi Elements
|
|
288
288
|
Scenario: Selecting file fields using no identifier
|
289
289
|
When I select all 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 field 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 links 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 buttons 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 lists 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 paragraphs 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"
|
473
|
+
|
474
|
+
Scenario: Selecting all divs using a block instead of an identifier
|
475
|
+
When I select the divs using a block
|
476
|
+
Then I should have 3 divs
|
477
|
+
And the text of div 1 should be "Div 1"
|
478
|
+
And the text of div 2 should be "Div 2"
|
479
|
+
And the text of div 3 should be "Div 3"
|
@@ -5,7 +5,11 @@ require 'webrick'
|
|
5
5
|
class SampleApp
|
6
6
|
|
7
7
|
def self.start(host, port)
|
8
|
-
Rack::Handler::WEBrick.run
|
8
|
+
Rack::Handler::WEBrick.run new,
|
9
|
+
:Host => host,
|
10
|
+
:Port => port,
|
11
|
+
:Logger => ::WEBrick::Log.new(RUBY_PLATFORM =~ /mswin|mingw/ ? 'NUL:' : '/dev/null'),
|
12
|
+
:AccessLog => [nil, nil]
|
9
13
|
end
|
10
14
|
|
11
15
|
def initialize
|
@@ -134,3 +134,11 @@ end
|
|
134
134
|
Then(/^I should know the html is "(.*)"$/) do |html|
|
135
135
|
expect(@element.html).to eql html
|
136
136
|
end
|
137
|
+
|
138
|
+
When(/^I scroll the heading element into view$/) do
|
139
|
+
@element.scroll_into_view
|
140
|
+
end
|
141
|
+
|
142
|
+
Then(/^the heading element should be visible$/) do
|
143
|
+
expect(@element).to be_visible
|
144
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
When(/^I locate the form by "(.*?)"$/) do |how|
|
2
|
-
@element = @page.send "form_#{how}
|
2
|
+
@element = @page.send "form_#{how}_element"
|
3
3
|
end
|
4
4
|
|
5
5
|
Then(/^I should be able to submit the form$/) do
|
@@ -7,7 +7,7 @@ Then(/^I should be able to submit the form$/) do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
When(/^I locate the form using "(.*?)" and "(.*?)"$/) do |param1, param2|
|
10
|
-
@element = @page.send "form_#{param1}_#{param2}
|
10
|
+
@element = @page.send "form_#{param1}_#{param2}_element"
|
11
11
|
end
|
12
12
|
|
13
13
|
When(/^I locate the form$/) do
|
@@ -6,16 +6,22 @@ class JavascriptPage
|
|
6
6
|
button(:compute, :value => 'Compute')
|
7
7
|
end
|
8
8
|
|
9
|
+
def build_url(page)
|
10
|
+
target = ENV['BROWSER']
|
11
|
+
return "http://localhost:4567/#{page}" if target.nil? or target.include? 'local'
|
12
|
+
"http://ec2-107-22-131-88.compute-1.amazonaws.com:4567/#{page}"
|
13
|
+
end
|
14
|
+
|
9
15
|
Given(/^I am on jQuery example page$/) do
|
10
16
|
Druid.javascript_framework = :jquery
|
11
17
|
@page = JavascriptPage.new(@driver)
|
12
|
-
@page.navigate_to "
|
18
|
+
@page.navigate_to build_url("jquery.html")
|
13
19
|
end
|
14
20
|
|
15
21
|
Given(/^I am on the Prototype example page$/) do
|
16
22
|
Druid.javascript_framework = :prototype
|
17
23
|
@page = JavascriptPage.new(@driver)
|
18
|
-
@page.navigate_to "
|
24
|
+
@page.navigate_to build_url("prototype.html")
|
19
25
|
end
|
20
26
|
|
21
27
|
When(/^I ask to compute "([^"]*)"$/) do |expression|
|