rsel 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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