rwebspec-webdriver 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,12 @@
1
+ CHANGELOG
2
+ =========
3
+
4
+ == 0.1.2
5
+ * Remove assert_link_present_with_exact, add opts[:partial]
6
+ * Rewrite assert_hidden, assert_enabled...
7
+ * Add assert test
8
+
9
+ == 0.1.0
10
+
11
+ * Initial release.
12
+ * Most common web actions and assertions implemented.
data/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2006-2008 Zhimin Zhan, zhimin@zhimin.com
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
data/README ADDED
@@ -0,0 +1,41 @@
1
+
2
+ RWebSpec wraps the popular web testing framework WATIR with RSpec Syntax to provide better easy to read automated web test cases. By using TestWise/Watir recorder, the RWebSpec test scripts can be recorded in Firefox. TestWise, The Next-Generation Functional Testing IDE, makes editing/executing test cases with ease.
3
+
4
+ Sample RWebSpec Test:
5
+
6
+ load File.dirname(__FILE__) + '/test_helper.rb'
7
+
8
+ specification "User Profile" do
9
+ include TestHelper
10
+
11
+ before(:all) do
12
+ open_browser("http://demo.adminwise.com")
13
+ reset_database
14
+ end
15
+
16
+ after(:all) do
17
+ fail_safe { logout }
18
+ end
19
+
20
+ story "[8] User can change password" do
21
+ login_as("bob", "password")
22
+ click_link("Profile")
23
+ click_link("Change password")
24
+
25
+ password_change_page = expect_page PasswordChangePage
26
+ password_change_page.enter_current("password")
27
+ password_change_page.enter_new("newpass")
28
+ password_change_page.enter_confirm("newpass")
29
+ password_change_page.click_button("Change")
30
+
31
+ logout
32
+ login_as("bob", "newpass")
33
+ assert_link_present_with_text("Profile") # login Ok
34
+ end
35
+
36
+ end
37
+
38
+
39
+
40
+ TestWise Homepage: http://www.testwisely.com/en/testwise
41
+
data/Rakefile ADDED
@@ -0,0 +1,99 @@
1
+ require 'rubygems'
2
+ require 'spec/rake/spectask'
3
+ require 'rdoc/task'
4
+ require 'rake/gempackagetask'
5
+ require 'rdoc' # require rdoc 2
6
+ gem 'darkfish-rdoc'
7
+ # require 'darkfish-rdoc'
8
+
9
+ $:.unshift(File.dirname(__FILE__) + "/lib")
10
+ #require 'rwebspec'
11
+
12
+ desc "Default task"
13
+ task :default => [ :clean, :spec, :rdoc, :chm, :gem]
14
+
15
+ desc "Continous build"
16
+ task :build => [:clean, :spec]
17
+
18
+ desc "Clean generated files"
19
+ task :clean do
20
+ rm_rf 'pkg'
21
+ rm_rf 'doc'
22
+ rm_rf 'chm'
23
+ end
24
+
25
+ desc 'Run all specs'
26
+ Spec::Rake::SpecTask.new('spec') do |t|
27
+ t.spec_opts = ['--format', 'specdoc', '--colour']
28
+ # t.libs = ["lib", "server/lib" ]
29
+ t.spec_files = Dir['spec/**/*_spec.rb'].sort
30
+ end
31
+
32
+ # Generate the RDoc documentation
33
+ # Rake::RDocTask.new { |rdoc|
34
+ # rdoc.rdoc_dir = 'doc'
35
+ # rdoc.title = 'rWebUnit'
36
+ # rdoc.template = "#{ENV['template']}.rb" if ENV['template']
37
+ # rdoc.rdoc_files.include('README')
38
+ # rdoc.rdoc_files.include('lib/rwebspec.rb')
39
+ # rdoc.rdoc_files.include('lib/rwebspec/*.rb')
40
+ # }
41
+
42
+ # using DarkFish - http://deveiate.org/projects/Darkfish-Rdoc/
43
+ Rake::RDocTask.new do |rdoc|
44
+ rdoc.rdoc_dir = 'doc'
45
+ rdoc.title = 'RWebSpec'
46
+ rdoc.rdoc_files.include('lib/rwebspec.rb')
47
+ rdoc.rdoc_files.include('lib/rwebspec/*.rb')
48
+ rdoc.rdoc_files.delete("lib/rwebspec/web_testcase.rb")
49
+ rdoc.rdoc_files.delete("lib/rwebspec/checkJSDialog.rb")
50
+ rdoc.options += [
51
+ '-SHN',
52
+ '-f', 'darkfish', # This is the important bit
53
+ ]
54
+ end
55
+
56
+ Rake::RDocTask.new("chm") do |rdoc|
57
+ rdoc.rdoc_dir = 'chm'
58
+ rdoc.title = 'RWebSpec'
59
+ rdoc.rdoc_files.include('lib/rwebspec.rb')
60
+ rdoc.rdoc_files.include('lib/rwebspec/*.rb')
61
+ rdoc.rdoc_files.delete("lib/rwebspec/web_testcase.rb")
62
+ rdoc.rdoc_files.delete("lib/rwebspec/checkJSDialog.rb")
63
+ rdoc.options += [
64
+ '-SHN',
65
+ '-f', 'chm', # This is the important bit
66
+ ]
67
+ end
68
+
69
+
70
+ spec = Gem::Specification.new do |s|
71
+ s.platform= Gem::Platform::RUBY
72
+ s.name = "rwebspec-webdriver"
73
+ s.version = "0.1"
74
+ s.summary = "Executable functional specification for web applications in RSpec syntax and Selenium-WebDriver"
75
+ # s.description = ""
76
+
77
+ s.author = "Zhimin Zhan"
78
+ s.email = "zhimin@agileway.net"
79
+ s.homepage= "http://github.com/zhimin/rwebspec-webdriver/tree/master"
80
+ s.rubyforge_project = "rwebspec-webdrive"
81
+
82
+ s.has_rdoc = true
83
+ s.requirements << 'none'
84
+ s.require_path = "lib"
85
+ s.autorequire = "rwebspec-webdriver"
86
+
87
+ s.files = [ "Rakefile", "README", "CHANGELOG", "MIT-LICENSE" ]
88
+ s.files = s.files + Dir.glob( "lib/**/*" )
89
+ s.files = s.files + Dir.glob( "test/**/*" )
90
+ s.files = s.files + Dir.glob( "sample/**/*")
91
+ s.files = s.files + Dir.glob( "docs/**/*" )
92
+ s.add_dependency(%q<rspec>, ["= 1.1.12"])
93
+
94
+ s.add_dependency("commonwatir", ">= 1.6.5")
95
+ end
96
+
97
+ Rake::GemPackageTask.new(spec) do |pkg|
98
+ pkg.need_zip = true
99
+ end
@@ -0,0 +1,51 @@
1
+ module Spec
2
+ module Extensions
3
+ module Main
4
+
5
+ alias :spec :describe
6
+ alias :specification :describe
7
+ alias :test_suite :describe
8
+ alias :suite :describe
9
+
10
+ end
11
+ end
12
+ end
13
+
14
+ # For RSpec 1.1.12
15
+ module Spec
16
+ module DSL
17
+ module Main
18
+
19
+ alias :spec :describe
20
+ alias :specification :describe
21
+ alias :test_suite :describe
22
+ alias :suite :describe
23
+
24
+ end
25
+ end
26
+ end
27
+
28
+ # ZZ patches to RSpec 1.1.4
29
+ # - add to_s method to example_group
30
+ module Spec
31
+ module Example
32
+ class ExampleGroup
33
+ def to_s
34
+ @_defined_description
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ module Spec
41
+ module Example
42
+ module ExampleGroupMethods
43
+
44
+ alias_method :scenario, :it
45
+ alias_method :story, :it
46
+ alias_method :test_case, :it
47
+ alias_method :use_case, :it
48
+ alias_method :test, :it
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,52 @@
1
+ #***********************************************************
2
+ #* Copyright (c) 2006 - 2009, Zhimin Zhan.
3
+ #* Distributed open-source, see full license in MIT-LICENSE
4
+ #***********************************************************
5
+
6
+ require 'rubygems'
7
+
8
+ # Load active_support, so that we can use 1.days.ago
9
+ begin
10
+ require 'active_support/basic_object'
11
+ require 'active_support/duration'
12
+ rescue LoadError => no_as1_err
13
+ # active_support 2.0 loaded error
14
+ end
15
+ require 'active_support/core_ext'
16
+ require 'spec'
17
+ require 'selenium-webdriver'
18
+
19
+ unless defined? RWEBSPEC_VERSION
20
+ RWEBSPEC_VERSION = "0.1"
21
+ end
22
+
23
+
24
+ if RUBY_PLATFORM =~ /mswin/ or RUBY_PLATFORM =~ /mingw/
25
+ $testwise_screenshot_supported = false
26
+ begin
27
+ require 'win32/screenshot'
28
+ $testwise_screenshot_supported = true
29
+ rescue LoadError => no_screen_library_error
30
+ end
31
+ end
32
+
33
+ # Extra full path to load libraries
34
+ require File.dirname(__FILE__) + "/rwebspec/using_pages"
35
+ require File.dirname(__FILE__) + "/rwebspec/test_utils"
36
+ require File.dirname(__FILE__) + "/rwebspec/web_page"
37
+ require File.dirname(__FILE__) + "/rwebspec/assert"
38
+ require File.dirname(__FILE__) + "/rwebspec/web_browser"
39
+ require File.dirname(__FILE__) + "/rwebspec/driver"
40
+ # require File.dirname(__FILE__) + "/rwebspec/test_script"
41
+ require File.dirname(__FILE__) + "/rwebspec/context"
42
+ require File.dirname(__FILE__) + "/rwebspec/rspec_helper"
43
+ # require File.dirname(__FILE__) + "/rwebspec/load_test_helper"
44
+ require File.dirname(__FILE__) + "/rspec_extensions"
45
+ require File.dirname(__FILE__) + "/webdriver_extensions"
46
+ if RUBY_PLATFORM =~ /mswin/ or RUBY_PLATFORM =~ /mingw/
47
+ require File.dirname(__FILE__) + "/window_script_extensions.rb"
48
+ end
49
+
50
+ require File.dirname(__FILE__) + "/rwebspec/matchers/contains_text"
51
+ require File.dirname(__FILE__) + "/rwebspec/testwise_plugin"
52
+
@@ -0,0 +1,443 @@
1
+ require 'test/unit/assertions'
2
+
3
+ # http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/SearchContext.html#find_element-instance_method
4
+
5
+ module RWebSpec
6
+ module Assert
7
+ include Test::Unit::Assertions
8
+
9
+ def assert_not(condition, msg = "")
10
+ perform_assertion { assert(!condition, msg) }
11
+ end
12
+
13
+ def assert_nil(actual, msg="")
14
+ perform_assertion { assert(actual.nil?, msg) }
15
+ end
16
+
17
+ def assert_not_nil(actual, msg="")
18
+ perform_assertion { assert(!actual.nil?, msg) }
19
+ end
20
+
21
+ def fail(message)
22
+ perform_assertion { assert(false, message) }
23
+ end
24
+
25
+ # assertions
26
+ def assert_title_equals(title)
27
+ assert_equals(title, @web_browser.page_title)
28
+ end
29
+
30
+ alias assert_title assert_title_equals
31
+
32
+ # Assert text present in page source (html)
33
+ # assert_text_in_page_source("<b>iTest2</b> Cool") # <b>iTest2</b> Cool
34
+ def assert_text_in_page_source(text)
35
+ perform_assertion { assert((@web_browser.page_source.include? text), 'expected html: ' + text + ' not found') }
36
+ end
37
+
38
+ # Assert text not present in page source (html)
39
+ # assert_text_not_in_page_source("<b>iTest2</b> Cool") # <b>iTest2</b> Cool
40
+ def assert_text_not_in_page_source(text)
41
+ perform_assertion { assert(!(@web_browser.page_source.include? text), 'expected html: ' + text + ' found') }
42
+ end
43
+
44
+ # Assert text present in page source (html)
45
+ # assert_text_present("iTest2 Cool") # <b>iTest2</b> Cool
46
+ def assert_text_present(text)
47
+ perform_assertion { assert((@web_browser.text.include? text), 'expected text: ' + text + ' not found') }
48
+ end
49
+
50
+ # Assert text not present in page source (html)
51
+ # assert_text_not_present("iTest2 Cool") # <b>iTest2</b> Cool
52
+ def assert_text_not_present(text)
53
+ perform_assertion { assert(!(@web_browser.text.include? text), 'expected text: ' + text + ' found') }
54
+ end
55
+
56
+
57
+ ##
58
+ # Link
59
+ # @NOTE: this is different from Watir version
60
+
61
+ # Assert a link containing specified text in the page
62
+ #
63
+ # <a href="">Click Me</a>
64
+ # assert_link_present_with_text("Click ") # =>
65
+ #
66
+ def assert_link_present_with_text(link_text, opts = {})
67
+ begin
68
+ if opts && opts[:partial]
69
+ elem = @web_browser.find_element(:partial_link_text, link_text)
70
+ else
71
+ elem = @web_browser.find_element(:link_text, link_text)
72
+ end
73
+ rescue => e
74
+ puts "Failed to find the link text :#{e}"
75
+ end
76
+
77
+ if elem
78
+ return true
79
+ else
80
+ fail("can't find the link with text: #{link_text}")
81
+ end
82
+ end
83
+
84
+ def assert_link_not_present_with_text(link_text, opts = {})
85
+ begin
86
+ if opts && opts[:partial]
87
+ elem = @web_browser.find_element(:partial_link_text, link_text)
88
+ else
89
+ elem = @web_browser.find_element(:link_text, link_text)
90
+ end
91
+ rescue => e
92
+ puts "Failed to find the link text :#{e}"
93
+ end
94
+ if elem
95
+ fail("unexpected link (exact): #{link_text} found")
96
+ else
97
+ return true
98
+ end
99
+ end
100
+
101
+
102
+ ##
103
+ # Checkbox
104
+ def assert_checkbox_not_selected(checkbox_name)
105
+ elem = find_element(:name, checkbox_name)
106
+ fail "Checkbox with name:#{checkbox_name} not found" unless elem.tag_name == "input"
107
+ assert !elem.selected?
108
+ end
109
+
110
+ alias assert_checkbox_not_checked assert_checkbox_not_selected
111
+
112
+ def assert_checkbox_selected(checkbox_name)
113
+ elem = find_element(:name, checkbox_name)
114
+ fail "Checkbox with name:#{checkbox_name} not found" unless elem.tag_name == "input"
115
+ assert elem.selected?
116
+ end
117
+
118
+ alias assert_checkbox_checked assert_checkbox_selected
119
+
120
+ ##
121
+ # select
122
+ def assert_option_value_not_present(select_name, option_value)
123
+ select_element = find_element(:name, select_name)
124
+ options = select_element.find_elements(:xpath, ".//option")
125
+ option_values = options.collect { |x| x.attribute('value') }
126
+ if option_values.include?(option_value)
127
+ fail "Unexpected select option value #{option_value}"
128
+ else
129
+ return true
130
+ end
131
+ end
132
+
133
+ alias assert_select_value_not_present assert_option_value_not_present
134
+
135
+ def assert_option_not_present(select_name, option_label)
136
+ select_element = find_element(:name, select_name)
137
+ options = select_element.find_elements(:xpath, ".//option")
138
+ option_labels= options.collect { |x| x.attribute('value') }
139
+ if option_labels.include?(option_label)
140
+ fail "Unexpected select option label #{option_label}"
141
+ else
142
+ return true
143
+ end
144
+ end
145
+
146
+ alias assert_select_label_not_present assert_option_not_present
147
+
148
+ def assert_option_value_present(select_name, option_value)
149
+ select_element = find_element(:name, select_name)
150
+ options = select_element.find_elements(:xpath, ".//option")
151
+ option_values = options.collect { |x| x.attribute('value') }
152
+ if option_values.include?(option_value)
153
+ return true
154
+ else
155
+ fail "Unexpected select option value #{option_value}"
156
+ end
157
+ end
158
+
159
+ alias assert_select_value_present assert_option_value_present
160
+ alias assert_menu_value_present assert_option_value_present
161
+
162
+ def assert_option_present(select_name, option_label)
163
+ select_element = find_element(:name, select_name)
164
+ options = select_element.find_elements(:xpath, ".//option")
165
+ option_labels = options.collect { |x| x.text }
166
+ if option_labels.include?(option_label)
167
+ return true
168
+ else
169
+ fail "Unexpected select option label #{option_label}"
170
+ end
171
+ end
172
+
173
+ alias assert_select_label_present assert_option_present
174
+ alias assert_menu_label_present assert_option_present
175
+
176
+ def assert_option_equals(select_name, option_label)
177
+ select_element = find_element(:name, select_name)
178
+ options = select_element.find_elements(:xpath, ".//option")
179
+ selected_label_list = []
180
+ options.each do |op|
181
+ selected_label_list << op.text if op.selected?
182
+ end
183
+ assert selected_label_list.join(",").to_s == option_label
184
+ end
185
+
186
+ alias assert_select_label assert_option_equals
187
+ alias assert_menu_label assert_option_equals
188
+
189
+ def assert_option_value_equals(select_name, option_value)
190
+ select_element = find_element(:name, select_name)
191
+ options = select_element.find_elements(:xpath, ".//option")
192
+ selected_value_list = []
193
+ options.each do |op|
194
+ selected_value_list << op.attribute('value') if op.selected?
195
+ end
196
+ assert selected_value_list.join(",").to_s == option_value
197
+ end
198
+
199
+ alias assert_select_value assert_option_value_equals
200
+ alias assert_menu_value assert_option_value_equals
201
+
202
+ ##
203
+ # radio
204
+
205
+ # radio_group is the name field, radio options 'value' field
206
+ def assert_radio_option_not_present(radio_group, radio_option)
207
+ begin
208
+ elem = find_element(:xpath, "//input[@type='radio' and @name='#{radio_group}' and @value='#{radio_option}']")
209
+ rescue => e
210
+ end
211
+
212
+ if elem
213
+ fail("unexpected radio option: " + radio_option + " found")
214
+ else
215
+ return true
216
+ end
217
+ end
218
+
219
+ def assert_radio_option_present(radio_group, radio_option)
220
+ elem = find_element(:xpath, "//input[@type='radio' and @name='#{radio_group}' and @value='#{radio_option}']")
221
+ if elem
222
+ return true
223
+ else
224
+ fail("can't find the radio option : '#{radio_option}'")
225
+ end
226
+ end
227
+
228
+ def assert_radio_option_selected(radio_group, radio_option)
229
+ elem = find_element(:xpath, "//input[@type='radio' and @name='#{radio_group}' and @value='#{radio_option}']")
230
+ assert elem.selected?
231
+ end
232
+
233
+ alias assert_radio_button_checked assert_radio_option_selected
234
+ alias assert_radio_option_checked assert_radio_option_selected
235
+
236
+ def assert_radio_option_not_selected(radio_group, radio_option)
237
+ elem = find_element(:xpath, "//input[@type='radio' and @name='#{radio_group}' and @value='#{radio_option}']")
238
+ assert !elem.selected?
239
+ end
240
+
241
+ alias assert_radio_button_not_checked assert_radio_option_not_selected
242
+ alias assert_radio_option_not_checked assert_radio_option_not_selected
243
+
244
+ ##
245
+ # Button
246
+
247
+ def assert_button_present(button_id)
248
+ find_element(:id, button_id)
249
+ end
250
+
251
+ def assert_button_not_present(button_id)
252
+ elem = safe_find_element_by_id(button_id)
253
+ if elem && elem.tag_name == "button" then
254
+ fail("Unexpected button with this id: #{button_id}")
255
+ end
256
+ return true
257
+ end
258
+
259
+ def assert_button_present_with_text(button_text)
260
+ input_buttons = find_elements(:xpath, "//input[@type = 'button' or @type = 'submit']")
261
+ input_button_values = input_buttons.collect { |x| x.attribute('value') }
262
+ if input_button_values.include?(button_text)
263
+ return true
264
+ else
265
+ #TODO check for just <button tag
266
+ fail("can't find the button with text: #{button_text}")
267
+ end
268
+ end
269
+
270
+ def assert_button_not_present_with_text(button_text)
271
+ input_buttons = find_elements(:xpath, "//input[@type = 'button' or @type = 'submit']")
272
+ input_button_values = input_buttons.collect { |x| x.attribute('value') }
273
+ if input_button_values.include?(button_text)
274
+ fail("can't find the button with text: #{button_text}")
275
+ else
276
+ #TODO check for just <button tag
277
+ return true
278
+ end
279
+ end
280
+
281
+ ## General
282
+ #
283
+
284
+ def assert_equals(expected, actual, msg=nil)
285
+ perform_assertion { assert(expected == actual, (msg.nil?) ? "Expected: #{expected} diff from actual: #{actual}" : msg) }
286
+ end
287
+
288
+
289
+ # Check a HTML element exists or not
290
+ # Example:
291
+ # assert_exists("label", "receipt_date")
292
+ # assert_exists(:span, :receipt_date)
293
+ def assert_exists(tag, element_id)
294
+ elem = find_element(:id, element_id)
295
+ if elem
296
+ return true
297
+ else
298
+ fail("Element '#{tag}' with id: '#{element_id}' not found")
299
+ end
300
+ end
301
+
302
+ alias assert_exists? assert_exists
303
+ alias assert_element_exists assert_exists
304
+
305
+ def assert_not_exists(tag, element_id)
306
+ elem = find_element(:id, element_id)
307
+ if elem
308
+ fail("#{tag} with #{element_id} not expected there, but exists")
309
+ else
310
+ return true
311
+ end
312
+ end
313
+
314
+ alias assert_not_exists? assert_not_exists
315
+ alias assert_element_not_exists? assert_not_exists
316
+
317
+
318
+ # Assert tag with element id is visible?, eg.
319
+ # assert_visible(:div, "public_notice")
320
+ # assert_visible(:span, "public_span")
321
+ def assert_visible(tag, element_id)
322
+ element = find_element(:id, element_id)
323
+ perform_assertion { assert(element.displayed?, "Element '#{tag}' with id: '#{element_id}' not visible") }
324
+ end
325
+
326
+ # Assert tag with element id is hidden?, example
327
+ # assert_hidden(:div, "secret")
328
+ # assert_hidden(:span, "secret_span")
329
+ def assert_hidden(tag, element_id)
330
+ element = find_element(:id, element_id)
331
+ perform_assertion { assert(!element.displayed?, "Element '#{tag}' with id: '#{element_id}' is visible") }
332
+ end
333
+
334
+ alias assert_not_visible assert_hidden
335
+
336
+ def assert_disabled(tag, element_id)
337
+ element = find_element(:id, element_id)
338
+ assert !element.enabled?
339
+ end
340
+
341
+ def assert_enabled(tag, element_id)
342
+ element = find_element(:id, element_id)
343
+ puts "XXX :#{element.tag_name}"
344
+ assert element.enabled?
345
+ end
346
+
347
+
348
+ # Assert given text appear inside a table (inside <table> tag like below)
349
+ #
350
+ # <table id="t1">
351
+ #
352
+ # <tbody>
353
+ # <tr id="row_1">
354
+ # <td id="cell_1_1">A</td>
355
+ # <td id="cell_1_2">B</td>
356
+ # </tr>
357
+ # <tr id="row_2">
358
+ # <td id="cell_2_1">a</td>
359
+ # <td id="cell_2_2">b</td>
360
+ # </tr>
361
+ # </tbody>
362
+ #
363
+ # </table>
364
+ #
365
+ # The plain text view of above table
366
+ # A B a b
367
+ #
368
+ # Examples
369
+ # assert_text_present_in_table("t1", ">A<") # => true
370
+ # assert_text_present_in_table("t1", ">A<", :just_plain_text => true) # => false
371
+ def assert_text_present_in_table(table_id, text, options = {:just_plain_text => false})
372
+ perform_assertion { assert(table_source(table_id, options).include?(text), "the text #{text} not found in table #{table_id}") }
373
+ end
374
+
375
+ alias assert_text_in_table assert_text_present_in_table
376
+
377
+ def assert_text_not_present_in_table(table_id, text, options = {:just_plain_text => false})
378
+ perform_assertion { assert_not(table_source(table_id, options).include?(text), "the text #{text} not found in table #{table_id}") }
379
+ end
380
+
381
+ alias assert_text_not_in_table assert_text_not_present_in_table
382
+
383
+ # Assert a text field (with given name) has the value
384
+ #
385
+ # <input id="tid" name="text1" value="text already there" type="text">
386
+ #
387
+ # assert_text_field_value("text1", "text already there") => true
388
+ #
389
+ def assert_text_field_value(textfield_name, text)
390
+ perform_assertion { assert_equal(text, text_field(:name, textfield_name).attribute('value') ) }
391
+ end
392
+
393
+
394
+ #-- Not tested
395
+ # -----
396
+
397
+ def assert_text_in_element(element_id, text)
398
+ elem = element_by_id(element_id)
399
+ assert_not_nil(elem.innerText, "element #{element_id} has no text")
400
+ perform_assertion { assert(elem.innerText.include?(text), "the text #{text} not found in element #{element_id}") }
401
+ end
402
+
403
+ # Use
404
+ #
405
+
406
+ #TODO for drag-n-drop, check the postion in list
407
+ # def assert_position_in_list(list_element_id)
408
+ # raise "not implemented"
409
+ # end
410
+
411
+ private
412
+ def table_source(table_id, options)
413
+ elem_table = table(:id, table_id.to_s)
414
+ elem_table_text = elem_table.text
415
+ elem_table_html = is_firefox? ? elem_table.innerHTML : elem_table.html
416
+ table_source = options[:just_plain_text] ? elem_table_text : elem_table_html
417
+ end
418
+
419
+
420
+ def perform_assertion(&block)
421
+ begin
422
+ yield
423
+ return true
424
+ rescue StandardError => e
425
+ # puts "[DEBUG] Assertion error: #{e}"
426
+ take_screenshot
427
+ raise e
428
+ end
429
+ end
430
+
431
+ #
432
+ def safe_find_element_by_id(an_id)
433
+ begin
434
+ find_element(:id, an_id)
435
+ rescue => e
436
+ puts "Not found, but not throwing an error"
437
+ nil
438
+ end
439
+ end
440
+
441
+
442
+ end
443
+ end