druid-ts 1.2.4 → 1.2.5

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +21 -2
  3. data/Gemfile +1 -1
  4. data/druid.gemspec +3 -3
  5. data/features/element.feature +0 -5
  6. data/features/frames.feature +4 -0
  7. data/features/html/static_elements.html +11 -0
  8. data/features/populate_page_with.feature +25 -0
  9. data/features/select_list.feature +1 -0
  10. data/features/step_definations/audio_steps.rb +1 -1
  11. data/features/step_definations/element_steps.rb +0 -4
  12. data/features/step_definations/frame_steps.rb +35 -0
  13. data/features/step_definations/populate_page_with_steps.rb +3 -0
  14. data/features/step_definations/select_list_steps.rb +4 -0
  15. data/features/step_definations/table_steps.rb +19 -0
  16. data/features/support/page.rb +2 -0
  17. data/features/table.feature +21 -0
  18. data/lib/druid.rb +0 -1
  19. data/lib/druid/assist.rb +8 -5
  20. data/lib/druid/elements/area.rb +0 -20
  21. data/lib/druid/elements/check_box.rb +0 -20
  22. data/lib/druid/elements/element.rb +73 -64
  23. data/lib/druid/elements/file_field.rb +0 -6
  24. data/lib/druid/elements/hidden_field.rb +0 -4
  25. data/lib/druid/elements/image.rb +0 -7
  26. data/lib/druid/elements/media.rb +0 -34
  27. data/lib/druid/elements/ordered_list.rb +8 -21
  28. data/lib/druid/elements/radio_button.rb +0 -13
  29. data/lib/druid/elements/select_list.rb +2 -11
  30. data/lib/druid/elements/table.rb +41 -16
  31. data/lib/druid/elements/table_row.rb +21 -17
  32. data/lib/druid/elements/text_area.rb +0 -7
  33. data/lib/druid/elements/text_field.rb +0 -7
  34. data/lib/druid/elements/unordered_list.rb +9 -22
  35. data/lib/druid/javascript_framework_facade.rb +1 -1
  36. data/lib/druid/locator_generator.rb +153 -147
  37. data/lib/druid/page_populator.rb +44 -37
  38. data/lib/druid/version.rb +1 -1
  39. data/spec/druid/accessors_spec.rb +3 -3
  40. data/spec/druid/elements/check_box_spec.rb +0 -15
  41. data/spec/druid/elements/element_spec.rb +77 -78
  42. data/spec/druid/elements/file_field_spec.rb +0 -5
  43. data/spec/druid/elements/media_spec.rb +0 -49
  44. data/spec/druid/elements/ordered_list_spec.rb +24 -20
  45. data/spec/druid/elements/radio_button_spec.rb +0 -10
  46. data/spec/druid/elements/table_row_spec.rb +12 -12
  47. data/spec/druid/elements/table_spec.rb +29 -25
  48. data/spec/druid/elements/text_area_spec.rb +0 -4
  49. data/spec/druid/elements/text_field_spec.rb +0 -5
  50. data/spec/druid/elements/unordered_list_spec.rb +25 -20
  51. data/spec/druid/javascript_framework_facade_spec.rb +1 -1
  52. data/spec/druid/page_populator_spec.rb +34 -4
  53. metadata +15 -18
  54. data/lib/druid/core_ext/string.rb +0 -5
  55. data/spec/druid/elements/area_spec.rb +0 -25
  56. data/spec/druid/elements/canvas_spec.rb +0 -19
  57. data/spec/druid/elements/video_spec.rb +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8af3e9a526cfd660e1eff1bd0f079f5948db7cdd
4
- data.tar.gz: 3600c658bdecc5186b1e381619171ef405f9aa9f
3
+ metadata.gz: a37878faec17d55dc5e46271488aa642a92a3f00
4
+ data.tar.gz: cf7cfade0356638ddd7e22c310789f33c4cd60a8
5
5
  SHA512:
6
- metadata.gz: 1b545e4e4936a8117fdb3cbbaa1e18adc92907df2aa815a8bc3a28246cc8d3b5c716362c4774b862c9709640d7dbefaf156ae1125c00eccb1dd0bbfe96b6ee71
7
- data.tar.gz: 266b41d2f1557c0580f3fec6871b3299e57d39ecab66f8f0da2901f293782af256c58ba6429ae7d4edee41e31e37a944028a3caee49bc94ed5d9423cb4228ed8
6
+ metadata.gz: 351a66a011905ed2722a268153d9d9dbfbca1a276a51cbb2681a831823fa4c93785e193983aa8aa7831d9912883c2f160d8eeb55e15840206345b93064c635e9
7
+ data.tar.gz: 56f28412001a34ad9c26dd3d43fff4141bad3774b567203b03dfdc22d48f5c715137b9cee773d303bf34914f7c360edf92c1d881ffb7b9b5c113cb11f198918a
data/ChangeLog CHANGED
@@ -1,6 +1,25 @@
1
- === 2017-06-12
1
+ === Version 1.2.5/ 2017-10-16
2
+ * Enhancements
3
+ * Added the ability to get the values of a table column
4
+ * Added the ability to populate sections with a nested entry from data_magic
5
+ === 2017-10-15
6
+ * Enhancements
7
+ * Added the preceding_sibling method to Element
8
+ * Added the following_sibling method to Element
9
+ * Added the siblings method to Element
10
+ * Added the children method to Element
11
+ * Added the preceding_siblings method to Element
12
+ * Added the following_siblings method to Element
13
+ * Fixes
14
+ * Fixed issue that occurred when things were moved around in Watir 6.8
15
+ === 2017-10-12
16
+ * Enhancements
17
+ * Fix bug in integration of frames and sections
18
+ * delegate select list text method directly to watir
19
+ * optimize the way to generate a array of symbol
20
+ === Version 1.2.4/ 2017-06-12
2
21
  * Add cookies method to druid
3
- === 2017-04-24
22
+ === Version 1.2.3/ 2017-04-24
4
23
  * Removed all direct delegateds. Now relies on method_missing to call Watir methods.
5
24
  * You may have to change RSpec matchers to use method instead of predicate.
6
25
  === Version 1.2.2/ 2017/02-14
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  # adding rake so travis-ci will build properly
4
4
  gem 'rake'
@@ -18,11 +18,11 @@ Gem::Specification.new do |s|
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f)}
20
20
  s.require_paths = ["lib"]
21
- s.add_dependency "watir", "~> 6.0"
21
+ s.add_dependency "watir", "~> 6.8"
22
22
  s.add_dependency "page_navigation", ">= 0.10"
23
23
 
24
- s.add_development_dependency "rspec", ">= 3.0.0"
25
- s.add_development_dependency "cucumber", ">= 2.0.0"
24
+ s.add_development_dependency "rspec", "~> 3.0"
25
+ s.add_development_dependency "cucumber", "~> 2.0"
26
26
  s.add_development_dependency "rack", ">= 1.0"
27
27
  s.add_development_dependency "net-http-persistent", "~> 3.0"
28
28
 
@@ -244,11 +244,6 @@ Feature: Elements
244
244
  When I retrieve a button element
245
245
  Then I should know its id is "button_id"
246
246
 
247
- Scenario: Scrolling so an element is visible
248
- When I retrieve a heading element
249
- And I scroll the heading element into view
250
- Then the heading element should be visible
251
-
252
247
  Scenario: Expanding how we find elemnts to include non-stardard locators
253
248
  When I retrieve a div using data-entity
254
249
  Then I should know it exists
@@ -70,3 +70,7 @@ Scenario: Accessing elements within the frame using multiple identifiers
70
70
  Given I am on the iframe elements page
71
71
  When I type "page-object" into the text field for frame 2 using "multiple identifiers"
72
72
  Then I should verify "page-object" is in the text field for frame 2 using "multiple identifiers"
73
+
74
+ Scenario: Frames in sections
75
+ Given I am on the frame section page
76
+ Then I should be able to access an element in the frame in the section repeatedly
@@ -119,6 +119,17 @@
119
119
  </tbody>
120
120
  </table>
121
121
 
122
+ <table id='table_with_regex' border='1'>
123
+ <tr>
124
+ <td>Price1 |</td>
125
+ <td>$420.99</td>
126
+ </tr>
127
+ <tr>
128
+ <td>Price |</td>
129
+ <td>$69.99</td>
130
+ </tr>
131
+ </table>
132
+
122
133
  <form method="get" action="success.html">
123
134
  <input id='button_id' name='button_name' class='button_class' type="submit" value="Click Me"/>
124
135
  <input id='button_image_id' type='image' src='images/submit.gif' alt='Submit'/>
@@ -0,0 +1,25 @@
1
+ Feature: Populate Page With
2
+ In order to quickly fill out forms on a page
3
+ A tester will use the populate_page_with method
4
+ To fill in text, select options, check boxes, and select radio buttons
5
+
6
+ Background:
7
+ Given I am on the static elements page
8
+
9
+ Scenario:
10
+ When I populate the page with the data:
11
+ | text_field_id | abcDEF |
12
+ | text_area_id | abcdefghijklmnop |
13
+ | select_list_id | Test 2 |
14
+ | cb_id | check |
15
+ | butter_id | check |
16
+ | favorite_cheese | muen |
17
+ Then the text field should contain "abcDEF"
18
+ And the text area should contain "abcdefghijklmnop"
19
+ And the selected option should be "Test 2"
20
+ And the First check box should be selected
21
+ And the "Butter" radio button should be selected
22
+ And the "muen" radio button should be selected in the group
23
+ When I populate the page with the data:
24
+ | select_list_id | option3 |
25
+ Then the selected option should be "Test/Test 3"
@@ -73,6 +73,7 @@ Feature: Select List
73
73
  Scenario: Clearing multiple select list
74
74
  When I clear multiple select list
75
75
  Then multiple select list should have no selected options
76
+ And cleared multiple select list should return nil for value
76
77
 
77
78
  Scenario: Selecting an option by its value
78
79
  When I select an option using the value "option2"
@@ -19,7 +19,7 @@ Then(/^I should know that the audio is paused$/) do
19
19
  end
20
20
 
21
21
  Then(/^I should know that its volume is (\d+)$/) do |volume|
22
- expect(@element.volume).to eql volume.to_i
22
+ expect(@element.volume).to eql volume.to_f
23
23
  end
24
24
 
25
25
  Given(/^I am on the audio video page$/) do
@@ -135,10 +135,6 @@ Then(/^I should know the html is "(.*)"$/) do |html|
135
135
  expect(@element.html).to eql html
136
136
  end
137
137
 
138
- When(/^I scroll the heading element into view$/) do
139
- @element.scroll_into_view
140
- end
141
-
142
138
  Then(/^the heading element should be visible$/) do
143
139
  expect(@element.visible?).to be true
144
140
  end
@@ -57,6 +57,41 @@ class IFramePage
57
57
  end
58
58
  end
59
59
 
60
+ class FrameSectionPageSection
61
+ include Druid
62
+
63
+ paragraph :p_in_section
64
+
65
+ in_iframe(id: 'three') do |frame|
66
+ link :success, id: 'four', frame: frame
67
+ end
68
+
69
+ end
70
+
71
+ class FrameSectionPage
72
+ include Druid
73
+
74
+ in_frame(id: 'two') do |frame|
75
+ page_section :frame_section, FrameSectionPageSection, tag_name: 'body', frame: frame
76
+ paragraph :p_on_page, frame: frame
77
+ end
78
+
79
+ end
80
+
81
+ Given(/^I am on the frame section page$/) do
82
+ @page = FrameSectionPage.new(@driver)
83
+ @page.navigate_to(UrlHelper.nested_frame_elements)
84
+ end
85
+
86
+ Then(/^I should be able to access an element in the frame in the section repeatedly$/) do
87
+ expect(@page.p_on_page_element).to be_visible
88
+ expect(@page.frame_section.p_in_section_element).to be_visible
89
+ expect(@page.frame_section.success_element).to be_visible
90
+ expect(@page.frame_section.success_element.text).to eq "this link should open the page success page"
91
+ @page.frame_section.success
92
+ expect(@page.text.strip).to eq 'Success'
93
+ end
94
+
60
95
  Given(/^I am on the frame elements page$/) do
61
96
  @page = FramePage.new(@driver)
62
97
  @page.navigate_to(UrlHelper.frame_elements)
@@ -0,0 +1,3 @@
1
+ When(/^I populate the page with the data:$/) do |table|
2
+ @page.populate_page_with table.rows_hash
3
+ end
@@ -85,3 +85,7 @@ end
85
85
  Then(/^the selected option should have a value of "([^"]*)"$/) do |value|
86
86
  expect(@page.select_list_id_element.selected_values[0]).to eql value
87
87
  end
88
+
89
+ Then(/^cleared multiple select list should return nil for value$/) do
90
+ expect(@page.select_list_multiple).to be nil
91
+ end
@@ -88,3 +88,22 @@ end
88
88
  Then(/^the table should be like the expected one$/) do |expected_table|
89
89
  expect(expected_table.diff!@element.hashes).to be_nil
90
90
  end
91
+
92
+ When(/^I retrieve a table element with regex characters$/) do
93
+ @element = @page.table_with_regex_element
94
+ end
95
+
96
+ When(/^I ask for the column values for "([^"]*)"$/) do |header|
97
+ @values = @page.table_id_element.column_values(header)
98
+ end
99
+
100
+ Then(/^I should receive:$/) do |table|
101
+ expect(@values.size).to eql 2
102
+ table.hashes.each do |hsh|
103
+ expect(@values).to include hsh['values']
104
+ end
105
+ end
106
+
107
+ When(/^I ask for the column values for column (\d+)$/) do |index|
108
+ @values = @page.table_id_element.column_values(index.to_i)
109
+ end
@@ -124,6 +124,8 @@ class Page
124
124
  table(:table_css, :css => '.table_class')
125
125
  table(:table_class_index, :class => "table_class", :index => 0)
126
126
  table(:table_name_index, :name => "table_name", :index => 0)
127
+ table(:table_with_regex, :id => 'table_with_regex')
128
+
127
129
 
128
130
  cell(:cell_id, :id => 'cell_id')
129
131
  cell(:cell_class, :class => 'cell_class')
@@ -104,3 +104,24 @@ Feature: Table
104
104
  | Table | Header |
105
105
  | Data1 | Data2 |
106
106
  | Data3 | Data4 |
107
+
108
+ Scenario: Get rows by text with special chars
109
+ When I retrieve a table element with regex characters
110
+ Then the data for row "Price1 |" should be "Price1 |" and "$420.99"
111
+ And the data for row "rice |" should be "Price |" and "$69.99"
112
+ And the data for row "$420.99" should be "Price1 |" and "$420.99"
113
+ And the data for row "$420" should be "Price1 |" and "$420.99"
114
+
115
+ Scenario: Retrieving column values using header string
116
+ When I ask for the column values for "Header"
117
+ Then I should receive:
118
+ | values |
119
+ | Data2 |
120
+ | Data4 |
121
+
122
+ Scenario: Retrieving column values using a column number
123
+ When I ask for the column values for column 1
124
+ Then I should receive:
125
+ | values |
126
+ | Data2 |
127
+ | Data4 |
@@ -2,7 +2,6 @@ require 'watir'
2
2
  require 'druid/accessors'
3
3
  require 'druid/assist'
4
4
  require 'druid/page_factory'
5
- require 'druid/core_ext/string'
6
5
  require 'druid/element_locators'
7
6
  require 'druid/page_populator'
8
7
  require 'druid/section_collection'
@@ -63,7 +63,9 @@ module Druid
63
63
  end
64
64
 
65
65
  def select_list_value_for identifier
66
- process_call("select_list(identifier).options.find {|o| o.selected?}.text", Elements::SelectList, identifier)
66
+ options = process_call("select_list(identifier).selected_options", Elements::SelectList, identifier)
67
+ return nil if options.empty?
68
+ options.first.text
67
69
  end
68
70
 
69
71
  def select_list_for identifier
@@ -620,8 +622,9 @@ module Druid
620
622
  end
621
623
 
622
624
  def parse_identifiers(identifier, element, tag_name=nil)
623
- frame_identifiers = identifier.delete(:frame)
624
- return identifier, frame_identifiers
625
+ new_identifiers = identifier.dup
626
+ frame_identifiers = new_identifiers.delete(:frame)
627
+ return new_identifiers, frame_identifiers
625
628
  end
626
629
 
627
630
  def nested_frames(frame_identifiers)
@@ -632,7 +635,7 @@ module Druid
632
635
  identifier = frame.values.first.map do |key, value|
633
636
  if value.is_a?(Regexp)
634
637
  ":#{key} => #{value.inspect}"
635
- elsif value.to_s.is_integer
638
+ elsif value.is_a? Integer
636
639
  ":#{key} => #{value}"
637
640
  else
638
641
  ":#{key} => '#{value}'"
@@ -644,7 +647,7 @@ module Druid
644
647
  end
645
648
 
646
649
  def switch_to_default_content(frame_identifiers)
647
- driver.wd.switch_to.default_content unless frame_identifiers.nil?
650
+ driver.browser.wd.switch_to.default_content unless frame_identifiers.nil?
648
651
  end
649
652
  end
650
653
  end
@@ -2,26 +2,6 @@ module Druid
2
2
  module Elements
3
3
  class Area < Element
4
4
 
5
- #
6
- # Return the coordinates of the area
7
- #
8
- def coords
9
- attribute(:coords)
10
- end
11
-
12
- #
13
- # Return the shape of the area
14
- #
15
- def shape
16
- attribute(:shape)
17
- end
18
-
19
- #
20
- # Return the href of the area
21
- #
22
- def href
23
- attribute(:href)
24
- end
25
5
  end
26
6
 
27
7
  Druid::Elements.type_to_class[:area] = Druid::Elements::Area
@@ -2,26 +2,6 @@ module Druid
2
2
  module Elements
3
3
  class CheckBox < Element
4
4
 
5
- #
6
- # Check the checkbox
7
- #
8
- def check
9
- element.set
10
- end
11
-
12
- #
13
- # Uncheck the CheckBox
14
- #
15
- def uncheck
16
- element.clear
17
- end
18
-
19
- #
20
- # Return true if checkbox is checked
21
- #
22
- def checked?
23
- element.set?
24
- end
25
5
  end
26
6
 
27
7
  Druid::Elements.type_to_class[:checkbox] = Druid::Elements::CheckBox
@@ -1,4 +1,3 @@
1
- require 'watir/extensions/select_text'
2
1
  require 'druid/nested_elements'
3
2
  require 'druid/assist'
4
3
  module Druid
@@ -32,94 +31,86 @@ module Druid
32
31
  other.is_a? self.class and element == other.element
33
32
  end
34
33
 
35
- #
36
- # Get the value of the given attribute of the element
37
- # @param [String]
38
- # @return [String, nil]
39
- #
40
- def attribute(attribute_name)
41
- element.attribute_value attribute_name
42
- end
43
-
44
- #
45
- # retrieve the class name for an element
46
- #
47
- def class_name
48
- element.class_name
34
+ def check_visible(timeout=Druid.default_element_wait)
35
+ timed_loop(timeout) do |element|
36
+ element.visible?
37
+ end
38
+ # wait_until(timeout: timeout, message: "Element not visible in #{timeout} seconds", &:present?)
49
39
  end
40
+ # alias_method :when_present, :check_visible
41
+ # alias_method :when_visible, :check_visible
50
42
 
51
- def inspect
52
- element.inspect
43
+ def check_exist(timeout=Druid.default_element_wait)
44
+ timed_loop(timeout) do |element|
45
+ element.exists?
46
+ end
47
+ # wait_until(timeout: timeout, &:exist?)
53
48
  end
54
49
 
55
50
  #
56
- # Scroll until the element is viewable
51
+ # find the parent element
57
52
  #
58
- def scroll_into_view
59
- element.wd.location_once_scrolled_into_view
53
+ def parent(opt = {})
54
+ parent = element.parent(opt)
55
+ druid_wrapper(parent)
60
56
  end
61
57
 
62
58
  #
63
- # location of element (x,y)
59
+ # Return the element that exists at the same level of the DOM
60
+ # immediately prior to this element
64
61
  #
65
- def location
66
- element.wd.location
62
+ def preceding_sibling(opt = {})
63
+ sibling = element.preceding_sibling(opt)
64
+ druid_wrapper(sibling)
67
65
  end
68
66
 
69
67
  #
70
- # size of element (width, height)
68
+ # Return the element that exists at the same level of the DOM
69
+ # immediately after this element
71
70
  #
72
- def size
73
- element.wd.size
71
+ def following_sibling(opt={})
72
+ sibling = element.following_sibling(opt)
73
+ druid_wrapper(sibling)
74
74
  end
75
75
 
76
76
  #
77
- # Get width of element
77
+ # Return all elements that are direct children of this element's parent
78
78
  #
79
- def width
80
- size['width']
79
+ def siblings(opt={})
80
+ siblings = element.siblings(opt)
81
+ siblings.collect {|sibling| druid_wrapper(sibling)}
81
82
  end
82
83
 
83
84
  #
84
- # Get height of element
85
+ # Return all elements that are children of this element
85
86
  #
86
- def height
87
- size['height']
87
+ def children(opt={})
88
+ children = element.children(opt)
89
+ children.collect {|child| druid_wrapper(child)}
88
90
  end
89
91
 
90
92
  #
91
- # Get centre coordinates of element
93
+ # Return all elements that exist at the same level of the DOM
94
+ # immediately prior to this element
92
95
  #
93
- def centre
94
- { 'y' => (location['y'] + (size['height']/2)), 'x' => (location['x'] + (size['width']/2)) }
95
- end
96
-
97
- def check_visible(timeout=Druid.default_element_wait)
98
- timed_loop(timeout) do |element|
99
- element.visible?
100
- end
101
- end
102
-
103
- def check_exist(timeout=Druid.default_element_wait)
104
- timed_loop(timeout) do |element|
105
- element.exist?
106
- end
96
+ def preceding_siblings(opt={})
97
+ siblings = element.preceding_siblings(opt)
98
+ siblings.collect {|sibling| druid_wrapper(sibling)}
107
99
  end
108
100
 
109
101
  #
110
- # Returns parent element of current element.
111
- def parent
112
- parent = element.parent
113
- type = element.type if parent.tag_name.to_sym == :input
114
- cls = Druid::Elements.element_class_for(parent.tag_name, type)
115
- cls.new(parent)
102
+ # Return all elements that exist at the same level of the DOM
103
+ # immediately after this element
104
+ #
105
+ def following_siblings(opt={})
106
+ siblings = element.following_siblings(opt)
107
+ siblings.collect {|sibling| druid_wrapper(sibling)}
116
108
  end
117
109
 
118
110
  #
119
- # Waits until the element is present
111
+ # Wait until the element is present
120
112
  #
121
- # @param [Integer] (defaults to: 5) seconds to wait before
122
- # timing out
113
+ # @param [Integer] (defaults to: 5) seconds to wait before timing out
123
114
  #
124
115
  def when_present(timeout=Druid.default_element_wait)
125
116
  element.wait_until(timeout: timeout, message: "Element not present in #{timeout} seconds", &:present?)
@@ -133,13 +124,13 @@ module Druid
133
124
  # timing out
134
125
  #
135
126
  def when_not_present(timeout=Druid.default_element_wait)
136
- element.wait_while(timeout: timeout, message: "Element still present after #{timeout} seconds", &:present?)
127
+ element.wait_while(timeout: timeout, message: "Element still present in #{timeout} seconds", &:present?)
137
128
  end
138
129
 
139
130
  #
140
- # Waits until the element is visible
131
+ # Wait until the element is visible
141
132
  #
142
- # @param [Interger] (default to:5) seconds to wait before timing out
133
+ # @param [Integer] (defaults to: 5) seconds to wait before timing out
143
134
  #
144
135
  def when_visible(timeout=Druid.default_element_wait)
145
136
  when_present(timeout)
@@ -150,23 +141,28 @@ module Druid
150
141
  #
151
142
  # Waits until the element is not visible
152
143
  #
153
- # @param [Integer] (default to:5) seconds to wait before timing out
144
+ # @param [Integer] (default to: 5) seconds to wait before timing out
154
145
  #
155
146
  def when_not_visible(timeout=Druid.default_element_wait)
156
147
  when_present(timeout)
157
148
  element.wait_while(timeout: timeout, message: "Element still visible after #{timeout} seconds", &:visible?)
158
- self
159
149
  end
160
150
 
161
151
  #
162
152
  # Waits until the block returns true
163
153
  #
164
- # @param [Integer] (default to:5) seconds to wait before timing out
154
+ # @param [Integer] (defaults to: 5) seconds to wait before timing out
155
+ # @param [String] the message to display if the event timeouts
156
+ # @param the block to execute when the event occurs
165
157
  #
166
158
  def wait_until(timeout=Druid.default_element_wait, message=nil, &block)
167
159
  element.wait_until(timeout: timeout, message: message, &block)
168
160
  end
169
161
 
162
+ def name
163
+ element.attribute(:name)
164
+ end
165
+
170
166
  # @private
171
167
  # delegate calls to driver element
172
168
  def method_missing(*args, &block)
@@ -174,17 +170,30 @@ module Druid
174
170
  element.send m, *args, &block
175
171
  end
176
172
 
173
+ def respond_to_missing?(m,*args)
174
+ element.respond_to?(m) || super
175
+ end
176
+
177
+ protected
178
+
179
+ def druid_wrapper(object)
180
+ type = element.type if object.tag_name.to_sym == :input
181
+ cls = Druid::Elements.element_class_for(object.tag_name, type)
182
+ cls.new(object.to_subtype)
183
+ end
184
+
177
185
  private
178
186
 
179
187
  def timed_loop(timeout)
180
- end_time = Time.now + timeout
181
- until Time.now > end_time
188
+ end_time = ::Time.now + timeout
189
+ until ::Time.now > end_time
182
190
  result = yield(self)
183
191
  return result if result
184
192
  sleep 0.5
185
193
  end
186
194
  false
187
195
  end
196
+
188
197
  end
189
198
  end
190
199
  end