capybara 0.1.3 → 0.1.4

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.
@@ -50,7 +50,7 @@ class TestApp < Sinatra::Base
50
50
  end
51
51
 
52
52
  post '/upload' do
53
- params[:form][:document][:tempfile].read
53
+ params[:form][:document][:tempfile].read rescue ''
54
54
  end
55
55
  end
56
56
 
@@ -2,8 +2,10 @@
2
2
 
3
3
  <form action="/form" method="post">
4
4
  <p>
5
- <label for="form_first_name">First Name</label>
6
- <input type="text" name="form[first_name]" value="John" id="form_first_name"/>
5
+ <label for="form_first_name">
6
+ First Name
7
+ <input type="text" name="form[first_name]" value="John" id="form_first_name"/>
8
+ </label>
7
9
  </p>
8
10
 
9
11
  <p>
@@ -11,11 +13,27 @@
11
13
  <input type="text" name="form[last_name]" value="Smith" id="form_last_name"/>
12
14
  </p>
13
15
 
16
+ <p>
17
+ <label for="form_name">Name</label>
18
+ <input type="text" name="form[name]" value="John Smith" id="form_name"/>
19
+ </p>
20
+
21
+ <p>
22
+ <label for="form_phone">Phone</label>
23
+ <input type="text" name="form[phone]" value="+1 555 7021" id="form_phone"/>
24
+ </p>
25
+
14
26
  <p>
15
27
  <label for="form_password">Password</label>
16
28
  <input type="password" name="form[password]" value="seeekrit" id="form_password"/>
17
29
  </p>
18
-
30
+
31
+ <p>
32
+ <label for="form_terms_of_use">Terms of Use</label>
33
+ <input type="hidden" name="form[terms_of_use]" value="0" id="form_terms_of_use_default">
34
+ <input type="checkbox" name="form[terms_of_use]" value="1" id="form_terms_of_use">
35
+ </p>
36
+
19
37
  <p>
20
38
  <label for="form_image">Image</label>
21
39
  <input type="file" name="form[image]" id="form_image"/>
@@ -101,6 +119,11 @@
101
119
  </form>
102
120
 
103
121
  <form action="/upload" method="post" enctype="multipart/form-data">
122
+ <p>
123
+ <label for="form_file_name">File Name</label>
124
+ <input type="file" name="form[file_name]" id="form_file_name"/>
125
+ </p>
126
+
104
127
  <p>
105
128
  <label for="form_document">Document</label>
106
129
  <input type="file" name="form[document]" id="form_document"/>
@@ -3,10 +3,27 @@
3
3
  <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
4
4
  <title>with_js</title>
5
5
  <script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
6
+ <script src="/jquery-ui.js" type="text/javascript" charset="utf-8"></script>
6
7
  <script type="text/javascript" charset="utf-8">
7
8
  //<![CDATA[
8
9
  $(function() {
9
10
  $('#change').text('I changed it');
11
+ $('#drag').draggable();
12
+ $('#drop').droppable({
13
+ drop: function(event, ui) {
14
+ ui.draggable.remove();
15
+ $(this).html('Dropped!');
16
+ }
17
+ });
18
+ $('#clickable').click(function() {
19
+ var link = $(this);
20
+ setTimeout(function() {
21
+ $(link).after('<a href="#">Has been clicked</a>');
22
+ $(link).after('<input type="submit" value="New Here">');
23
+ $(link).after('<input type="text" id="new_field">');
24
+ }, 500);
25
+ return false;
26
+ });
10
27
  });
11
28
  //]]>
12
29
  </script>
@@ -16,5 +33,13 @@
16
33
  <h1>FooBar</h1>
17
34
 
18
35
  <p id="change">This is text</p>
36
+ <div id="drag">
37
+ <p>This is a draggable element.</p>
38
+ </div>
39
+ <div id="drop">
40
+ <p>It should be dropped here.</p>
41
+ </div>
42
+
43
+ <p><a href="#" id="clickable">Click me</a></p>
19
44
  </body>
20
45
  </html>
@@ -0,0 +1,195 @@
1
+ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
+
3
+ describe Capybara::XPath do
4
+
5
+ before do
6
+ @driver = Capybara::Driver::RackTest.new(TestApp)
7
+ @driver.visit('/form')
8
+ @xpath = Capybara::XPath.new
9
+ end
10
+
11
+ it "should proxy any class method calls to a new instance" do
12
+ @query = Capybara::XPath.fillable_field('First Name').to_s
13
+ @driver.find(@query).first.value.should == 'John'
14
+ end
15
+
16
+ it "should respond to instance methods at the class level" do
17
+ Capybara::XPath.should respond_to(:fillable_field)
18
+ end
19
+
20
+ describe '.wrap' do
21
+ it "should return an XPath unmodified" do
22
+ Capybara::XPath.wrap(@xpath).should == @xpath
23
+ end
24
+
25
+ it "should wrap a string in an xpath object" do
26
+ @xpath = Capybara::XPath.wrap('//foo/bar')
27
+ @xpath.should be_an_instance_of(Capybara::XPath)
28
+ @xpath.paths.should == ['//foo/bar']
29
+ end
30
+ end
31
+
32
+ describe '#scope' do
33
+ it "should prepend the given scope to all paths" do
34
+ @xpath = Capybara::XPath.new('//foo/bar', '//test[@blah=foo]').scope('//quox')
35
+ @xpath.paths.should include('//quox//foo/bar', '//quox//test[@blah=foo]')
36
+ end
37
+ end
38
+
39
+ describe '#field' do
40
+ it "should find any field by id or label" do
41
+ @query = @xpath.field('First Name').to_s
42
+ @driver.find(@query).first.value.should == 'John'
43
+ @query = @xpath.field('Password').to_s
44
+ @driver.find(@query).first.value.should == 'seeekrit'
45
+ @query = @xpath.field('Description').to_s
46
+ @driver.find(@query).first.text.should == 'Descriptive text goes here'
47
+ @query = @xpath.field('Document').to_s
48
+ @driver.find(@query).first[:name].should == 'form[document]'
49
+ @query = @xpath.field('Cat').to_s
50
+ @driver.find(@query).first.value.should == 'cat'
51
+ @query = @xpath.field('Male').to_s
52
+ @driver.find(@query).first.value.should == 'male'
53
+ @query = @xpath.field('Region').to_s
54
+ @driver.find(@query).first[:name].should == 'form[region]'
55
+ end
56
+
57
+ it "should be chainable" do
58
+ @query = @xpath.field('First Name').password_field('First Name').to_s
59
+ @driver.find(@query).first.value.should == 'John'
60
+ @query = @xpath.field('Password').password_field('Password').to_s
61
+ @driver.find(@query).first.value.should == 'seeekrit'
62
+ end
63
+ end
64
+
65
+ describe '#fillable_field' do
66
+ it "should find a text field, password field, or text area by id or label" do
67
+ @query = @xpath.fillable_field('First Name').to_s
68
+ @driver.find(@query).first.value.should == 'John'
69
+ @query = @xpath.fillable_field('Password').to_s
70
+ @driver.find(@query).first.value.should == 'seeekrit'
71
+ @query = @xpath.fillable_field('Description').to_s
72
+ @driver.find(@query).first.text.should == 'Descriptive text goes here'
73
+ end
74
+
75
+ it "should be chainable" do
76
+ @query = @xpath.fillable_field('First Name').password_field('First Name').to_s
77
+ @driver.find(@query).first.value.should == 'John'
78
+ @query = @xpath.fillable_field('Password').password_field('Password').to_s
79
+ @driver.find(@query).first.value.should == 'seeekrit'
80
+ end
81
+ end
82
+
83
+ describe '#text_field' do
84
+ it "should find a text field by id or label" do
85
+ @query = @xpath.text_field('form_first_name').to_s
86
+ @driver.find(@query).first.value.should == 'John'
87
+ @query = @xpath.text_field('First Name').to_s
88
+ @driver.find(@query).first.value.should == 'John'
89
+ end
90
+
91
+ it "should be chainable" do
92
+ @query = @xpath.text_field('First Name').password_field('First Name').to_s
93
+ @driver.find(@query).first.value.should == 'John'
94
+ @query = @xpath.text_field('Password').password_field('Password').to_s
95
+ @driver.find(@query).first.value.should == 'seeekrit'
96
+ end
97
+ end
98
+
99
+ describe '#password_field' do
100
+ it "should find a password field by id or label" do
101
+ @query = @xpath.password_field('form_password').to_s
102
+ @driver.find(@query).first.value.should == 'seeekrit'
103
+ @query = @xpath.password_field('Password').to_s
104
+ @driver.find(@query).first.value.should == 'seeekrit'
105
+ end
106
+
107
+ it "should be chainable" do
108
+ @query = @xpath.password_field('First Name').text_field('First Name').to_s
109
+ @driver.find(@query).first.value.should == 'John'
110
+ @query = @xpath.password_field('Password').text_field('Password').to_s
111
+ @driver.find(@query).first.value.should == 'seeekrit'
112
+ end
113
+ end
114
+
115
+ describe '#text_area' do
116
+ it "should find a text area by id or label" do
117
+ @query = @xpath.text_area('form_description').to_s
118
+ @driver.find(@query).first.text.should == 'Descriptive text goes here'
119
+ @query = @xpath.text_area('Description').to_s
120
+ @driver.find(@query).first.text.should == 'Descriptive text goes here'
121
+ end
122
+
123
+ it "should be chainable" do
124
+ @query = @xpath.text_area('Description').password_field('Description').to_s
125
+ @driver.find(@query).first.text.should == 'Descriptive text goes here'
126
+ @query = @xpath.text_area('Password').password_field('Password').to_s
127
+ @driver.find(@query).first.value.should == 'seeekrit'
128
+ end
129
+ end
130
+
131
+ describe '#radio_button' do
132
+ it "should find a radio button by id or label" do
133
+ @query = @xpath.radio_button('Male').to_s
134
+ @driver.find(@query).first.value.should == 'male'
135
+ @query = @xpath.radio_button('gender_male').to_s
136
+ @driver.find(@query).first.value.should == 'male'
137
+ end
138
+
139
+ it "should be chainable" do
140
+ @query = @xpath.radio_button('Male').password_field('Male').to_s
141
+ @driver.find(@query).first.value.should == 'male'
142
+ @query = @xpath.radio_button('Password').password_field('Password').to_s
143
+ @driver.find(@query).first.value.should == 'seeekrit'
144
+ end
145
+ end
146
+
147
+ describe '#checkbox' do
148
+ it "should find a checkbox by id or label" do
149
+ @query = @xpath.checkbox('Cat').to_s
150
+ @driver.find(@query).first.value.should == 'cat'
151
+ @query = @xpath.checkbox('form_pets_cat').to_s
152
+ @driver.find(@query).first.value.should == 'cat'
153
+ end
154
+
155
+ it "should be chainable" do
156
+ @query = @xpath.checkbox('Cat').password_field('Cat').to_s
157
+ @driver.find(@query).first.value.should == 'cat'
158
+ @query = @xpath.checkbox('Password').password_field('Password').to_s
159
+ @driver.find(@query).first.value.should == 'seeekrit'
160
+ end
161
+ end
162
+
163
+ describe '#select' do
164
+ it "should find a select by id or label" do
165
+ @query = @xpath.select('Region').to_s
166
+ @driver.find(@query).first[:name].should == 'form[region]'
167
+ @query = @xpath.select('form_region').to_s
168
+ @driver.find(@query).first[:name].should == 'form[region]'
169
+ end
170
+
171
+ it "should be chainable" do
172
+ @query = @xpath.select('Region').password_field('Region').to_s
173
+ @driver.find(@query).first[:name].should == 'form[region]'
174
+ @query = @xpath.select('Password').password_field('Password').to_s
175
+ @driver.find(@query).first.value.should == 'seeekrit'
176
+ end
177
+ end
178
+
179
+ describe '#file_field' do
180
+ it "should find a file field by id or label" do
181
+ @query = @xpath.file_field('Document').to_s
182
+ @driver.find(@query).first[:name].should == 'form[document]'
183
+ @query = @xpath.file_field('form_document').to_s
184
+ @driver.find(@query).first[:name].should == 'form[document]'
185
+ end
186
+
187
+ it "should be chainable" do
188
+ @query = @xpath.file_field('Document').password_field('Document').to_s
189
+ @driver.find(@query).first[:name].should == 'form[document]'
190
+ @query = @xpath.file_field('Password').password_field('Password').to_s
191
+ @driver.find(@query).first.value.should == 'seeekrit'
192
+ end
193
+ end
194
+
195
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Nicklas
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-30 00:00:00 +01:00
12
+ date: 2009-12-12 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -115,10 +115,9 @@ files:
115
115
  - Rakefile
116
116
  - lib/capybara.rb
117
117
  - lib/capybara/cucumber.rb
118
+ - lib/capybara/driver/base.rb
118
119
  - lib/capybara/driver/culerity_driver.rb
119
- - lib/capybara/driver/firewatir_driver.rb
120
120
  - lib/capybara/driver/rack_test_driver.rb
121
- - lib/capybara/driver/safariwatir_driver.rb
122
121
  - lib/capybara/driver/selenium_driver.rb
123
122
  - lib/capybara/dsl.rb
124
123
  - lib/capybara/node.rb
@@ -126,17 +125,17 @@ files:
126
125
  - lib/capybara/save_and_open_page.rb
127
126
  - lib/capybara/server.rb
128
127
  - lib/capybara/session.rb
128
+ - lib/capybara/xpath.rb
129
129
  - script/console
130
130
  - script/destroy
131
131
  - script/generate
132
132
  - spec/driver/culerity_driver_spec.rb
133
- - spec/driver/firewatir_driver_spec.rb
134
133
  - spec/driver/rack_test_driver_spec.rb
135
- - spec/driver/safariwarit_driver_spec.rb
136
134
  - spec/driver/selenium_driver_spec.rb
137
135
  - spec/drivers_spec.rb
138
136
  - spec/dsl_spec.rb
139
137
  - spec/fixtures/test_file.txt
138
+ - spec/public/jquery-ui.js
140
139
  - spec/public/jquery.js
141
140
  - spec/save_and_open_page_spec.rb
142
141
  - spec/session/culerity_session_spec.rb
@@ -153,6 +152,7 @@ files:
153
152
  - spec/views/with_js.erb
154
153
  - spec/views/with_scope.erb
155
154
  - spec/views/with_simple_html.erb
155
+ - spec/xpath_spec.rb
156
156
  has_rdoc: true
157
157
  homepage: http://github.com/jnicklas/capybara
158
158
  licenses: []
@@ -1,66 +0,0 @@
1
- require 'watir'
2
- Watir::Browser.default = "firefox"
3
-
4
- class Capybara::Driver::FireWatir
5
- class Node < Struct.new(:node)
6
- def text
7
- node.text
8
- end
9
-
10
- def attribute(name)
11
- value = if name.to_sym == :class
12
- node.class_name
13
- else
14
- node.send(name.to_sym)
15
- end
16
- return value if value and not value.empty?
17
- end
18
-
19
- def click
20
- node.click
21
- end
22
-
23
- def tag_name
24
- # FIXME: this might be the dumbest way ever of getting the tag name
25
- # there has to be something better...
26
- node.to_xml[/^\s*<([a-z0-9\-\:]+)/, 1]
27
- end
28
- end
29
-
30
- attr_reader :app, :rack_server
31
-
32
- def initialize(app)
33
- @app = app
34
- @rack_server = Capybara::Server.new(@app)
35
- @rack_server.boot
36
- end
37
-
38
- def visit(path)
39
- browser.goto(url(path))
40
- end
41
-
42
- def body
43
- browser.html
44
- end
45
-
46
- def find(selector)
47
- browser.elements_by_xpath(selector).map { |node| Node.new(node) }
48
- end
49
-
50
- private
51
-
52
- def url(path)
53
- rack_server.url(path)
54
- end
55
-
56
- def browser
57
- unless @_browser
58
- @_browser = Watir::Browser.new
59
- at_exit do
60
- @_browser.exit
61
- end
62
- end
63
- @_browser
64
- end
65
-
66
- end
@@ -1,67 +0,0 @@
1
- require 'safariwatir'
2
-
3
- class Capybara::Driver::SafariWatir
4
- class Node < Struct.new(:node)
5
- def text
6
- node.text
7
- end
8
-
9
- def attribute(name)
10
- value = if name.to_sym == :class
11
- node.class_name
12
- else
13
- node.send(name.to_sym)
14
- end
15
- return value if value and not value.empty?
16
- end
17
-
18
- def click
19
- node.click
20
- end
21
-
22
- def tag_name
23
- # FIXME: this might be the dumbest way ever of getting the tag name
24
- # there has to be something better...
25
- node.to_xml[/^\s*<([a-z0-9\-\:]+)/, 1]
26
- end
27
- end
28
-
29
- attr_reader :app, :rack_server
30
-
31
- def initialize(app)
32
- @app = app
33
- @rack_server = Capybara::Server.new(@app)
34
- @rack_server.boot
35
- end
36
-
37
- def visit(path)
38
- browser.goto(url(path))
39
- end
40
-
41
- def body
42
- browser.html
43
- end
44
-
45
- def find(selector)
46
- foo = Struct.new(:what).new
47
- foo.what = selector
48
- browser.send(:scripter).operate_by_xpath(foo){}.map { |node| Node.new(node) }
49
- end
50
-
51
- private
52
-
53
- def url(path)
54
- rack_server.url(path)
55
- end
56
-
57
- def browser
58
- unless @_browser
59
- @_browser = Watir::Safari.new
60
- at_exit do
61
- @_browser.exit
62
- end
63
- end
64
- @_browser
65
- end
66
-
67
- end