watir-classic 3.0.0

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 (213) hide show
  1. data/CHANGES +721 -0
  2. data/LICENSE +34 -0
  3. data/README.rdoc +78 -0
  4. data/VERSION +1 -0
  5. data/bin/watir-console +5 -0
  6. data/lib/watir-classic.rb +14 -0
  7. data/lib/watir-classic/IEDialog/Release/IEDialog.dll +0 -0
  8. data/lib/watir-classic/assertions.rb +44 -0
  9. data/lib/watir-classic/browser.rb +149 -0
  10. data/lib/watir-classic/browsers.rb +7 -0
  11. data/lib/watir-classic/close_all.rb +31 -0
  12. data/lib/watir-classic/container.rb +110 -0
  13. data/lib/watir-classic/contrib/enabled_popup.rb +21 -0
  14. data/lib/watir-classic/contrib/ie-new-process.rb +27 -0
  15. data/lib/watir-classic/contrib/page_checker.rb +29 -0
  16. data/lib/watir-classic/cookies.rb +80 -0
  17. data/lib/watir-classic/core.rb +43 -0
  18. data/lib/watir-classic/dialogs/file_field.rb +34 -0
  19. data/lib/watir-classic/dialogs/javascript.rb +43 -0
  20. data/lib/watir-classic/drag_and_drop_helper.rb +68 -0
  21. data/lib/watir-classic/element.rb +438 -0
  22. data/lib/watir-classic/element_collection.rb +109 -0
  23. data/lib/watir-classic/element_extensions.rb +69 -0
  24. data/lib/watir-classic/exceptions.rb +50 -0
  25. data/lib/watir-classic/form.rb +96 -0
  26. data/lib/watir-classic/frame.rb +47 -0
  27. data/lib/watir-classic/ie-class.rb +767 -0
  28. data/lib/watir-classic/ie-process.rb +47 -0
  29. data/lib/watir-classic/ie.rb +20 -0
  30. data/lib/watir-classic/image.rb +111 -0
  31. data/lib/watir-classic/input_elements.rb +480 -0
  32. data/lib/watir-classic/irb-history.rb +31 -0
  33. data/lib/watir-classic/link.rb +46 -0
  34. data/lib/watir-classic/locator.rb +243 -0
  35. data/lib/watir-classic/logger.rb +19 -0
  36. data/lib/watir-classic/matches.rb +23 -0
  37. data/lib/watir-classic/modal_dialog.rb +72 -0
  38. data/lib/watir-classic/module.rb +12 -0
  39. data/lib/watir-classic/non_control_elements.rb +114 -0
  40. data/lib/watir-classic/options.rb +56 -0
  41. data/lib/watir-classic/page-container.rb +114 -0
  42. data/lib/watir-classic/process.rb +20 -0
  43. data/lib/watir-classic/screen_capture.rb +115 -0
  44. data/lib/watir-classic/supported_elements.rb +172 -0
  45. data/lib/watir-classic/table.rb +224 -0
  46. data/lib/watir-classic/testcase.rb +97 -0
  47. data/lib/watir-classic/util.rb +35 -0
  48. data/lib/watir-classic/version.rb +4 -0
  49. data/lib/watir-classic/wait.rb +41 -0
  50. data/lib/watir-classic/wait_helper.rb +12 -0
  51. data/lib/watir-classic/waiter.rb +98 -0
  52. data/lib/watir-classic/win32.rb +40 -0
  53. data/lib/watir-classic/win32ole.rb +16 -0
  54. data/lib/watir-classic/win32ole/1.8.7/win32ole.so +0 -0
  55. data/lib/watir-classic/win32ole/1.9.3/win32ole.so +0 -0
  56. data/lib/watir-classic/window.rb +68 -0
  57. data/lib/watir-classic/xpath_locator.rb +52 -0
  58. data/rakefile.rb +54 -0
  59. data/unittests/all_tests.rb +10 -0
  60. data/unittests/buttons_xpath_test.rb +68 -0
  61. data/unittests/checkbox_test.rb +163 -0
  62. data/unittests/checkbox_xpath_test.rb +106 -0
  63. data/unittests/click_no_wait_test.rb +23 -0
  64. data/unittests/close_all_test.rb +17 -0
  65. data/unittests/core_tests.rb +17 -0
  66. data/unittests/css_selector_test.rb +44 -0
  67. data/unittests/css_test.rb +38 -0
  68. data/unittests/dialog_test.rb +64 -0
  69. data/unittests/div2_xpath_test.rb +21 -0
  70. data/unittests/div_test.rb +170 -0
  71. data/unittests/div_xpath_test.rb +95 -0
  72. data/unittests/document_standards.rb +63 -0
  73. data/unittests/element_collection_indexes_test.rb +57 -0
  74. data/unittests/element_collections_test.rb +100 -0
  75. data/unittests/element_test.rb +47 -0
  76. data/unittests/errorchecker_test.rb +31 -0
  77. data/unittests/filefield_test.rb +43 -0
  78. data/unittests/filefield_xpath_test.rb +35 -0
  79. data/unittests/form_test.rb +282 -0
  80. data/unittests/form_xpath_test.rb +254 -0
  81. data/unittests/frame_test.rb +165 -0
  82. data/unittests/google_form_test.rb +15 -0
  83. data/unittests/html/JavascriptClick.html +39 -0
  84. data/unittests/html/blankpage.html +11 -0
  85. data/unittests/html/buttons1.html +40 -0
  86. data/unittests/html/checkboxes1.html +89 -0
  87. data/unittests/html/click_no_wait.html +14 -0
  88. data/unittests/html/complex_table.html +35 -0
  89. data/unittests/html/cssTest.html +42 -0
  90. data/unittests/html/depot_store.html +59 -0
  91. data/unittests/html/div.html +92 -0
  92. data/unittests/html/div_xml.html +21 -0
  93. data/unittests/html/fileupload.html +44 -0
  94. data/unittests/html/formTest1.html +38 -0
  95. data/unittests/html/forms2.html +44 -0
  96. data/unittests/html/forms3.html +131 -0
  97. data/unittests/html/forms4.html +26 -0
  98. data/unittests/html/frame_buttons.html +4 -0
  99. data/unittests/html/frame_links.html +4 -0
  100. data/unittests/html/frame_multi.html +5 -0
  101. data/unittests/html/google_india.html +119 -0
  102. data/unittests/html/ie7_document_standards.html +9 -0
  103. data/unittests/html/ie8_document_standards.html +9 -0
  104. data/unittests/html/ie9_document_standards.html +9 -0
  105. data/unittests/html/iframe.html +3 -0
  106. data/unittests/html/iframeTest.html +17 -0
  107. data/unittests/html/iframeTest1.html +7 -0
  108. data/unittests/html/iframeTest2.html +5 -0
  109. data/unittests/html/images/1.gif +0 -0
  110. data/unittests/html/images/2.GIF +0 -0
  111. data/unittests/html/images/3.GIF +0 -0
  112. data/unittests/html/images/button.jpg +0 -0
  113. data/unittests/html/images/circle.jpg +0 -0
  114. data/unittests/html/images/map.GIF +0 -0
  115. data/unittests/html/images/map2.gif +0 -0
  116. data/unittests/html/images/minus.GIF +0 -0
  117. data/unittests/html/images/originaltriangle.jpg +0 -0
  118. data/unittests/html/images/plus.gif +0 -0
  119. data/unittests/html/images/square.jpg +0 -0
  120. data/unittests/html/images/triangle.jpg +0 -0
  121. data/unittests/html/images1.html +65 -0
  122. data/unittests/html/javascriptevents.html +33 -0
  123. data/unittests/html/link_pass.html +11 -0
  124. data/unittests/html/links1.html +37 -0
  125. data/unittests/html/links2.html +11 -0
  126. data/unittests/html/links_multi.html +12 -0
  127. data/unittests/html/list_matters.html +720 -0
  128. data/unittests/html/lists.html +18 -0
  129. data/unittests/html/map_test.html +30 -0
  130. data/unittests/html/modal_dialog.html +10 -0
  131. data/unittests/html/modal_dialog_launcher.html +12 -0
  132. data/unittests/html/multiple_specifiers.html +64 -0
  133. data/unittests/html/nestedFrames.html +6 -0
  134. data/unittests/html/new_browser.html +17 -0
  135. data/unittests/html/pass.html +13 -0
  136. data/unittests/html/popups1.html +59 -0
  137. data/unittests/html/pre.html +29 -0
  138. data/unittests/html/quirks_document_standards.html +8 -0
  139. data/unittests/html/radioButtons1.html +71 -0
  140. data/unittests/html/select_tealeaf.html +54 -0
  141. data/unittests/html/selectboxes1.html +52 -0
  142. data/unittests/html/simple_table.html +25 -0
  143. data/unittests/html/simple_table_buttons.html +104 -0
  144. data/unittests/html/simple_table_columns.html +75 -0
  145. data/unittests/html/table1.html +179 -0
  146. data/unittests/html/tableCell_using_xpath.html +19 -0
  147. data/unittests/html/table_and_tablerow_to_a.html +174 -0
  148. data/unittests/html/textarea.html +30 -0
  149. data/unittests/html/textfields1.html +100 -0
  150. data/unittests/html/textsearch.html +44 -0
  151. data/unittests/html/wallofcheckboxes.html +1003 -0
  152. data/unittests/html/xpath_nbsp.html +11 -0
  153. data/unittests/html/zeroindex.html +11 -0
  154. data/unittests/ie_exists_test.rb +16 -0
  155. data/unittests/ie_mock.rb +94 -0
  156. data/unittests/ie_test.rb +54 -0
  157. data/unittests/images_test.rb +156 -0
  158. data/unittests/images_xpath_test.rb +90 -0
  159. data/unittests/index_specifier_test.rb +31 -0
  160. data/unittests/js_events_test.rb +31 -0
  161. data/unittests/links_multi_test.rb +34 -0
  162. data/unittests/links_test.rb +131 -0
  163. data/unittests/links_xpath_test.rb +38 -0
  164. data/unittests/lists_test.rb +23 -0
  165. data/unittests/map_test.rb +98 -0
  166. data/unittests/minmax_test.rb +37 -0
  167. data/unittests/navigate_test.rb +38 -0
  168. data/unittests/nbsp_xpath_test.rb +16 -0
  169. data/unittests/no_wait_test.rb +28 -0
  170. data/unittests/non_core_tests.rb +12 -0
  171. data/unittests/other/all_tests_concurrent.rb +57 -0
  172. data/unittests/other/navigate_exception_test.rb +24 -0
  173. data/unittests/other/rexml_unit_test.rb +27 -0
  174. data/unittests/other/screen_capture_test.rb +53 -0
  175. data/unittests/other/testcase_method_order_test.rb +36 -0
  176. data/unittests/other/testcase_verify_test.rb +25 -0
  177. data/unittests/other/wait_until_test.rb +102 -0
  178. data/unittests/pagecontainstext_test.rb +69 -0
  179. data/unittests/parent_child_test.rb +27 -0
  180. data/unittests/perf_test.rb +20 -0
  181. data/unittests/pre_test.rb +49 -0
  182. data/unittests/radios_test.rb +181 -0
  183. data/unittests/radios_xpath_test.rb +100 -0
  184. data/unittests/security_setting_test.rb +24 -0
  185. data/unittests/selectbox_test.rb +144 -0
  186. data/unittests/selectbox_xpath_test.rb +102 -0
  187. data/unittests/setup.rb +69 -0
  188. data/unittests/speed_settings_test.rb +67 -0
  189. data/unittests/table_cell_using_xpath_test.rb +34 -0
  190. data/unittests/table_test.rb +296 -0
  191. data/unittests/table_xpath_test.rb +109 -0
  192. data/unittests/test_tests.rb +9 -0
  193. data/unittests/textarea_test.rb +92 -0
  194. data/unittests/textarea_xpath_test.rb +77 -0
  195. data/unittests/textfield_for_ch_char_test.rb +32 -0
  196. data/unittests/textfields_test.rb +184 -0
  197. data/unittests/textfields_xpath_test.rb +110 -0
  198. data/unittests/version_test.rb +15 -0
  199. data/unittests/win32ole_so_test.rb +35 -0
  200. data/unittests/window_tests.rb +10 -0
  201. data/unittests/windows/attach_to_existing_window_test.rb +52 -0
  202. data/unittests/windows/attach_to_new_window_test.rb +74 -0
  203. data/unittests/windows/close_window_test.rb +20 -0
  204. data/unittests/windows/frame_links_test.rb +23 -0
  205. data/unittests/windows/ie-each_test.rb +46 -0
  206. data/unittests/windows/modal_dialog_test.rb +95 -0
  207. data/unittests/windows/new_process_test.rb +24 -0
  208. data/unittests/windows/new_test.rb +58 -0
  209. data/unittests/windows/open_close_test.rb +19 -0
  210. data/unittests/windows/send_keys_test.rb +26 -0
  211. data/unittests/xpath_tests.rb +11 -0
  212. data/watir-rdoc.rb +7 -0
  213. metadata +370 -0
@@ -0,0 +1,224 @@
1
+ module Watir
2
+
3
+ module TableContainer
4
+ # Returns a row in the table
5
+ # * index - the index of the row
6
+ def [](index)
7
+ assert_exists
8
+ TableRow.new(self, :ole_object => @o.rows.item(index))
9
+ end
10
+
11
+ def strings
12
+ assert_exists
13
+ rows_memo = []
14
+ @o.rows.each do |row|
15
+ cells_memo = []
16
+ row.cells.each do |cell|
17
+ cells_memo << TableCell.new(self, :ole_object => cell).text.gsub("\r\n","")
18
+ end
19
+ rows_memo << cells_memo
20
+ end
21
+ rows_memo
22
+ end
23
+ end
24
+
25
+ module TableElementsContainer
26
+ def table_elements(klass, tags, how, what, ole_collection)
27
+ specifiers = format_specifiers(tags, how, what)
28
+ klass.new(self, specifiers, ole_collection)
29
+ end
30
+
31
+ private :table_elements
32
+ end
33
+
34
+ module TableCellsContainer
35
+ include TableElementsContainer
36
+
37
+ def cells(how={}, what=nil)
38
+ assert_exists
39
+ table_elements(TableCellCollection, [:th, :td], how, what, @o.cells)
40
+ end
41
+
42
+ def cell(how={}, what=nil)
43
+ specifiers = format_specifiers([:th, :td], how, what)
44
+ index = specifiers.delete(:index) || 0
45
+ cells(specifiers)[index]
46
+ end
47
+ end
48
+
49
+ module TableRowsContainer
50
+ include TableElementsContainer
51
+
52
+ def rows(how={}, what=nil)
53
+ assert_exists
54
+ table_elements(TableRowCollection, [:tr], how, what, @o.rows)
55
+ end
56
+
57
+ def row(how={}, what=nil)
58
+ specifiers = format_specifiers([:tr], how, what)
59
+ index = specifiers.delete(:index) || 0
60
+ rows(specifiers)[index]
61
+ end
62
+ end
63
+
64
+ # This class is used for dealing with tables.
65
+ # Normally a user would not need to create this object as it is returned by the Watir::Container#table method
66
+ #
67
+ # many of the methods available to this object are inherited from the Element class
68
+ #
69
+ class Table < Element
70
+ include TableContainer
71
+ include TableRowsContainer
72
+ include TableCellsContainer
73
+
74
+ attr_ole :rules
75
+
76
+ # override the highlight method, as if the tables rows are set to have a background color,
77
+ # this will override the table background color, and the normal flash method won't work
78
+ def highlight(set_or_clear)
79
+ if set_or_clear == :set
80
+ begin
81
+ @original_border = @o.border.to_i
82
+ if @o.border.to_i==1
83
+ @o.border = 2
84
+ else
85
+ @o.border = 1
86
+ end
87
+ rescue
88
+ @original_border = nil
89
+ end
90
+ else
91
+ begin
92
+ @o.border= @original_border unless @original_border == nil
93
+ @original_border = nil
94
+ rescue
95
+ # we could be here for a number of reasons...
96
+ ensure
97
+ @original_border = nil
98
+ end
99
+ end
100
+ super
101
+ end
102
+
103
+ # this method is used to populate the properties in the to_s method
104
+ def table_string_creator
105
+ n = []
106
+ n << "rows:".ljust(TO_S_SIZE) + self.row_count.to_s
107
+ n << "cols:".ljust(TO_S_SIZE) + self.column_count.to_s
108
+ return n
109
+ end
110
+ private :table_string_creator
111
+
112
+ # returns the properties of the object in a string
113
+ # raises an ObjectNotFound exception if the object cannot be found
114
+ def to_s
115
+ assert_exists
116
+ r = string_creator
117
+ r += table_string_creator
118
+ return r.join("\n")
119
+ end
120
+
121
+ # Returns the number of rows inside the table, including rows in nested tables.
122
+ def row_count
123
+ assert_exists
124
+ rows.length
125
+ end
126
+
127
+ # This method returns the number of columns in a row of the table.
128
+ # Raises an UnknownObjectException if the table doesn't exist.
129
+ # * index - the index of the row
130
+ def column_count(index=0)
131
+ assert_exists
132
+ rows[index].cells.length
133
+ end
134
+
135
+ # Returns an array containing all the text values in the specified column
136
+ # Raises an UnknownCellException if the specified column does not exist in every
137
+ # Raises an UnknownObjectException if the table doesn't exist.
138
+ # row of the table
139
+ # * columnnumber - column index to extract values from
140
+ def column_values(columnnumber)
141
+ return (0..row_count - 1).collect {|i| self[i][columnnumber].text}
142
+ end
143
+
144
+ # Returns an array containing all the text values in the specified row
145
+ # Raises an UnknownObjectException if the table doesn't exist.
146
+ # * rownumber - row index to extract values from
147
+ def row_values(rownumber)
148
+ return (0..column_count(rownumber) - 1).collect {|i| self[rownumber][i].text}
149
+ end
150
+
151
+ def hashes
152
+ assert_exists
153
+
154
+ headers = []
155
+ @o.rows.item(0).cells.each do |cell|
156
+ headers << TableCell.new(self, :ole_object => cell).text
157
+ end
158
+
159
+ rows_memo = []
160
+ i = 0
161
+ @o.rows.each do |row|
162
+ next if row.uniqueID == @o.rows.item(0).uniqueID
163
+
164
+ cells_memo = {}
165
+ cells = row.cells
166
+ raise "row at index #{i} has #{cells.length} cells, expected #{headers.length}" if cells.length < headers.length
167
+
168
+ j = 0
169
+ cells.each do |cell|
170
+ cells_memo[headers[j]] = TableCell.new(self, :ole_object => cell).text
171
+ j += 1
172
+ end
173
+
174
+ rows_memo << cells_memo
175
+ i += 1
176
+ end
177
+ rows_memo
178
+ end
179
+ end
180
+
181
+ class TableSection < Element
182
+ include TableContainer
183
+ include TableRowsContainer
184
+ include TableCellsContainer
185
+ end
186
+
187
+ class TableRow < Element
188
+ include TableCellsContainer
189
+
190
+ # this method iterates through each of the cells in the row. Yields a TableCell object
191
+ def each
192
+ locate
193
+ cells.each {|cell| yield cell}
194
+ end
195
+
196
+ # Returns an element from the row as a TableCell object
197
+ def [](index)
198
+ assert_exists
199
+ if cells.length <= index
200
+ raise UnknownCellException, "Unable to locate a cell at index #{index}"
201
+ end
202
+ return cells[index]
203
+ end
204
+
205
+ def column_count
206
+ assert_exists
207
+ cells.length
208
+ end
209
+
210
+ end
211
+
212
+ # this class is a table cell - when called via the Table object
213
+ class TableCell < Element
214
+ attr_ole :headers
215
+
216
+ alias_method :to_s, :text
217
+
218
+ def colspan
219
+ locate
220
+ @o.colSpan
221
+ end
222
+ end
223
+
224
+ end
@@ -0,0 +1,97 @@
1
+ require 'test/unit'
2
+ require 'watir-classic/assertions'
3
+
4
+ module Watir
5
+
6
+ # This is a 'test/unit' testcase customized to exeucte test methods sequentially by default
7
+ # and extra assertions
8
+ #
9
+ # Example Usage
10
+ #
11
+ # require 'watir-classic/testcase'
12
+ #
13
+ # class MyTestCase < Watir::TestCase
14
+ #
15
+ # # some helpers
16
+ # @@browser = nil
17
+ # def browser
18
+ # @browser ||= Watir::IE.start(:url, 'http://watir.com/")
19
+ # end
20
+ #
21
+ # # TESTS
22
+ # def test_text
23
+ # browser.goto "http://watir.com/"
24
+ # verify_match "Web Application Testing in Ruby", browser.text
25
+ # end
26
+ #
27
+ # def test_title
28
+ # verify browser.title == 'Watir'
29
+ # end
30
+ #
31
+ # def test_link
32
+ # verify_match 'watir.com', browser.link(:text, 'Home').href
33
+ # end
34
+ #
35
+ # def test_navigate_to_examples
36
+ # browser.div(:id, 'nav').link(:text, 'Examples').click
37
+ # end
38
+ #
39
+ # def test_url
40
+ # verify_equal browser.url, 'http://watir.com/examples/'
41
+ # end
42
+ #
43
+ # end
44
+ #
45
+ class TestCase < Test::Unit::TestCase
46
+ include Watir::Assertions
47
+ @@order = :sequentially
48
+ def initialize name
49
+ throw :invalid_test if name == :default_test && self.class == Watir::TestCase
50
+ super
51
+ end
52
+ class << self
53
+ attr_accessor :test_methods, :order
54
+ def test_methods
55
+ @test_methods ||= []
56
+ end
57
+ def order
58
+ @order || @@order
59
+ end
60
+ def default_order= order
61
+ @@order = order
62
+ end
63
+ def sorted_test_methods
64
+ case order
65
+ when :alphabetically then test_methods.sort
66
+ when :sequentially then test_methods
67
+ when :reversed_sequentially then test_methods.reverse
68
+ when :reversed_alphabetically then test_methods.sort.reverse
69
+ else raise ArgumentError, "Execute option not supported: #{@order}"
70
+ end
71
+ end
72
+ def suite
73
+ suite = Test::Unit::TestSuite.new(name)
74
+ sorted_test_methods.each do |test|
75
+ catch :invalid_test do
76
+ suite << new(test)
77
+ end
78
+ end
79
+ if (suite.empty?)
80
+ catch :invalid_test do
81
+ suite << new(:default_test)
82
+ end
83
+ end
84
+ return suite
85
+ end
86
+ def method_added id
87
+ name = id.id2name
88
+ test_methods << name if name =~ /^test./
89
+ end
90
+ def execute order
91
+ @order = order
92
+ end
93
+ end
94
+ public :add_assertion
95
+ end
96
+
97
+ end
@@ -0,0 +1,35 @@
1
+ module Watir
2
+ class Util
3
+ class << self
4
+ #
5
+ # "Watir::Span" => "Span"
6
+ #
7
+ def demodulize(str)
8
+ str.gsub(/^.*::/, '')
9
+ end
10
+
11
+ #
12
+ # "FooBar" => "foo_bar"
13
+ #
14
+ def underscore(str)
15
+ str.gsub(/\B[A-Z][^A-Z]/, '_\&').downcase.gsub(' ', '_')
16
+ end
17
+
18
+ #
19
+ # "Checkboxes" => "Checkbox"
20
+ # "Bodies" => "Body"
21
+ # "Buttons" => "Button"
22
+ #
23
+ def singularize(str)
24
+ case str.downcase
25
+ when "checkboxes"
26
+ str.chop.chop
27
+ when "bodies"
28
+ str.chop.chop.chop + "y"
29
+ else
30
+ str.chop
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+ module Watir
2
+ version_file = File.dirname(__FILE__) + '/../../VERSION'
3
+ VERSION = File.exists?(version_file) ? File.read(version_file).strip : "0.0.0"
4
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ module Watir
4
+ module Wait
5
+ extend self
6
+
7
+ class TimeoutError < StandardError
8
+ end
9
+
10
+ #
11
+ # Wait until the block evaluates to true or times out.
12
+ #
13
+
14
+ def until(timeout = 60, &block)
15
+ end_time = ::Time.now + timeout
16
+
17
+ until ::Time.now > end_time
18
+ result = yield(self)
19
+ return result if result
20
+ sleep 0.1
21
+ end
22
+
23
+ raise TimeoutError, "timed out after #{timeout} seconds"
24
+ end
25
+
26
+ #
27
+ # Wait while the block evaluates to true or times out.
28
+ #
29
+ def while(timeout = 60, &block)
30
+ end_time = ::Time.now + timeout
31
+
32
+ until ::Time.now > end_time
33
+ return unless yield(self)
34
+ sleep 0.1
35
+ end
36
+
37
+ raise TimeoutError, "timed out after #{timeout} seconds"
38
+ end
39
+
40
+ end # Wait
41
+ end # Watir
@@ -0,0 +1,12 @@
1
+ # include this module if there's a need to have wait_until and wait_while methods in some different scope
2
+ module Watir
3
+ module WaitHelper
4
+ def wait_until(*args, &blk)
5
+ Wait.until(*args, &blk)
6
+ end
7
+
8
+ def wait_while(*args, &blk)
9
+ Wait.while(*args, &blk)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,98 @@
1
+ #######
2
+ #
3
+ # Using Watir::Waiter is DEPRECATED and will be removed in some newer version of Watir! Use Watir::Wait and Watir::ElementExtensions methods instead!
4
+ #
5
+ #######
6
+ require 'watir-classic/exceptions'
7
+
8
+ module Watir
9
+
10
+ def wait_until(*args)
11
+ Waiter.wait_until(*args) {yield}
12
+ end
13
+
14
+ class TimeKeeper
15
+ attr_reader :sleep_time
16
+ def initialize
17
+ @sleep_time = 0.0
18
+ end
19
+ def sleep seconds
20
+ @sleep_time += Kernel.sleep seconds
21
+ end
22
+ def now
23
+ ::Time.now
24
+ end
25
+ end
26
+
27
+ class Waiter
28
+ # This is an interface to a TimeKeeper which proxies
29
+ # calls to "sleep" and "Time.now".
30
+ # Useful for unit testing Waiter.
31
+ attr_accessor :timer
32
+
33
+ # How long to wait between each iteration through the wait_until
34
+ # loop. In seconds.
35
+ attr_accessor :polling_interval
36
+
37
+ # Timeout for wait_until.
38
+ attr_accessor :timeout
39
+
40
+ @@default_polling_interval = 0.5
41
+ @@default_timeout = 60.0
42
+
43
+ def initialize(timeout=@@default_timeout,
44
+ polling_interval=@@default_polling_interval)
45
+ Kernel.warn "Using Watir::Waiter is DEPRECATED and will be removed in some newer version of Watir! Use Watir::Wait and Watir::ElementExtensions methods instead!"
46
+ @timeout = timeout
47
+ @polling_interval = polling_interval
48
+ @timer = TimeKeeper.new
49
+ end
50
+
51
+ # Execute the provided block until either (1) it returns true, or
52
+ # (2) the timeout (in seconds) has been reached. If the timeout is reached,
53
+ # a TimeOutException will be raised. The block will always
54
+ # execute at least once.
55
+ #
56
+ # waiter = Waiter.new(5)
57
+ # waiter.wait_until {puts 'hello'}
58
+ #
59
+ # This code will print out "hello" for five seconds, and then raise a
60
+ # Watir::TimeOutException.
61
+ def wait_until # block
62
+ start_time = now
63
+ until yield do
64
+ if (duration = now - start_time) > @timeout
65
+ raise Watir::Exception::TimeOutException.new(duration, @timeout),
66
+ "Timed out after #{duration} seconds."
67
+ end
68
+ sleep @polling_interval
69
+ end
70
+ end
71
+
72
+ # Execute the provided block until either (1) it returns true, or
73
+ # (2) the timeout (in seconds) has been reached. If the timeout is reached,
74
+ # a TimeOutException will be raised. The block will always
75
+ # execute at least once.
76
+ #
77
+ # Waiter.wait_until(5) {puts 'hello'}
78
+ #
79
+ # This code will print out "hello" for five seconds, and then raise a
80
+ # Watir::TimeOutException.
81
+
82
+ # IDEA: wait_until: remove defaults from Waiter.wait_until
83
+ def self.wait_until(timeout=@@default_timeout,
84
+ polling_interval=@@default_polling_interval)
85
+ waiter = new(timeout, polling_interval)
86
+ waiter.wait_until { yield }
87
+ end
88
+
89
+ private
90
+ def sleep seconds
91
+ @timer.sleep seconds
92
+ end
93
+ def now
94
+ @timer.now
95
+ end
96
+ end
97
+
98
+ end # module