rsel 0.0.5 → 0.0.6

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.
data/docs/history.md CHANGED
@@ -1,11 +1,20 @@
1
1
  Rsel History
2
2
  ============
3
3
 
4
+ 0.0.6
5
+ -----
6
+
7
+ - Added stop_on_error attribute to raise a StopTest exception when a step fails
8
+ - Allow execution of arbitrary Selenium::Client::Driver methods
9
+ - Separated support methods from SeleniumTest methods
10
+ - Fixed field_contains and field_equals so they fail when a field doesn't exist
11
+
12
+
4
13
  0.0.5
5
14
  -----
6
15
 
7
16
  - Allow Selenium-style locators beginning with id=, name=, xpath=, css= etc.
8
- - Raise a StopTest exception when Selenium is not running (requires updated rubyslim)
17
+ - Raise a StopTest exception when Selenium is not running
9
18
  - Locators are now documented
10
19
  - Example FitNesse tables are now included
11
20
 
data/docs/install.md CHANGED
@@ -1,5 +1,5 @@
1
- Installation & Configuration
2
- ----------------------------
1
+ Installation
2
+ ============
3
3
 
4
4
  To install Rsel from a gem:
5
5
 
data/docs/locators.md CHANGED
@@ -11,11 +11,11 @@ their `name` attribute. Given this HTML:
11
11
 
12
12
  <a name="contact_us_link" href="/contact">Contact Us</a>
13
13
 
14
- To click on the "Concact Us" link using a standard Selenium locator, you'd have
14
+ To click on the "Contact Us" link using a standard Selenium locator, you'd have
15
15
  to do one of the following:
16
16
 
17
- | click | contact_us_link |
18
- | click | link=Contact Us |
17
+ | Click | contact_us_link |
18
+ | Click | link=Contact Us |
19
19
 
20
20
  This is easy enough, but what if the target element does not have a `name`
21
21
  attribute defined? What if the link is an image instead of a piece of text? In
@@ -47,7 +47,7 @@ the `alt` text in the case of an image link. Form fields are matched on their
47
47
  plain-text label, `name` or `id` attribute. In Rsel, the above examples become
48
48
  much easier:
49
49
 
50
- | click | Contact Us |
50
+ | Click | Contact Us |
51
51
  | Type | Eric | into field | First name |
52
52
 
53
53
  This allows you to use human-readable locator strings for most HTML elements,
@@ -62,11 +62,12 @@ sense to write:
62
62
 
63
63
  | Type | Eric | into field | link=Contact Us |
64
64
 
65
- But Rsel won't stop you from trying! One drawback to this approach is that any
66
- [scoping](scoping.md) clause is ignored. In most cases, it's easier, safer, and
67
- more readable to use the plain text locator, and rely on Rsel's internal logic
68
- to find the correct element. This feature is only provided as a workaround for
69
- the possibility that Rsel's locator scheme is too restrictive for your needs.
65
+ But Rsel won't stop you from trying! One drawback to using explicit Selenium
66
+ locators is that any [scoping](scoping.md) clause is ignored. In most cases,
67
+ it's easier, safer, and more readable to use the plain text locator, and rely
68
+ on Rsel's internal logic to find the correct element. This feature is only
69
+ provided as a workaround for the possibility that Rsel's locator scheme is too
70
+ restrictive for your needs.
70
71
 
71
72
  Next: [Scoping](scoping.md)
72
73
 
data/docs/scoping.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Scoping
2
2
  =======
3
3
 
4
- Several of the actions and verifications accept an optional hash of scoping
4
+ Most of Rsel's actions and verifications accept an optional hash of scoping
5
5
  keywords, allowing you to be specific about what area of the page to operate
6
6
  on. This page describes how to use them.
7
7
 
@@ -96,7 +96,13 @@ contain URLs, email addresses, or other auto-interpreted text:
96
96
  Another important thing to note is that due to the way FitNesse Slim script
97
97
  tables are evaluated, the scoping hash must be added after a cell that contains
98
98
  part of the method name. Cells in these tables must contain alternating
99
- (function, argument) chunks; the way the above example breaks down is:
99
+ (function, argument) chunks. To illustrate, consider the phone number example:
100
+
101
+ | Type | 111-222-3333 | into | Phone number | field | !{within:work} |
102
+
103
+ The cells in this row alternate between function and argument, with the first
104
+ cell being the beginning of the function name, and every alternating cell after
105
+ that being a continuation of the function name. Picture it like this:
100
106
 
101
107
  | Type | | into | | field | |
102
108
  | | 111-222-3333 | | Phone number | | !{within:work} |
@@ -107,8 +113,8 @@ call row that does not end with a function-name component, you need to include
107
113
  a semicolon after the last function-name component, so all remaining cells will
108
114
  be treated as arguments. These are valid alternative ways of calling the same function:
109
115
 
110
- | Type | 111-222-3333 | into field; | Phone number | !{within:work |
111
- | Type into field; | 111-222-3333 | Phone number | !{within:work |
116
+ | Type | 111-222-3333 | into field; | Phone number | !{within:work} |
117
+ | Type into field; | 111-222-3333 | Phone number | !{within:work} |
112
118
 
113
119
  The `SeleniumTest` method names were, for the most part, crafted so that the
114
120
  alternating (function, argument) form reads the most naturally.
data/docs/usage.md CHANGED
@@ -3,8 +3,8 @@ Usage
3
3
 
4
4
  Once you have created your `SetUp` page, you can create sibling pages with
5
5
  tests in them. For instance, continuing with the example from
6
- [Installation & Configuration](install.md), your `SeleniumTests.LoginTest`
7
- might look like this:
6
+ [Installation](install.md), your `SeleniumTests.LoginTest` might look like
7
+ this:
8
8
 
9
9
  !| script | selenium test | http://www.mysite.com |
10
10
  | Open browser |
@@ -1,4 +1,6 @@
1
1
  module Rsel
2
2
  class LocatorNotFound < RuntimeError; end
3
- class StopTestSeleniumNotRunning < RuntimeError; end
3
+ class StopTestCannotConnect < RuntimeError; end
4
+ class StopTestSessionNotStarted < RuntimeError; end
5
+ class StopTestStepFailed < RuntimeError; end
4
6
  end
@@ -46,9 +46,11 @@ module Rsel
46
46
  :port => port,
47
47
  :browser => browser,
48
48
  :url => url)
49
+ @stop_on_error = false
49
50
  end
50
51
 
51
- attr_reader :url, :browser
52
+ attr_reader :url, :browser, :stop_on_error
53
+ attr_writer :stop_on_error
52
54
 
53
55
 
54
56
  # Start the session and open a browser to the URL defined at the start of
@@ -57,13 +59,14 @@ module Rsel
57
59
  # @example
58
60
  # | Open browser |
59
61
  #
60
- # @raise [StopTestSeleniumNotRunning] if Selenium connection cannot be made
62
+ # @raise [StopTestCannotConnect] if Selenium connection cannot be made
61
63
  #
62
64
  def open_browser
63
65
  begin
64
66
  @browser.start_new_browser_session
65
67
  rescue
66
- raise StopTestSeleniumNotRunning, "Could not start Selenium."
68
+ raise StopTestCannotConnect,
69
+ "Cannot connect to Selenium server at #{@browser.host}:#{@browser.port}"
67
70
  else
68
71
  visit @url
69
72
  end
@@ -144,7 +147,7 @@ module Rsel
144
147
  # | See | Welcome, Marcus |
145
148
  #
146
149
  def see(text)
147
- return @browser.text?(text)
150
+ pass_if @browser.text?(text)
148
151
  end
149
152
 
150
153
 
@@ -157,7 +160,7 @@ module Rsel
157
160
  # | Do not see | Take a hike |
158
161
  #
159
162
  def do_not_see(text)
160
- return !@browser.text?(text)
163
+ pass_if !@browser.text?(text)
161
164
  end
162
165
 
163
166
 
@@ -170,7 +173,7 @@ module Rsel
170
173
  # | See title | Our Homepage |
171
174
  #
172
175
  def see_title(title)
173
- return (@browser.get_title == title)
176
+ pass_if @browser.get_title == title
174
177
  end
175
178
 
176
179
 
@@ -183,7 +186,7 @@ module Rsel
183
186
  # | Do not see title | Someone else's homepage |
184
187
  #
185
188
  def do_not_see_title(title)
186
- return !(@browser.get_title == title)
189
+ pass_if !(@browser.get_title == title)
187
190
  end
188
191
 
189
192
 
@@ -201,7 +204,7 @@ module Rsel
201
204
  # @since 0.0.2
202
205
  #
203
206
  def link_exists(locator, scope={})
204
- return @browser.element?(loc(locator, 'link', scope))
207
+ pass_if @browser.element?(loc(locator, 'link', scope))
205
208
  end
206
209
 
207
210
 
@@ -219,7 +222,7 @@ module Rsel
219
222
  # @since 0.0.2
220
223
  #
221
224
  def button_exists(locator, scope={})
222
- return @browser.element?(loc(locator, 'button', scope))
225
+ pass_if @browser.element?(loc(locator, 'button', scope))
223
226
  end
224
227
 
225
228
 
@@ -236,7 +239,7 @@ module Rsel
236
239
  #
237
240
  def row_exists(cells)
238
241
  row = XPath.descendant(:tr)[XPath::HTML.table_row(cells.split(/, */))]
239
- return @browser.element?("xpath=#{row.to_s}")
242
+ pass_if @browser.element?("xpath=#{row.to_s}")
240
243
  end
241
244
 
242
245
 
@@ -290,7 +293,13 @@ module Rsel
290
293
  # | Field | First name | contains | Eric |
291
294
  #
292
295
  def field_contains(locator, text, scope={})
293
- @browser.field(loc(locator, 'field', scope)).include?(text)
296
+ begin
297
+ field = @browser.field(loc(locator, 'field', scope))
298
+ rescue => e
299
+ failure e.message
300
+ else
301
+ pass_if field.include?(text)
302
+ end
294
303
  end
295
304
 
296
305
 
@@ -307,7 +316,13 @@ module Rsel
307
316
  # | Field | First name | equals; | Eric | !{within:contact} |
308
317
  #
309
318
  def field_equals(locator, text, scope={})
310
- @browser.field(loc(locator, 'field', scope)) == text
319
+ begin
320
+ field = @browser.field(loc(locator, 'field', scope))
321
+ rescue => e
322
+ failure e.message
323
+ else
324
+ pass_if field == text
325
+ end
311
326
  end
312
327
 
313
328
 
@@ -425,8 +440,8 @@ module Rsel
425
440
  xp = loc(locator, 'checkbox', scope)
426
441
  begin
427
442
  enabled = @browser.checked?(xp)
428
- rescue
429
- return false
443
+ rescue => e
444
+ failure e.message
430
445
  else
431
446
  return enabled
432
447
  end
@@ -450,8 +465,8 @@ module Rsel
450
465
  xp = loc(locator, 'radio_button', scope)
451
466
  begin
452
467
  enabled = @browser.checked?(xp)
453
- rescue
454
- return false
468
+ rescue => e
469
+ failure e.message
455
470
  else
456
471
  return enabled
457
472
  end
@@ -473,8 +488,8 @@ module Rsel
473
488
  xp = loc(locator, 'checkbox', scope)
474
489
  begin
475
490
  enabled = @browser.checked?(xp)
476
- rescue
477
- return false
491
+ rescue => e
492
+ failure e.message
478
493
  else
479
494
  return !enabled
480
495
  end
@@ -498,8 +513,8 @@ module Rsel
498
513
  xp = loc(locator, 'radio_button', scope)
499
514
  begin
500
515
  enabled = @browser.checked?(xp)
501
- rescue
502
- return false
516
+ rescue => e
517
+ failure e.message
503
518
  else
504
519
  return !enabled
505
520
  end
@@ -559,7 +574,7 @@ module Rsel
559
574
  dropdown = XPath::HTML.select(locator)
560
575
  opt = dropdown[XPath::HTML.option(option)]
561
576
  opt_str = opt.to_s
562
- return @browser.element?("xpath=#{opt_str}")
577
+ pass_if @browser.element?("xpath=#{opt_str}")
563
578
  end
564
579
 
565
580
 
@@ -578,8 +593,8 @@ module Rsel
578
593
  def dropdown_equals(locator, option, scope={})
579
594
  begin
580
595
  selected = @browser.get_selected_label(loc(locator, 'select', scope))
581
- rescue
582
- return false
596
+ rescue => e
597
+ failure e.message
583
598
  else
584
599
  return selected == option
585
600
  end
@@ -616,6 +631,94 @@ module Rsel
616
631
  end
617
632
  end
618
633
 
634
+
635
+ # Execute the given block, and return false if it raises an exception.
636
+ # Otherwise, return true. If `@stop_on_error` is true, raise a
637
+ # `StopTestStepFailed` exception instead of returning false.
638
+ #
639
+ # @example
640
+ # return_error_status do
641
+ # # some code that might raise an exception
642
+ # end
643
+ #
644
+ def return_error_status
645
+ begin
646
+ yield
647
+ rescue => e
648
+ #puts e.message
649
+ #puts e.backtrace
650
+ failure e.message
651
+ else
652
+ return true
653
+ end
654
+ end
655
+
656
+
657
+ # Invoke a missing method. If a method is called on a SeleniumTest
658
+ # instance, and that method is not explicitly defined, this method
659
+ # will check to see whether the underlying Selenium::Client::Driver
660
+ # instance can respond to that method. If so, that method is called
661
+ # instead.
662
+ #
663
+ # @since 0.0.6
664
+ #
665
+ def method_missing(method, *args, &block)
666
+ if @browser.respond_to?(method)
667
+ @browser.send(method, *args, &block)
668
+ else
669
+ super
670
+ end
671
+ end
672
+
673
+
674
+ # Return true if SeleniumTest explicitly responds to a given method
675
+ # name, or if the underlying Selenium::Client::Driver instance can
676
+ # respond to it. This is a counterpart to {#method_missing}, used
677
+ # for checking whether a given method can be called on this instance.
678
+ #
679
+ # @since 0.0.6
680
+ #
681
+ def respond_to?(method, include_private=false)
682
+ if @browser.respond_to?(method)
683
+ true
684
+ else
685
+ super
686
+ end
687
+ end
688
+
689
+
690
+ # Indicate a failure by returning `false` or raising an exception.
691
+ # If `@stop_on_error` is true, raise a `StopTestStepFailed` exception.
692
+ # Otherwise, simply return false.
693
+ #
694
+ # @param [String] message
695
+ # Optional message to include in the exception.
696
+ # Ignored if `@stop_on_error` is false.
697
+ #
698
+ # @since 0.0.6
699
+ #
700
+ def failure(message='')
701
+ if @stop_on_error
702
+ raise StopTestStepFailed, message
703
+ else
704
+ return false
705
+ end
706
+ end
707
+
708
+
709
+ # Pass if the given condition is true; otherwise, fail by calling
710
+ # {#failure} with an optional `message`.
711
+ #
712
+ # @since 0.0.6
713
+ #
714
+ def pass_if(condition, message='')
715
+ if condition
716
+ return true
717
+ else
718
+ failure message
719
+ end
720
+ end
721
+
619
722
  end
620
723
  end
621
724
 
data/lib/rsel/support.rb CHANGED
@@ -6,26 +6,6 @@ module Rsel
6
6
  # Support functions for Rsel
7
7
  module Support
8
8
 
9
- # Execute the given block, and return false if it raises an exception.
10
- # Otherwise, return true.
11
- #
12
- # @example
13
- # return_error_status do
14
- # # some code that might raise an exception
15
- # end
16
- #
17
- def return_error_status
18
- begin
19
- yield
20
- rescue => e
21
- #puts e.message
22
- #puts e.backtrace
23
- return false
24
- else
25
- return true
26
- end
27
- end
28
-
29
9
  # Convert the given locator to a format accepted by Selenium. If `locator`
30
10
  # starts with `id=`, `name=`, `dom=`, `xpath=` `link=` or `css=`, then the
31
11
  # locator is returned unchanged. Otherwise, `locator` is assumed to be a
data/rsel.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "rsel"
3
- s.version = "0.0.5"
3
+ s.version = "0.0.6"
4
4
  s.summary = "Runs Selenium tests from FitNesse"
5
5
  s.description = <<-EOS
6
6
  Rsel provides a Slim fixture for running Selenium tests, with
@@ -23,796 +23,818 @@ describe Rsel::SeleniumTest do
23
23
  end
24
24
 
25
25
 
26
- context "checkboxes" do
26
+ context "navigation" do
27
27
  before(:each) do
28
- @st.visit("/form").should be_true
28
+ @st.visit("/").should be_true
29
29
  end
30
30
 
31
- describe "#enable_checkbox" do
31
+ describe "#visit" do
32
32
  context "passes when" do
33
- context "checkbox with label" do
34
- it "exists" do
35
- @st.enable_checkbox("I like cheese").should be_true
36
- @st.enable_checkbox("I like salami").should be_true
37
- end
38
-
39
- it "exists within scope" do
40
- @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
41
- @st.enable_checkbox("I like salami", :within => "salami_checkbox").should be_true
42
- end
43
-
44
- it "exists in table row" do
45
- @st.visit("/table")
46
- @st.enable_checkbox("Like", :in_row => "Marcus").should be_true
47
- end
48
- end
49
-
50
- context "checkbox with id=" do
51
- it "exists" do
52
- @st.enable_checkbox("id=like_cheese").should be_true
53
- end
54
- end
55
-
56
- context "checkbox with xpath=" do
57
- it "exists" do
58
- @st.enable_checkbox("xpath=//input[@id='like_cheese']").should be_true
59
- end
33
+ it "page exists" do
34
+ @st.visit("/about").should be_true
60
35
  end
61
36
  end
62
37
 
63
38
  context "fails when" do
64
- context "checkbox with label" do
65
- it "does not exist" do
66
- @st.enable_checkbox("I dislike bacon").should be_false
67
- @st.enable_checkbox("I like broccoli").should be_false
68
- end
69
-
70
- it "exists, but not within scope" do
71
- @st.enable_checkbox("I like cheese", :within => "salami_checkbox").should be_false
72
- @st.enable_checkbox("I like salami", :within => "cheese_checkbox").should be_false
73
- end
74
-
75
- it "exists, but not in table row" do
76
- @st.visit("/table")
77
- @st.enable_checkbox("Like", :in_row => "Eric").should be_false
78
- end
39
+ it "page does not exist" do
40
+ @st.visit("/bad/path").should be_false
79
41
  end
80
42
  end
81
43
  end
82
44
 
83
- describe "#disable_checkbox" do
84
- context "passes when" do
85
- context "checkbox with label" do
86
- it "exists" do
87
- @st.disable_checkbox("I like cheese").should be_true
88
- @st.disable_checkbox("I like salami").should be_true
89
- end
90
-
91
- it "exists within scope" do
92
- @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
93
- @st.disable_checkbox("I like salami", :within => "preferences_form").should be_true
94
- end
95
-
96
- it "exists in table row" do
97
- @st.visit("/table")
98
- @st.disable_checkbox("Like", :in_row => "Marcus").should be_true
99
- end
100
- end
101
-
102
- context "checkbox with id=" do
103
- it "exists" do
104
- @st.disable_checkbox("id=like_cheese").should be_true
105
- end
106
- end
45
+ context "reload the current page" do
46
+ # TODO
47
+ end
107
48
 
108
- context "checkbox with xpath=" do
109
- it "exists" do
110
- @st.disable_checkbox("xpath=//input[@id='like_cheese']").should be_true
111
- end
112
- end
49
+ describe "#click_back" do
50
+ it "passes and loads the correct URL" do
51
+ @st.visit("/about")
52
+ @st.visit("/")
53
+ @st.click_back.should be_true
54
+ @st.see_title("About this site").should be_true
113
55
  end
114
56
 
115
- context "fails when" do
116
- context "checkbox with label" do
117
- it "does not exist" do
118
- @st.disable_checkbox("I dislike bacon").should be_false
119
- @st.disable_checkbox("I like broccoli").should be_false
120
- end
57
+ #it "fails when there is no previous page in the history" do
58
+ # TODO: No obvious way to test this, since everything is running in the
59
+ # same session
60
+ #end
61
+ end
62
+ end # navigation
121
63
 
122
- it "exists, but not within scope" do
123
- @st.disable_checkbox("I like cheese", :within => "salami_checkbox").should be_false
124
- @st.disable_checkbox("I like salami", :within => "cheese_checkbox").should be_false
125
- end
126
64
 
127
- it "exists, but not in table row" do
128
- @st.visit("/table")
129
- @st.disable_checkbox("Like", :in_row => "Eric").should be_false
130
- end
131
- end
132
- end
65
+ context "visibility" do
66
+ before(:each) do
67
+ @st.visit("/").should be_true
133
68
  end
134
69
 
135
- describe "#checkbox_is_enabled" do
70
+ describe "#see" do
136
71
  context "passes when" do
137
- context "checkbox with label" do
138
- it "exists and is checked" do
139
- @st.enable_checkbox("I like cheese").should be_true
140
- @st.checkbox_is_enabled("I like cheese").should be_true
141
- end
142
-
143
- it "exists within scope and is checked" do
144
- @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
145
- @st.checkbox_is_enabled("I like cheese", :within => "cheese_checkbox").should be_true
146
- end
147
-
148
- it "exists in table row and is checked" do
149
- @st.visit("/table")
150
- @st.enable_checkbox("Like", :in_row => "Ken").should be_true
151
- @st.checkbox_is_enabled("Like", :in_row => "Ken").should be_true
152
- end
72
+ it "text is present" do
73
+ @st.see("Welcome").should be_true
74
+ @st.see("This is a Sinatra webapp").should be_true
153
75
  end
154
76
  end
155
77
 
156
78
  context "fails when" do
157
- context "checkbox with label" do
158
- it "does not exist" do
159
- @st.checkbox_is_enabled("I dislike bacon").should be_false
160
- end
161
-
162
- it "exists but is unchecked" do
163
- @st.disable_checkbox("I like cheese").should be_true
164
- @st.checkbox_is_enabled("I like cheese").should be_false
165
- end
166
-
167
- it "exists and is checked, but not within scope" do
168
- @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
169
- @st.checkbox_is_enabled("I like cheese", :within => "salami_checkbox").should be_false
170
- end
171
-
172
- it "exists and is checked, but not in table row" do
173
- @st.visit("/table")
174
- @st.enable_checkbox("Like", :in_row => "Marcus").should be_true
175
- @st.checkbox_is_enabled("Like", :in_row => "Eric").should be_false
176
- end
79
+ it "text is absent" do
80
+ @st.see("Nonexistent").should be_false
81
+ @st.see("Some bogus text").should be_false
177
82
  end
178
83
  end
84
+
85
+ it "is case-sensitive" do
86
+ @st.see("Sinatra webapp").should be_true
87
+ @st.see("sinatra Webapp").should be_false
88
+ end
179
89
  end
180
90
 
181
- describe "#checkbox_is_disabled" do
91
+ describe "#do_not_see" do
182
92
  context "passes when" do
183
- context "checkbox with label" do
184
- it "exists and is unchecked" do
185
- @st.disable_checkbox("I like cheese").should be_true
186
- @st.checkbox_is_disabled("I like cheese").should be_true
187
- end
188
-
189
- it "exists within scope and is unchecked" do
190
- @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
191
- @st.checkbox_is_disabled("I like cheese", :within => "cheese_checkbox").should be_true
192
- end
193
-
194
- it "exists in table row and is unchecked" do
195
- @st.visit("/table")
196
- @st.disable_checkbox("Like", :in_row => "Ken").should be_true
197
- @st.checkbox_is_disabled("Like", :in_row => "Ken").should be_true
198
- end
93
+ it "text is absent" do
94
+ @st.do_not_see("Nonexistent").should be_true
95
+ @st.do_not_see("Some bogus text").should be_true
199
96
  end
200
97
  end
201
98
 
202
99
  context "fails when" do
203
- context "checkbox with label" do
204
- it "does not exist" do
205
- @st.checkbox_is_disabled("I dislike bacon").should be_false
206
- end
207
-
208
- it "exists but is checked" do
209
- @st.enable_checkbox("I like cheese").should be_true
210
- @st.checkbox_is_disabled("I like cheese").should be_false
211
- end
212
-
213
- it "exists and is unchecked, but not within scope" do
214
- @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
215
- @st.checkbox_is_disabled("I like cheese", :within => "salami_checkbox").should be_false
216
- end
217
-
218
- it "exists and is unchecked, but not in table row" do
219
- @st.visit("/table")
220
- @st.disable_checkbox("Like", :in_row => "Marcus").should be_true
221
- @st.checkbox_is_disabled("Like", :in_row => "Eric").should be_false
222
- end
100
+ it "fails when test is present" do
101
+ @st.do_not_see("Welcome").should be_false
102
+ @st.do_not_see("This is a Sinatra webapp").should be_false
223
103
  end
224
104
  end
105
+
106
+ it "is case-sensitive" do
107
+ @st.do_not_see("Sinatra webapp").should be_false
108
+ @st.do_not_see("sinatra Webapp").should be_true
109
+ end
225
110
  end
226
- end
111
+ end # visibility
227
112
 
228
113
 
229
- context "radiobuttons" do
114
+ context "links" do
230
115
  before(:each) do
231
- @st.visit("/form").should be_true
116
+ @st.visit("/").should be_true
232
117
  end
233
118
 
234
- context "#select_radio" do
119
+ describe "#click" do
235
120
  context "passes when" do
236
- context "radiobutton with label" do
237
- it "exists" do
238
- @st.select_radio("Briefs").should be_true
239
- end
240
-
241
- it "exists within scope" do
242
- @st.select_radio("Briefs", :within => "clothing").should be_true
243
- end
244
-
245
- it "exists in table row" do
246
- # TODO
247
- end
121
+ it "link exists" do
122
+ @st.click("About this site").should be_true
248
123
  end
249
124
  end
250
125
 
251
126
  context "fails when" do
252
- context "radiobutton with label" do
253
- it "does not exist" do
254
- @st.select_radio("Naked").should be_false
255
- end
256
-
257
- it "exists, but not within scope" do
258
- @st.select_radio("Briefs", :within => "food").should be_false
259
- end
260
-
261
- it "exists, but not in table row" do
262
- # TODO
263
- end
127
+ it "link does not exist" do
128
+ @st.click("Bogus link").should be_false
264
129
  end
265
130
  end
266
131
  end
267
132
 
268
- context "#radio_is_enabled" do
133
+ describe "#click_link" do
269
134
  context "passes when" do
270
- context "radiobutton with label" do
271
- it "exists, and is enabled" do
272
- @st.select_radio("Briefs")
273
- @st.radio_is_enabled("Briefs").should be_true
274
- end
135
+ it "link exists" do
136
+ @st.click_link("About this site").should be_true
137
+ end
275
138
 
276
- it "exists within scope, and is enabled" do
277
- @st.select_radio("Briefs", :within => "clothing")
278
- @st.radio_is_enabled("Briefs", :within => "clothing").should be_true
279
- end
139
+ it "link exists within scope" do
140
+ @st.click_link("About this site", :within => "header").should be_true
141
+ end
280
142
 
281
- it "exists in table row, and is enabled" do
282
- # TODO
283
- end
143
+ it "link exists in table row" do
144
+ @st.visit("/table")
145
+ @st.click_link("Edit", :in_row => "Marcus").should be_true
146
+ @st.see_title("Editing Marcus").should be_true
284
147
  end
285
148
  end
286
149
 
287
150
  context "fails when" do
288
- context "radiobutton with label" do
289
- it "does not exist" do
290
- @st.radio_is_enabled("Naked").should be_false
291
- end
151
+ it "link does not exist" do
152
+ @st.click_link("Bogus link").should be_false
153
+ end
292
154
 
293
- it "exists, but is not enabled" do
294
- @st.select_radio("Briefs")
295
- @st.radio_is_enabled("Boxers").should be_false
296
- end
155
+ it "link exists, but not within scope" do
156
+ @st.click_link("About this site", :within => "footer").should be_false
157
+ end
297
158
 
298
- it "exists and is enabled, but not within scope" do
299
- @st.select_radio("Briefs", :within => "clothing")
300
- @st.radio_is_enabled("Briefs", :within => "food").should be_false
301
- end
159
+ it "link exists, but not in table row" do
160
+ @st.visit("/table")
161
+ @st.click_link("Edit", :in_row => "Ken").should be_false
302
162
  end
303
163
  end
304
164
  end
305
- end
306
-
307
-
308
- context "dropdowns" do
309
- before(:each) do
310
- @st.visit("/form").should be_true
311
- end
312
165
 
313
- context "#select_from_dropdown" do
166
+ describe "#link_exists" do
314
167
  context "passes when" do
315
- it "option exists in the dropdown" do
316
- @st.select_from_dropdown("Tall", "Height").should be_true
317
- @st.select_from_dropdown("Medium", "Weight").should be_true
318
- end
319
-
320
- it "option exists in the dropdown within scope" do
321
- @st.select_from_dropdown("Tall", "Height", :within => "spouse_form").should be_true
168
+ it "link with the given text exists" do
169
+ @st.link_exists("About this site").should be_true
170
+ @st.link_exists("Form test").should be_true
322
171
  end
323
172
 
324
- it "option exists in the dropdown in table row" do
325
- @st.visit("/table")
326
- @st.select_from_dropdown("Male", "Gender", :in_row => "Eric").should be_true
173
+ it "link with the given text exists within scope" do
174
+ @st.link_exists("About this site", :within => "header").should be_true
175
+ @st.link_exists("Form test", :within => "footer").should be_true
176
+ @st.link_exists("Table test", :within => "footer").should be_true
327
177
  end
328
178
  end
329
179
 
330
180
  context "fails when" do
331
- it "no such dropdown exists" do
332
- @st.select_from_dropdown("Over easy", "Eggs").should be_false
181
+ it "no such link exists" do
182
+ @st.link_exists("Welcome").should be_false
183
+ @st.link_exists("Don't click here").should be_false
333
184
  end
334
185
 
335
- it "dropdown exists, but the option doesn't" do
336
- @st.select_from_dropdown("Giant", "Height").should be_false
337
- @st.select_from_dropdown("Obese", "Weight").should be_false
186
+ it "link exists, but not within scope" do
187
+ @st.link_exists("About this site", :within => "footer").should be_false
188
+ @st.link_exists("Form test", :within => "header").should be_false
189
+ @st.link_exists("Table test", :within => "header").should be_false
338
190
  end
191
+ end
192
+ end
193
+ end # links
339
194
 
340
- it "dropdown exists, but not within scope" do
341
- @st.select_from_dropdown("Medium", "Weight", :within => "spouse_form").should be_false
195
+
196
+ context "buttons" do
197
+ before(:each) do
198
+ @st.visit("/form").should be_true
199
+ end
200
+
201
+ describe "#click_button" do
202
+ context "passes when" do
203
+ it "button exists and is enabled" do
204
+ @st.click_button("Submit person form").should be_true
342
205
  end
343
206
 
344
- it "dropdown exists, but not in table row" do
345
- @st.visit("/table")
346
- @st.select_from_dropdown("Female", "Gender", :in_row => "First name").should be_false
207
+ it "button exists within scope" do
208
+ @st.click_button("Submit person form", :within => "person_form").should be_true
347
209
  end
348
- end
349
- end
350
210
 
351
- context "#dropdown_includes" do
352
- context "passes when" do
353
- it "option exists in the dropdown" do
354
- @st.dropdown_includes("Height", "Tall").should be_true
355
- @st.dropdown_includes("Weight", "Medium").should be_true
211
+ it "button exists in table row" do
212
+ # TODO
356
213
  end
357
214
  end
358
215
 
359
216
  context "fails when" do
360
- it "dropdown exists, but the option doesn't" do
361
- @st.dropdown_includes("Height", "Giant").should be_false
362
- @st.dropdown_includes("Weight", "Obese").should be_false
217
+ it "button does not exist" do
218
+ @st.click_button("No such button").should be_false
363
219
  end
364
220
 
365
- it "no such dropdown exists" do
366
- @st.dropdown_includes("Eggs", "Over easy").should be_false
221
+ it "button exists, but not within scope" do
222
+ @st.click_button("Submit person form", :within => "spouse_form").should be_false
223
+ end
224
+
225
+ it "button exists, but not in table row" do
226
+ # TODO
227
+ end
228
+
229
+ it "button exists, but is disabled" do
230
+ # TODO
367
231
  end
368
232
  end
369
233
  end
370
234
 
371
- context "#dropdown_equals" do
235
+
236
+ describe "#button_exists" do
372
237
  context "passes when" do
373
- it "option is selected in the dropdown" do
374
- ["Short", "Average", "Tall"].each do |height|
375
- @st.select_from_dropdown(height, "Height")
376
- @st.dropdown_equals("Height", height).should be_true
238
+ context "button with text" do
239
+ it "exists" do
240
+ @st.button_exists("Submit person form").should be_true
241
+ @st.button_exists("Save preferences").should be_true
377
242
  end
378
- end
379
243
 
380
- it "option is selected in the dropdown, within scope" do
381
- ["Short", "Average", "Tall"].each do |height|
382
- @st.select_from_dropdown(height, "Height", :within => "spouse_form")
383
- @st.dropdown_equals("Height", height, :within => "spouse_form").should be_true
244
+ it "exists within scope" do
245
+ @st.button_exists("Submit person form", :within => "person_form").should be_true
246
+ @st.button_exists("Submit spouse form", :within => "spouse_form").should be_true
384
247
  end
385
- end
386
248
 
387
- it "option is selected in the dropdown, in table row" do
388
- @st.visit("/table")
389
- ["Male", "Female"].each do |gender|
390
- @st.select_from_dropdown(gender, "Gender", :in_row => "Eric")
391
- @st.dropdown_equals("Gender", gender, :in_row => "Eric")
249
+ it "exists in table row" do
250
+ # TODO
392
251
  end
393
252
  end
394
253
  end
395
254
 
396
255
  context "fails when" do
397
- it "no such dropdown exists" do
398
- @st.dropdown_equals("Eggs", "Over easy").should be_false
399
- end
400
-
401
- it "dropdown exists, but the option is not selected" do
402
- @st.select_from_dropdown("Short", "Height")
403
- @st.dropdown_equals("Height", "Average").should be_false
404
- @st.dropdown_equals("Height", "Tall").should be_false
405
-
406
- @st.select_from_dropdown("Average", "Height")
407
- @st.dropdown_equals("Height", "Short").should be_false
408
- @st.dropdown_equals("Height", "Tall").should be_false
409
-
410
- @st.select_from_dropdown("Tall", "Height")
411
- @st.dropdown_equals("Height", "Short").should be_false
412
- @st.dropdown_equals("Height", "Average").should be_false
256
+ it "no such button exists" do
257
+ @st.button_exists("Apple").should be_false
258
+ @st.button_exists("Big Red").should be_false
413
259
  end
414
260
 
415
- it "dropdown exists, and option is selected, but not in scope" do
416
- @st.select_from_dropdown("Tall", "Height", :within => "person_form")
417
- @st.select_from_dropdown("Short", "Height", :within => "spouse_form")
418
- @st.dropdown_equals("Height", "Tall", :within => "spouse_form").should be_false
261
+ it "button exists, but not within scope" do
262
+ @st.button_exists("Submit spouse form", :within => "person_form").should be_false
263
+ @st.button_exists("Submit person form", :within => "spouse_form").should be_false
419
264
  end
420
265
 
421
- it "dropdown exists, and option is selected, but not in table row" do
422
- @st.visit("/table")
423
- @st.select_from_dropdown("Female", "Gender", :in_row => "Eric")
424
- @st.select_from_dropdown("Male", "Gender", :in_row => "Marcus")
425
- @st.dropdown_equals("Gender", "Female", :in_row => "Marcus").should be_false
266
+ it "button exists, but not in table row" do
267
+ # TODO
426
268
  end
427
269
  end
428
270
  end
429
- end
271
+ end # buttons
430
272
 
431
273
 
432
- context "navigation" do
274
+ context "fields" do
433
275
  before(:each) do
434
- @st.visit("/").should be_true
276
+ @st.visit("/form").should be_true
435
277
  end
436
278
 
437
- describe "#visit" do
279
+ describe "#type_into_field" do
438
280
  context "passes when" do
439
- it "page exists" do
440
- @st.visit("/about").should be_true
281
+ context "text field with label" do
282
+ it "exists" do
283
+ @st.type_into_field("Eric", "First name").should be_true
284
+ @st.fill_in_with("Last name", "Pierce").should be_true
285
+ end
286
+ it "exists within scope" do
287
+ @st.type_into_field("Eric", "First name", :within => 'person_form').should be_true
288
+ @st.type_into_field("Andrea", "First name", :within => 'spouse_form').should be_true
289
+ end
441
290
  end
442
- end
443
291
 
444
- context "fails when" do
445
- it "page does not exist" do
446
- @st.visit("/bad/path").should be_false
292
+ context "text field with id" do
293
+ it "exists" do
294
+ @st.type_into_field("Eric", "first_name").should be_true
295
+ @st.fill_in_with("last_name", "Pierce").should be_true
296
+ end
447
297
  end
448
- end
449
- end
450
298
 
451
- context "reload the current page" do
452
- # TODO
453
- end
299
+ context "textarea with label" do
300
+ it "exists" do
301
+ @st.type_into_field("Blah blah blah", "Life story").should be_true
302
+ @st.fill_in_with("Life story", "Jibber jabber").should be_true
303
+ end
304
+ end
454
305
 
455
- describe "#click_back" do
456
- it "passes and loads the correct URL" do
457
- @st.visit("/about")
458
- @st.visit("/")
459
- @st.click_back.should be_true
460
- @st.see_title("About this site").should be_true
306
+ context "textarea with id" do
307
+ it "exists" do
308
+ @st.type_into_field("Blah blah blah", "biography").should be_true
309
+ @st.fill_in_with("biography", "Jibber jabber").should be_true
310
+ end
311
+ end
461
312
  end
462
313
 
463
- #it "fails when there is no previous page in the history" do
464
- # TODO: No obvious way to test this, since everything is running in the
465
- # same session
466
- #end
467
- end
468
- end
469
-
314
+ context "fails when" do
315
+ it "no field with the given label or id exists" do
316
+ @st.type_into_field("Matthew", "Middle name").should be_false
317
+ @st.fill_in_with("middle_name", "Matthew").should be_false
318
+ end
470
319
 
471
- context "links" do
472
- before(:each) do
473
- @st.visit("/").should be_true
320
+ it "field exists, but not within scope" do
321
+ @st.type_into_field("Long story", "Life story",
322
+ :within => 'spouse_form').should be_false
323
+ end
324
+ end
474
325
  end
475
326
 
476
- describe "#click_link" do
327
+ describe "#field_contains" do
477
328
  context "passes when" do
478
- it "link exists" do
479
- @st.click_link("About this site").should be_true
480
- end
329
+ context "text field with label" do
330
+ it "equals the text" do
331
+ @st.fill_in_with("First name", "Marcus")
332
+ @st.field_contains("First name", "Marcus").should be_true
333
+ end
481
334
 
482
- it "link exists within scope" do
483
- @st.click_link("About this site", :within => "header").should be_true
335
+ it "contains the text" do
336
+ @st.fill_in_with("First name", "Marcus")
337
+ @st.field_contains("First name", "Marc").should be_true
338
+ end
484
339
  end
485
340
 
486
- it "link exists in table row" do
487
- @st.visit("/table")
488
- @st.click_link("Edit", :in_row => "Marcus").should be_true
489
- @st.see_title("Editing Marcus").should be_true
341
+ context "textarea with label" do
342
+ it "contains the text" do
343
+ @st.fill_in_with("Life story", "Blah dee blah")
344
+ @st.field_contains("Life story", "blah").should be_true
345
+ end
490
346
  end
491
347
  end
492
348
 
493
349
  context "fails when" do
494
- it "link does not exist" do
495
- @st.click_link("Bogus link").should be_false
496
- end
350
+ context "text field with label" do
351
+ it "does not exist" do
352
+ @st.field_contains("Third name", "Smith").should be_false
353
+ end
497
354
 
498
- it "link exists, but not within scope" do
499
- @st.click_link("About this site", :within => "footer").should be_false
355
+ it "does not contain the text" do
356
+ @st.fill_in_with("First name", "Marcus")
357
+ @st.field_contains("First name", "Eric").should be_false
358
+ end
500
359
  end
501
360
 
502
- it "link exists, but not in table row" do
503
- @st.visit("/table")
504
- @st.click_link("Edit", :in_row => "Ken").should be_false
361
+ context "textarea with label" do
362
+ it "does not contain the text" do
363
+ @st.fill_in_with("Life story", "Blah dee blah")
364
+ @st.field_contains("Life story", "spam").should be_false
365
+ end
505
366
  end
506
367
  end
507
368
  end
508
369
 
509
- describe "#link_exists" do
370
+ describe "#field_equals" do
510
371
  context "passes when" do
511
- it "link with the given text exists" do
512
- @st.link_exists("About this site").should be_true
513
- @st.link_exists("Form test").should be_true
372
+ context "text field with label" do
373
+ it "equals the text" do
374
+ @st.fill_in_with("First name", "Ken")
375
+ @st.field_equals("First name", "Ken").should be_true
376
+ end
377
+
378
+ it "equals the text, and is within scope" do
379
+ @st.fill_in_with("First name", "Eric", :within => "person_form")
380
+ @st.field_equals("First name", "Eric", :within => "person_form")
381
+ end
514
382
  end
515
383
 
516
- it "link with the given text exists within scope" do
517
- @st.link_exists("About this site", :within => "header").should be_true
518
- @st.link_exists("Form test", :within => "footer").should be_true
519
- @st.link_exists("Table test", :within => "footer").should be_true
384
+ context "textarea with label" do
385
+ it "equals the text" do
386
+ @st.fill_in_with("Life story", "Blah dee blah")
387
+ @st.field_equals("Life story", "Blah dee blah").should be_true
388
+ end
389
+
390
+ it "equals the text, and is within scope" do
391
+ @st.fill_in_with("Life story", "Blah dee blah",
392
+ :within => "person_form")
393
+ @st.field_equals("Life story", "Blah dee blah",
394
+ :within => "person_form").should be_true
395
+ end
396
+
397
+ it "equals the text, and is in table row" do
398
+ # TODO
399
+ end
520
400
  end
521
401
  end
522
402
 
523
403
  context "fails when" do
524
- it "no such link exists" do
525
- @st.link_exists("Welcome").should be_false
526
- @st.link_exists("Don't click here").should be_false
404
+ context "text field with label" do
405
+ it "does not exactly equal the text" do
406
+ @st.fill_in_with("First name", "Marcus")
407
+ @st.field_equals("First name", "Marc").should be_false
408
+ end
527
409
  end
528
410
 
529
- it "link exists, but not within scope" do
530
- @st.link_exists("About this site", :within => "footer").should be_false
531
- @st.link_exists("Form test", :within => "header").should be_false
532
- @st.link_exists("Table test", :within => "header").should be_false
411
+ context "textarea with label" do
412
+ it "does not exist" do
413
+ @st.field_equals("Third name", "Smith").should be_false
414
+ end
415
+
416
+ it "does not exactly equal the text" do
417
+ @st.fill_in_with("Life story", "Blah dee blah")
418
+ @st.field_equals("Life story", "Blah dee").should be_false
419
+ end
420
+
421
+ it "exactly equals the text, but is not within scope" do
422
+ # TODO
423
+ end
424
+
425
+ it "exactly equals the text, but is not in table row" do
426
+ # TODO
427
+ end
533
428
  end
534
429
  end
535
430
  end
536
- end
431
+ end # fields
537
432
 
538
433
 
539
- context "buttons" do
434
+ context "checkboxes" do
540
435
  before(:each) do
541
436
  @st.visit("/form").should be_true
542
437
  end
543
438
 
544
- describe "#click_button" do
439
+ describe "#enable_checkbox" do
545
440
  context "passes when" do
546
- it "button exists and is enabled" do
547
- @st.click_button("Submit person form").should be_true
441
+ context "checkbox with label" do
442
+ it "exists" do
443
+ @st.enable_checkbox("I like cheese").should be_true
444
+ @st.enable_checkbox("I like salami").should be_true
445
+ end
446
+
447
+ it "exists within scope" do
448
+ @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
449
+ @st.enable_checkbox("I like salami", :within => "salami_checkbox").should be_true
450
+ end
451
+
452
+ it "exists in table row" do
453
+ @st.visit("/table")
454
+ @st.enable_checkbox("Like", :in_row => "Marcus").should be_true
455
+ end
548
456
  end
549
457
 
550
- it "button exists within scope" do
551
- @st.click_button("Submit person form", :within => "person_form").should be_true
458
+ context "checkbox with id=" do
459
+ it "exists" do
460
+ @st.enable_checkbox("id=like_cheese").should be_true
461
+ end
552
462
  end
553
463
 
554
- it "button exists in table row" do
555
- # TODO
464
+ context "checkbox with xpath=" do
465
+ it "exists" do
466
+ @st.enable_checkbox("xpath=//input[@id='like_cheese']").should be_true
467
+ end
556
468
  end
557
469
  end
558
470
 
559
471
  context "fails when" do
560
- it "button does not exist" do
561
- @st.click_button("No such button").should be_false
562
- end
563
-
564
- it "button exists, but not within scope" do
565
- @st.click_button("Submit person form", :within => "spouse_form").should be_false
566
- end
472
+ context "checkbox with label" do
473
+ it "does not exist" do
474
+ @st.enable_checkbox("I dislike bacon").should be_false
475
+ @st.enable_checkbox("I like broccoli").should be_false
476
+ end
567
477
 
568
- it "button exists, but not in table row" do
569
- # TODO
570
- end
478
+ it "exists, but not within scope" do
479
+ @st.enable_checkbox("I like cheese", :within => "salami_checkbox").should be_false
480
+ @st.enable_checkbox("I like salami", :within => "cheese_checkbox").should be_false
481
+ end
571
482
 
572
- it "button exists, but is disabled" do
573
- # TODO
483
+ it "exists, but not in table row" do
484
+ @st.visit("/table")
485
+ @st.enable_checkbox("Like", :in_row => "Eric").should be_false
486
+ end
574
487
  end
575
488
  end
576
489
  end
577
490
 
578
-
579
- describe "#button_exists" do
491
+ describe "#disable_checkbox" do
580
492
  context "passes when" do
581
- context "button with text" do
493
+ context "checkbox with label" do
582
494
  it "exists" do
583
- @st.button_exists("Submit person form").should be_true
584
- @st.button_exists("Save preferences").should be_true
495
+ @st.disable_checkbox("I like cheese").should be_true
496
+ @st.disable_checkbox("I like salami").should be_true
585
497
  end
586
498
 
587
499
  it "exists within scope" do
588
- @st.button_exists("Submit person form", :within => "person_form").should be_true
589
- @st.button_exists("Submit spouse form", :within => "spouse_form").should be_true
500
+ @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
501
+ @st.disable_checkbox("I like salami", :within => "preferences_form").should be_true
590
502
  end
591
503
 
592
504
  it "exists in table row" do
593
- # TODO
505
+ @st.visit("/table")
506
+ @st.disable_checkbox("Like", :in_row => "Marcus").should be_true
594
507
  end
595
508
  end
596
- end
597
-
598
- context "fails when" do
599
- it "no such button exists" do
600
- @st.button_exists("Apple").should be_false
601
- @st.button_exists("Big Red").should be_false
602
- end
603
509
 
604
- it "button exists, but not within scope" do
605
- @st.button_exists("Submit spouse form", :within => "person_form").should be_false
606
- @st.button_exists("Submit person form", :within => "spouse_form").should be_false
510
+ context "checkbox with id=" do
511
+ it "exists" do
512
+ @st.disable_checkbox("id=like_cheese").should be_true
513
+ end
607
514
  end
608
515
 
609
- it "button exists, but not in table row" do
610
- # TODO
516
+ context "checkbox with xpath=" do
517
+ it "exists" do
518
+ @st.disable_checkbox("xpath=//input[@id='like_cheese']").should be_true
519
+ end
611
520
  end
612
521
  end
613
- end
614
- end
615
522
 
523
+ context "fails when" do
524
+ context "checkbox with label" do
525
+ it "does not exist" do
526
+ @st.disable_checkbox("I dislike bacon").should be_false
527
+ @st.disable_checkbox("I like broccoli").should be_false
528
+ end
529
+
530
+ it "exists, but not within scope" do
531
+ @st.disable_checkbox("I like cheese", :within => "salami_checkbox").should be_false
532
+ @st.disable_checkbox("I like salami", :within => "cheese_checkbox").should be_false
533
+ end
616
534
 
617
- context "fields" do
618
- before(:each) do
619
- @st.visit("/form").should be_true
535
+ it "exists, but not in table row" do
536
+ @st.visit("/table")
537
+ @st.disable_checkbox("Like", :in_row => "Eric").should be_false
538
+ end
539
+ end
540
+ end
620
541
  end
621
542
 
622
- describe "#type_into_field" do
543
+ describe "#checkbox_is_enabled" do
623
544
  context "passes when" do
624
- context "text field with label" do
625
- it "exists" do
626
- @st.type_into_field("Eric", "First name").should be_true
627
- @st.fill_in_with("Last name", "Pierce").should be_true
545
+ context "checkbox with label" do
546
+ it "exists and is checked" do
547
+ @st.enable_checkbox("I like cheese").should be_true
548
+ @st.checkbox_is_enabled("I like cheese").should be_true
628
549
  end
629
- it "exists within scope" do
630
- @st.type_into_field("Eric", "First name", :within => 'person_form').should be_true
631
- @st.type_into_field("Andrea", "First name", :within => 'spouse_form').should be_true
550
+
551
+ it "exists within scope and is checked" do
552
+ @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
553
+ @st.checkbox_is_enabled("I like cheese", :within => "cheese_checkbox").should be_true
632
554
  end
633
- end
634
555
 
635
- context "text field with id" do
636
- it "exists" do
637
- @st.type_into_field("Eric", "first_name").should be_true
638
- @st.fill_in_with("last_name", "Pierce").should be_true
556
+ it "exists in table row and is checked" do
557
+ @st.visit("/table")
558
+ @st.enable_checkbox("Like", :in_row => "Ken").should be_true
559
+ @st.checkbox_is_enabled("Like", :in_row => "Ken").should be_true
639
560
  end
640
561
  end
562
+ end
641
563
 
642
- context "textarea with label" do
643
- it "exists" do
644
- @st.type_into_field("Blah blah blah", "Life story").should be_true
645
- @st.fill_in_with("Life story", "Jibber jabber").should be_true
564
+ context "fails when" do
565
+ context "checkbox with label" do
566
+ it "does not exist" do
567
+ @st.checkbox_is_enabled("I dislike bacon").should be_false
568
+ end
569
+
570
+ it "exists but is unchecked" do
571
+ @st.disable_checkbox("I like cheese").should be_true
572
+ @st.checkbox_is_enabled("I like cheese").should be_false
573
+ end
574
+
575
+ it "exists and is checked, but not within scope" do
576
+ @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
577
+ @st.checkbox_is_enabled("I like cheese", :within => "salami_checkbox").should be_false
578
+ end
579
+
580
+ it "exists and is checked, but not in table row" do
581
+ @st.visit("/table")
582
+ @st.enable_checkbox("Like", :in_row => "Marcus").should be_true
583
+ @st.checkbox_is_enabled("Like", :in_row => "Eric").should be_false
646
584
  end
647
585
  end
586
+ end
587
+ end
648
588
 
649
- context "textarea with id" do
650
- it "exists" do
651
- @st.type_into_field("Blah blah blah", "biography").should be_true
652
- @st.fill_in_with("biography", "Jibber jabber").should be_true
589
+ describe "#checkbox_is_disabled" do
590
+ context "passes when" do
591
+ context "checkbox with label" do
592
+ it "exists and is unchecked" do
593
+ @st.disable_checkbox("I like cheese").should be_true
594
+ @st.checkbox_is_disabled("I like cheese").should be_true
595
+ end
596
+
597
+ it "exists within scope and is unchecked" do
598
+ @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
599
+ @st.checkbox_is_disabled("I like cheese", :within => "cheese_checkbox").should be_true
600
+ end
601
+
602
+ it "exists in table row and is unchecked" do
603
+ @st.visit("/table")
604
+ @st.disable_checkbox("Like", :in_row => "Ken").should be_true
605
+ @st.checkbox_is_disabled("Like", :in_row => "Ken").should be_true
653
606
  end
654
607
  end
655
608
  end
656
609
 
657
610
  context "fails when" do
658
- it "no field with the given label or id exists" do
659
- @st.type_into_field("Matthew", "Middle name").should be_false
660
- @st.fill_in_with("middle_name", "Matthew").should be_false
661
- end
611
+ context "checkbox with label" do
612
+ it "does not exist" do
613
+ @st.checkbox_is_disabled("I dislike bacon").should be_false
614
+ end
662
615
 
663
- it "field exists, but not within scope" do
664
- @st.type_into_field("Long story", "Life story",
665
- :within => 'spouse_form').should be_false
616
+ it "exists but is checked" do
617
+ @st.enable_checkbox("I like cheese").should be_true
618
+ @st.checkbox_is_disabled("I like cheese").should be_false
619
+ end
620
+
621
+ it "exists and is unchecked, but not within scope" do
622
+ @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
623
+ @st.checkbox_is_disabled("I like cheese", :within => "salami_checkbox").should be_false
624
+ end
625
+
626
+ it "exists and is unchecked, but not in table row" do
627
+ @st.visit("/table")
628
+ @st.disable_checkbox("Like", :in_row => "Marcus").should be_true
629
+ @st.checkbox_is_disabled("Like", :in_row => "Eric").should be_false
630
+ end
666
631
  end
667
632
  end
668
633
  end
634
+ end # checkboxes
669
635
 
670
- describe "#field_contains" do
636
+
637
+ context "radiobuttons" do
638
+ before(:each) do
639
+ @st.visit("/form").should be_true
640
+ end
641
+
642
+ context "#select_radio" do
671
643
  context "passes when" do
672
- context "text field with label" do
673
- it "equals the text" do
674
- @st.fill_in_with("First name", "Marcus")
675
- @st.field_contains("First name", "Marcus").should be_true
644
+ context "radiobutton with label" do
645
+ it "exists" do
646
+ @st.select_radio("Briefs").should be_true
676
647
  end
677
648
 
678
- it "contains the text" do
679
- @st.fill_in_with("First name", "Marcus")
680
- @st.field_contains("First name", "Marc").should be_true
649
+ it "exists within scope" do
650
+ @st.select_radio("Briefs", :within => "clothing").should be_true
681
651
  end
682
- end
683
-
684
- context "textarea with label" do
685
- it "contains the text" do
686
- @st.fill_in_with("Life story", "Blah dee blah")
687
- @st.field_contains("Life story", "blah").should be_true
652
+
653
+ it "exists in table row" do
654
+ # TODO
688
655
  end
689
656
  end
690
657
  end
691
658
 
692
659
  context "fails when" do
693
- context "text field with label" do
694
- it "does not contain the text" do
695
- @st.fill_in_with("First name", "Marcus")
696
- @st.field_contains("First name", "Eric").should be_false
660
+ context "radiobutton with label" do
661
+ it "does not exist" do
662
+ @st.select_radio("Naked").should be_false
697
663
  end
698
- end
699
664
 
700
- context "textarea with label" do
701
- it "does not contain the text" do
702
- @st.fill_in_with("Life story", "Blah dee blah")
703
- @st.field_contains("Life story", "spam").should be_false
665
+ it "exists, but not within scope" do
666
+ @st.select_radio("Briefs", :within => "food").should be_false
667
+ end
668
+
669
+ it "exists, but not in table row" do
670
+ # TODO
704
671
  end
705
672
  end
706
673
  end
707
674
  end
708
675
 
709
- describe "#field_equals" do
676
+ context "#radio_is_enabled" do
710
677
  context "passes when" do
711
- context "text field with label" do
712
- it "equals the text" do
713
- @st.fill_in_with("First name", "Ken")
714
- @st.field_equals("First name", "Ken").should be_true
715
- end
716
-
717
- it "equals the text, and is within scope" do
718
- @st.fill_in_with("First name", "Eric", :within => "person_form")
719
- @st.field_equals("First name", "Eric", :within => "person_form")
720
- end
721
- end
722
-
723
- context "textarea with label" do
724
- it "equals the text" do
725
- @st.fill_in_with("Life story", "Blah dee blah")
726
- @st.field_equals("Life story", "Blah dee blah").should be_true
678
+ context "radiobutton with label" do
679
+ it "exists, and is enabled" do
680
+ @st.select_radio("Briefs")
681
+ @st.radio_is_enabled("Briefs").should be_true
727
682
  end
728
683
 
729
- it "equals the text, and is within scope" do
730
- @st.fill_in_with("Life story", "Blah dee blah",
731
- :within => "person_form")
732
- @st.field_equals("Life story", "Blah dee blah",
733
- :within => "person_form").should be_true
684
+ it "exists within scope, and is enabled" do
685
+ @st.select_radio("Briefs", :within => "clothing")
686
+ @st.radio_is_enabled("Briefs", :within => "clothing").should be_true
734
687
  end
735
688
 
736
- it "equals the text, and is in table row" do
689
+ it "exists in table row, and is enabled" do
737
690
  # TODO
738
691
  end
739
692
  end
740
693
  end
741
694
 
742
695
  context "fails when" do
743
- context "text field with label" do
744
- it "does not exactly equal the text" do
745
- @st.fill_in_with("First name", "Marcus")
746
- @st.field_equals("First name", "Marc").should be_false
747
- end
748
- end
749
-
750
- context "textarea with label" do
751
- it "does not exactly equal the text" do
752
- @st.fill_in_with("Life story", "Blah dee blah")
753
- @st.field_equals("Life story", "Blah dee").should be_false
696
+ context "radiobutton with label" do
697
+ it "does not exist" do
698
+ @st.radio_is_enabled("Naked").should be_false
754
699
  end
755
700
 
756
- it "exactly equals the text, but is not within scope" do
757
- # TODO
701
+ it "exists, but is not enabled" do
702
+ @st.select_radio("Briefs")
703
+ @st.radio_is_enabled("Boxers").should be_false
758
704
  end
759
705
 
760
- it "exactly equals the text, but is not in table row" do
761
- # TODO
706
+ it "exists and is enabled, but not within scope" do
707
+ @st.select_radio("Briefs", :within => "clothing")
708
+ @st.radio_is_enabled("Briefs", :within => "food").should be_false
762
709
  end
763
710
  end
764
711
  end
765
712
  end
766
- end
713
+ end # radiobuttons
767
714
 
768
715
 
769
- context "visibility" do
716
+ context "dropdowns" do
770
717
  before(:each) do
771
- @st.visit("/").should be_true
718
+ @st.visit("/form").should be_true
772
719
  end
773
720
 
774
- describe "#see" do
721
+ context "#select_from_dropdown" do
775
722
  context "passes when" do
776
- it "text is present" do
777
- @st.see("Welcome").should be_true
778
- @st.see("This is a Sinatra webapp").should be_true
723
+ it "option exists in the dropdown" do
724
+ @st.select_from_dropdown("Tall", "Height").should be_true
725
+ @st.select_from_dropdown("Medium", "Weight").should be_true
726
+ end
727
+
728
+ it "option exists in the dropdown within scope" do
729
+ @st.select_from_dropdown("Tall", "Height", :within => "spouse_form").should be_true
730
+ end
731
+
732
+ it "option exists in the dropdown in table row" do
733
+ @st.visit("/table")
734
+ @st.select_from_dropdown("Male", "Gender", :in_row => "Eric").should be_true
779
735
  end
780
736
  end
781
737
 
782
738
  context "fails when" do
783
- it "text is absent" do
784
- @st.see("Nonexistent").should be_false
785
- @st.see("Some bogus text").should be_false
739
+ it "no such dropdown exists" do
740
+ @st.select_from_dropdown("Over easy", "Eggs").should be_false
786
741
  end
787
- end
788
742
 
789
- it "is case-sensitive" do
790
- @st.see("Sinatra webapp").should be_true
791
- @st.see("sinatra Webapp").should be_false
743
+ it "dropdown exists, but the option doesn't" do
744
+ @st.select_from_dropdown("Giant", "Height").should be_false
745
+ @st.select_from_dropdown("Obese", "Weight").should be_false
746
+ end
747
+
748
+ it "dropdown exists, but not within scope" do
749
+ @st.select_from_dropdown("Medium", "Weight", :within => "spouse_form").should be_false
750
+ end
751
+
752
+ it "dropdown exists, but not in table row" do
753
+ @st.visit("/table")
754
+ @st.select_from_dropdown("Female", "Gender", :in_row => "First name").should be_false
755
+ end
792
756
  end
793
757
  end
794
758
 
795
- describe "#do_not_see" do
759
+ context "#dropdown_includes" do
796
760
  context "passes when" do
797
- it "text is absent" do
798
- @st.do_not_see("Nonexistent").should be_true
799
- @st.do_not_see("Some bogus text").should be_true
761
+ it "option exists in the dropdown" do
762
+ @st.dropdown_includes("Height", "Tall").should be_true
763
+ @st.dropdown_includes("Weight", "Medium").should be_true
800
764
  end
801
765
  end
802
766
 
803
767
  context "fails when" do
804
- it "fails when test is present" do
805
- @st.do_not_see("Welcome").should be_false
806
- @st.do_not_see("This is a Sinatra webapp").should be_false
768
+ it "dropdown exists, but the option doesn't" do
769
+ @st.dropdown_includes("Height", "Giant").should be_false
770
+ @st.dropdown_includes("Weight", "Obese").should be_false
771
+ end
772
+
773
+ it "no such dropdown exists" do
774
+ @st.dropdown_includes("Eggs", "Over easy").should be_false
807
775
  end
808
776
  end
777
+ end
809
778
 
810
- it "is case-sensitive" do
811
- @st.do_not_see("Sinatra webapp").should be_false
812
- @st.do_not_see("sinatra Webapp").should be_true
779
+ context "#dropdown_equals" do
780
+ context "passes when" do
781
+ it "option is selected in the dropdown" do
782
+ ["Short", "Average", "Tall"].each do |height|
783
+ @st.select_from_dropdown(height, "Height")
784
+ @st.dropdown_equals("Height", height).should be_true
785
+ end
786
+ end
787
+
788
+ it "option is selected in the dropdown, within scope" do
789
+ ["Short", "Average", "Tall"].each do |height|
790
+ @st.select_from_dropdown(height, "Height", :within => "spouse_form")
791
+ @st.dropdown_equals("Height", height, :within => "spouse_form").should be_true
792
+ end
793
+ end
794
+
795
+ it "option is selected in the dropdown, in table row" do
796
+ @st.visit("/table")
797
+ ["Male", "Female"].each do |gender|
798
+ @st.select_from_dropdown(gender, "Gender", :in_row => "Eric")
799
+ @st.dropdown_equals("Gender", gender, :in_row => "Eric")
800
+ end
801
+ end
802
+ end
803
+
804
+ context "fails when" do
805
+ it "no such dropdown exists" do
806
+ @st.dropdown_equals("Eggs", "Over easy").should be_false
807
+ end
808
+
809
+ it "dropdown exists, but the option is not selected" do
810
+ @st.select_from_dropdown("Short", "Height")
811
+ @st.dropdown_equals("Height", "Average").should be_false
812
+ @st.dropdown_equals("Height", "Tall").should be_false
813
+
814
+ @st.select_from_dropdown("Average", "Height")
815
+ @st.dropdown_equals("Height", "Short").should be_false
816
+ @st.dropdown_equals("Height", "Tall").should be_false
817
+
818
+ @st.select_from_dropdown("Tall", "Height")
819
+ @st.dropdown_equals("Height", "Short").should be_false
820
+ @st.dropdown_equals("Height", "Average").should be_false
821
+ end
822
+
823
+ it "dropdown exists, and option is selected, but not in scope" do
824
+ @st.select_from_dropdown("Tall", "Height", :within => "person_form")
825
+ @st.select_from_dropdown("Short", "Height", :within => "spouse_form")
826
+ @st.dropdown_equals("Height", "Tall", :within => "spouse_form").should be_false
827
+ end
828
+
829
+ it "dropdown exists, and option is selected, but not in table row" do
830
+ @st.visit("/table")
831
+ @st.select_from_dropdown("Female", "Gender", :in_row => "Eric")
832
+ @st.select_from_dropdown("Male", "Gender", :in_row => "Marcus")
833
+ @st.dropdown_equals("Gender", "Female", :in_row => "Marcus").should be_false
834
+ end
813
835
  end
814
836
  end
815
- end
837
+ end # dropdowns
816
838
 
817
839
 
818
840
  context "tables" do
@@ -853,6 +875,159 @@ describe Rsel::SeleniumTest do
853
875
  end
854
876
  end
855
877
 
856
- end
878
+ end # tables
879
+
880
+
881
+ context "stop on error" do
882
+ before(:each) do
883
+ @st.visit("/").should be_true
884
+ @st.stop_on_error = true
885
+ end
886
+
887
+ after(:each) do
888
+ @st.stop_on_error = false
889
+ end
890
+
891
+ context "causes an exception to be raised" do
892
+ it "when #see fails" do
893
+ lambda do
894
+ @st.see("Nonexistent")
895
+ end.should raise_error(Rsel::StopTestStepFailed)
896
+ end
897
+
898
+ it "when #do_not_see fails" do
899
+ lambda do
900
+ @st.do_not_see("Welcome")
901
+ end.should raise_error(Rsel::StopTestStepFailed)
902
+ end
903
+
904
+ it "when #see_title fails" do
905
+ lambda do
906
+ @st.see_title("Wrong Title")
907
+ end.should raise_error(Rsel::StopTestStepFailed)
908
+ end
909
+
910
+ it "when #do_not_see_title fails" do
911
+ lambda do
912
+ @st.do_not_see_title("Rsel Test Site")
913
+ end.should raise_error(Rsel::StopTestStepFailed)
914
+ end
915
+
916
+ it "when #link_exists fails" do
917
+ lambda do
918
+ @st.link_exists("Bogus Link")
919
+ end.should raise_error(Rsel::StopTestStepFailed)
920
+ end
921
+
922
+ it "when #button_exists fails" do
923
+ lambda do
924
+ @st.button_exists("Bogus Button")
925
+ end.should raise_error(Rsel::StopTestStepFailed)
926
+ end
927
+
928
+ it "when #row_exists fails" do
929
+ lambda do
930
+ @st.row_exists("No, Such, Row")
931
+ end.should raise_error(Rsel::StopTestStepFailed)
932
+ end
933
+
934
+ it "when #type_into_field fails" do
935
+ lambda do
936
+ @st.type_into_field("Hello", "Bad Field")
937
+ end.should raise_error(Rsel::StopTestStepFailed)
938
+ end
939
+
940
+ it "when #field_contains fails" do
941
+ lambda do
942
+ @st.field_contains("Bad Field", "Hello")
943
+ end.should raise_error(Rsel::StopTestStepFailed)
944
+ end
945
+
946
+ it "when #field_equals fails" do
947
+ lambda do
948
+ @st.field_equals("Bad Field", "Hello")
949
+ end.should raise_error(Rsel::StopTestStepFailed)
950
+ end
951
+
952
+ it "when #click fails" do
953
+ lambda do
954
+ @st.click("No Such Link")
955
+ end.should raise_error(Rsel::StopTestStepFailed)
956
+ end
957
+
958
+ it "when #click_link fails" do
959
+ lambda do
960
+ @st.click_link("No Such Link")
961
+ end.should raise_error(Rsel::StopTestStepFailed)
962
+ end
963
+
964
+ it "when #click_button fails" do
965
+ lambda do
966
+ @st.click_button("No Such Link")
967
+ end.should raise_error(Rsel::StopTestStepFailed)
968
+ end
969
+
970
+ it "when #enable_checkbox fails" do
971
+ lambda do
972
+ @st.enable_checkbox("No Such Checkbox")
973
+ end.should raise_error(Rsel::StopTestStepFailed)
974
+ end
975
+
976
+ it "when #disable_checkbox fails" do
977
+ lambda do
978
+ @st.disable_checkbox("No Such Checkbox")
979
+ end.should raise_error(Rsel::StopTestStepFailed)
980
+ end
981
+
982
+ it "when #checkbox_is_enabled fails" do
983
+ lambda do
984
+ @st.checkbox_is_enabled("No Such Checkbox")
985
+ end.should raise_error(Rsel::StopTestStepFailed)
986
+ end
987
+
988
+ it "when #checkbox_is_disabled fails" do
989
+ lambda do
990
+ @st.checkbox_is_disabled("No Such Checkbox")
991
+ end.should raise_error(Rsel::StopTestStepFailed)
992
+ end
993
+
994
+ it "when #radio_is_enabled fails" do
995
+ lambda do
996
+ @st.radio_is_enabled("No Such Radio")
997
+ end.should raise_error(Rsel::StopTestStepFailed)
998
+ end
999
+
1000
+ it "when #radio_is_disabled fails" do
1001
+ lambda do
1002
+ @st.radio_is_disabled("No Such Radio")
1003
+ end.should raise_error(Rsel::StopTestStepFailed)
1004
+ end
1005
+
1006
+ it "when #select_radio fails" do
1007
+ lambda do
1008
+ @st.select_radio("No Such Radio")
1009
+ end.should raise_error(Rsel::StopTestStepFailed)
1010
+ end
1011
+
1012
+ it "when #select_from_dropdown fails" do
1013
+ lambda do
1014
+ @st.select_from_dropdown("Junk", "No Such Dropdown")
1015
+ end.should raise_error(Rsel::StopTestStepFailed)
1016
+ end
1017
+
1018
+ it "when #dropdown_includes fails" do
1019
+ lambda do
1020
+ @st.dropdown_includes("No Such Dropdown", "Junk")
1021
+ end.should raise_error(Rsel::StopTestStepFailed)
1022
+ end
1023
+
1024
+ it "when #dropdown_equals fails" do
1025
+ lambda do
1026
+ @st.dropdown_equals("No Such Dropdown", "Junk")
1027
+ end.should raise_error(Rsel::StopTestStepFailed)
1028
+ end
1029
+ end
1030
+ end # stop on error
1031
+
857
1032
  end
858
1033