capybara-webkit 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.travis.yml +19 -13
- data/Appraisals +8 -4
- data/Gemfile.lock +29 -14
- data/NEWS.md +4 -0
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/capybara-webkit.gemspec +2 -1
- data/gemfiles/2.0.gemfile.lock +10 -6
- data/gemfiles/2.1.gemfile.lock +22 -9
- data/gemfiles/2.2.gemfile +7 -0
- data/gemfiles/2.2.gemfile.lock +77 -0
- data/gemfiles/2.3.gemfile +7 -0
- data/gemfiles/2.3.gemfile.lock +77 -0
- data/lib/capybara/webkit/browser.rb +28 -4
- data/lib/capybara/webkit/connection.rb +9 -24
- data/lib/capybara/webkit/driver.rb +40 -4
- data/lib/capybara/webkit/errors.rb +3 -0
- data/lib/capybara/webkit/version.rb +1 -1
- data/spec/browser_spec.rb +1 -1
- data/spec/connection_spec.rb +27 -5
- data/spec/driver_rendering_spec.rb +10 -0
- data/spec/driver_resize_window_spec.rb +22 -0
- data/spec/driver_spec.rb +117 -9
- data/spec/selenium_compatibility_spec.rb +3 -0
- data/spec/spec_helper.rb +22 -3
- data/spec/support/matchers/include_response.rb +24 -0
- data/src/CommandFactory.cpp +7 -1
- data/src/GoBack.cpp +12 -0
- data/src/GoBack.h +10 -0
- data/src/GoForward.cpp +12 -0
- data/src/GoForward.h +10 -0
- data/src/Render.cpp +10 -1
- data/src/Reset.cpp +0 -2
- data/src/SocketCommand.cpp +6 -0
- data/src/SocketCommand.h +1 -0
- data/src/StdinNotifier.cpp +16 -0
- data/src/StdinNotifier.h +20 -0
- data/src/WebPage.cpp +20 -5
- data/src/WebPage.h +4 -1
- data/src/WebPageManager.cpp +18 -7
- data/src/WebPageManager.h +2 -1
- data/src/WindowClose.cpp +10 -0
- data/src/WindowClose.h +12 -0
- data/src/WindowCommand.cpp +27 -0
- data/src/WindowCommand.h +21 -0
- data/src/WindowFocus.cpp +2 -25
- data/src/WindowFocus.h +4 -7
- data/src/WindowMaximize.cpp +14 -0
- data/src/WindowMaximize.h +12 -0
- data/src/WindowOpen.cpp +12 -0
- data/src/WindowOpen.h +10 -0
- data/src/WindowResize.cpp +16 -0
- data/src/WindowResize.h +12 -0
- data/src/WindowSize.cpp +17 -0
- data/src/WindowSize.h +12 -0
- data/src/capybara.js +19 -3
- data/src/find_command.h +7 -1
- data/src/main.cpp +4 -0
- data/src/webkit_server.pro +20 -4
- data/templates/Command.cpp +2 -0
- data/templates/Command.h +1 -3
- metadata +82 -54
- data/src/ResizeWindow.cpp +0 -17
- data/src/ResizeWindow.h +0 -10
@@ -102,6 +102,26 @@ module Capybara::Webkit
|
|
102
102
|
command("WindowFocus", selector)
|
103
103
|
end
|
104
104
|
|
105
|
+
def window_open
|
106
|
+
command("WindowOpen")
|
107
|
+
end
|
108
|
+
|
109
|
+
def window_close(selector)
|
110
|
+
command("WindowClose", selector)
|
111
|
+
end
|
112
|
+
|
113
|
+
def window_resize(handle, width, height)
|
114
|
+
command("WindowResize", handle, width.to_i, height.to_i)
|
115
|
+
end
|
116
|
+
|
117
|
+
def window_size(handle)
|
118
|
+
JSON.parse(command("WindowSize", handle))
|
119
|
+
end
|
120
|
+
|
121
|
+
def window_maximize(handle)
|
122
|
+
command("WindowMaximize", handle)
|
123
|
+
end
|
124
|
+
|
105
125
|
def get_window_handles
|
106
126
|
JSON.parse(command('GetWindowHandles'))
|
107
127
|
end
|
@@ -195,14 +215,18 @@ module Capybara::Webkit
|
|
195
215
|
command("SetProxy")
|
196
216
|
end
|
197
217
|
|
198
|
-
def resize_window(width, height)
|
199
|
-
command("ResizeWindow", width.to_i, height.to_i)
|
200
|
-
end
|
201
|
-
|
202
218
|
def version
|
203
219
|
command("Version")
|
204
220
|
end
|
205
221
|
|
222
|
+
def go_back
|
223
|
+
command("GoBack")
|
224
|
+
end
|
225
|
+
|
226
|
+
def go_forward
|
227
|
+
command("GoForward")
|
228
|
+
end
|
229
|
+
|
206
230
|
private
|
207
231
|
|
208
232
|
def check
|
@@ -8,7 +8,7 @@ module Capybara::Webkit
|
|
8
8
|
SERVER_PATH = File.expand_path("../../../../bin/webkit_server", __FILE__)
|
9
9
|
WEBKIT_SERVER_START_TIMEOUT = 15
|
10
10
|
|
11
|
-
attr_reader :port
|
11
|
+
attr_reader :port, :pid
|
12
12
|
|
13
13
|
def initialize(options = {})
|
14
14
|
@socket = nil
|
@@ -16,7 +16,8 @@ module Capybara::Webkit
|
|
16
16
|
if options.has_key?(:stderr)
|
17
17
|
@output_target = options[:stderr]
|
18
18
|
elsif options.has_key?(:stdout)
|
19
|
-
warn
|
19
|
+
warn '[DEPRECATION] The Capybara::Webkit::Connection `stdout` option ' \
|
20
|
+
'is deprecated. Please use `stderr` instead.'
|
20
21
|
@output_target = options[:stdout]
|
21
22
|
else
|
22
23
|
@output_target = $stderr
|
@@ -46,32 +47,12 @@ module Capybara::Webkit
|
|
46
47
|
def start_server
|
47
48
|
open_pipe
|
48
49
|
discover_port
|
50
|
+
discover_pid
|
49
51
|
forward_output_in_background_thread
|
50
52
|
end
|
51
53
|
|
52
54
|
def open_pipe
|
53
|
-
|
54
|
-
@pid = wait_thr[:pid]
|
55
|
-
register_shutdown_hook
|
56
|
-
end
|
57
|
-
|
58
|
-
def register_shutdown_hook
|
59
|
-
@owner_pid = Process.pid
|
60
|
-
at_exit do
|
61
|
-
if Process.pid == @owner_pid
|
62
|
-
kill_process
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def kill_process
|
68
|
-
if RUBY_PLATFORM =~ /mingw32/
|
69
|
-
Process.kill(9, @pid)
|
70
|
-
else
|
71
|
-
Process.kill("INT", @pid)
|
72
|
-
end
|
73
|
-
rescue Errno::ESRCH
|
74
|
-
# This just means that the webkit_server process has already ended
|
55
|
+
@pipe_stdin, @pipe_stdout, @pipe_stderr, @wait_thr = Open3.popen3(SERVER_PATH)
|
75
56
|
end
|
76
57
|
|
77
58
|
def discover_port
|
@@ -80,6 +61,10 @@ module Capybara::Webkit
|
|
80
61
|
end
|
81
62
|
end
|
82
63
|
|
64
|
+
def discover_pid
|
65
|
+
@pid = @wait_thr[:pid]
|
66
|
+
end
|
67
|
+
|
83
68
|
def forward_output_in_background_thread
|
84
69
|
Thread.new do
|
85
70
|
Thread.current.abort_on_exception = true
|
@@ -89,7 +89,15 @@ module Capybara::Webkit
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def resize_window(width, height)
|
92
|
-
|
92
|
+
resize_window_to(current_window_handle, width, height)
|
93
|
+
end
|
94
|
+
|
95
|
+
def resize_window_to(handle, width, height)
|
96
|
+
browser.window_resize(handle, width, height)
|
97
|
+
end
|
98
|
+
|
99
|
+
def window_size(handle)
|
100
|
+
browser.window_size(handle)
|
93
101
|
end
|
94
102
|
|
95
103
|
def within_frame(selector)
|
@@ -102,8 +110,8 @@ module Capybara::Webkit
|
|
102
110
|
end
|
103
111
|
|
104
112
|
def within_window(selector)
|
105
|
-
current_window =
|
106
|
-
|
113
|
+
current_window = current_window_handle
|
114
|
+
switch_to_window(selector)
|
107
115
|
begin
|
108
116
|
yield
|
109
117
|
ensure
|
@@ -111,14 +119,30 @@ module Capybara::Webkit
|
|
111
119
|
end
|
112
120
|
end
|
113
121
|
|
122
|
+
def switch_to_window(selector)
|
123
|
+
browser.window_focus(selector)
|
124
|
+
end
|
125
|
+
|
114
126
|
def window_handles
|
115
127
|
browser.get_window_handles
|
116
128
|
end
|
117
129
|
|
118
|
-
def
|
130
|
+
def current_window_handle
|
119
131
|
browser.get_window_handle
|
120
132
|
end
|
121
133
|
|
134
|
+
def open_new_window
|
135
|
+
browser.window_open
|
136
|
+
end
|
137
|
+
|
138
|
+
def close_window(selector)
|
139
|
+
browser.window_close(selector)
|
140
|
+
end
|
141
|
+
|
142
|
+
def maximize_window(selector)
|
143
|
+
browser.window_maximize(selector)
|
144
|
+
end
|
145
|
+
|
122
146
|
def accept_js_confirms!
|
123
147
|
browser.accept_js_confirms
|
124
148
|
end
|
@@ -143,6 +167,14 @@ module Capybara::Webkit
|
|
143
167
|
end
|
144
168
|
end
|
145
169
|
|
170
|
+
def go_back
|
171
|
+
browser.go_back
|
172
|
+
end
|
173
|
+
|
174
|
+
def go_forward
|
175
|
+
browser.go_forward
|
176
|
+
end
|
177
|
+
|
146
178
|
def wait?
|
147
179
|
true
|
148
180
|
end
|
@@ -174,6 +206,10 @@ module Capybara::Webkit
|
|
174
206
|
[Capybara::Webkit::ClickFailed]
|
175
207
|
end
|
176
208
|
|
209
|
+
def no_such_window_error
|
210
|
+
Capybara::Webkit::NoSuchWindowError
|
211
|
+
end
|
212
|
+
|
177
213
|
def version
|
178
214
|
[
|
179
215
|
"Capybara: #{Capybara::VERSION}",
|
data/spec/browser_spec.rb
CHANGED
@@ -148,7 +148,7 @@ describe Capybara::Webkit::Browser do
|
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
151
|
-
describe "forking", :
|
151
|
+
describe "forking", skip_on_windows: true, skip_on_jruby: true do
|
152
152
|
it "only shuts down the server from the main process" do
|
153
153
|
browser.reset!
|
154
154
|
pid = fork {}
|
data/spec/connection_spec.rb
CHANGED
@@ -2,6 +2,27 @@ require 'spec_helper'
|
|
2
2
|
require 'capybara/webkit/connection'
|
3
3
|
|
4
4
|
describe Capybara::Webkit::Connection do
|
5
|
+
it "kills the process when the parent process dies", skip_on_windows: true, skip_on_jruby: true do
|
6
|
+
read_io, write_io = IO.pipe
|
7
|
+
|
8
|
+
fork_pid = fork do
|
9
|
+
read_io.close
|
10
|
+
connection = Capybara::Webkit::Connection.new
|
11
|
+
write_io.write(connection.pid)
|
12
|
+
write_io.close
|
13
|
+
Process.wait(connection.pid)
|
14
|
+
end
|
15
|
+
|
16
|
+
write_io.close
|
17
|
+
|
18
|
+
webkit_pid = read_io.read.to_i
|
19
|
+
webkit_pid.should be > 1
|
20
|
+
read_io.close
|
21
|
+
Process.kill(9, fork_pid)
|
22
|
+
sleep 1
|
23
|
+
expect { Process.getpgid(webkit_pid) }.to raise_error Errno::ESRCH
|
24
|
+
end
|
25
|
+
|
5
26
|
it "boots a server to talk to" do
|
6
27
|
url = "http://#{@rack_server.host}:#{@rack_server.port}/"
|
7
28
|
connection.puts "Visit"
|
@@ -19,17 +40,18 @@ describe Capybara::Webkit::Connection do
|
|
19
40
|
end
|
20
41
|
|
21
42
|
it 'forwards stderr to the given IO object' do
|
22
|
-
|
23
|
-
redirected_connection = Capybara::Webkit::Connection.new(:stderr =>
|
24
|
-
script = 'console.log("hello world")'
|
43
|
+
read_io, write_io = IO.pipe
|
44
|
+
redirected_connection = Capybara::Webkit::Connection.new(:stderr => write_io)
|
25
45
|
redirected_connection.puts "EnableLogging"
|
26
46
|
redirected_connection.puts 0
|
47
|
+
|
48
|
+
script = 'console.log("hello world")'
|
27
49
|
redirected_connection.puts "Execute"
|
28
50
|
redirected_connection.puts 1
|
29
51
|
redirected_connection.puts script.to_s.bytesize
|
30
52
|
redirected_connection.print script
|
31
|
-
|
32
|
-
|
53
|
+
|
54
|
+
expect(read_io).to include_response "\nhello world"
|
33
55
|
end
|
34
56
|
|
35
57
|
it 'does not forward stderr to nil' do
|
@@ -90,4 +90,14 @@ describe Capybara::Webkit::Driver, "rendering an image" do
|
|
90
90
|
driver.evaluate_script('window.innerHeight').should eq 600
|
91
91
|
end
|
92
92
|
end
|
93
|
+
|
94
|
+
context "with invalid filepath" do
|
95
|
+
before do
|
96
|
+
@file_name = File.dirname(@file_name)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "raises an InvalidResponseError" do
|
100
|
+
expect { render({}) }.to raise_error(Capybara::Webkit::InvalidResponseError)
|
101
|
+
end
|
102
|
+
end
|
93
103
|
end
|
@@ -45,4 +45,26 @@ describe Capybara::Webkit::Driver, "#resize_window(width, height)" do
|
|
45
45
|
driver.visit("#{AppRunner.app_host}/")
|
46
46
|
driver.html.should include(DEFAULT_DIMENTIONS)
|
47
47
|
end
|
48
|
+
|
49
|
+
it "resizes windows by handle" do
|
50
|
+
driver.visit("#{AppRunner.app_host}/")
|
51
|
+
driver.open_new_window
|
52
|
+
driver.visit("#{AppRunner.app_host}/")
|
53
|
+
|
54
|
+
driver.resize_window_to(driver.window_handles.first, 800, 600)
|
55
|
+
driver.resize_window_to(driver.window_handles.last, 400, 300)
|
56
|
+
|
57
|
+
driver.window_size(driver.window_handles.first).should eq [800, 600]
|
58
|
+
driver.window_size(driver.window_handles.last).should eq [400, 300]
|
59
|
+
end
|
60
|
+
|
61
|
+
it "maximizes a window" do
|
62
|
+
driver.visit("#{AppRunner.app_host}/")
|
63
|
+
driver.resize_window(400, 300)
|
64
|
+
driver.maximize_window(driver.current_window_handle)
|
65
|
+
width, height = *driver.window_size(driver.current_window_handle)
|
66
|
+
|
67
|
+
width.should be > 400
|
68
|
+
height.should be > 300
|
69
|
+
end
|
48
70
|
end
|
data/spec/driver_spec.rb
CHANGED
@@ -341,6 +341,9 @@ describe Capybara::Webkit::Driver do
|
|
341
341
|
<div id="hidden-text">
|
342
342
|
Some of this text is <em style="display:none">hidden!</em>
|
343
343
|
</div>
|
344
|
+
<div id="hidden-ancestor" style="display: none">
|
345
|
+
<div>Hello</div>
|
346
|
+
</div>
|
344
347
|
<input type="text" disabled="disabled"/>
|
345
348
|
<input id="checktest" type="checkbox" checked="checked"/>
|
346
349
|
<script type="text/javascript">
|
@@ -353,6 +356,12 @@ describe Capybara::Webkit::Driver do
|
|
353
356
|
|
354
357
|
before { visit("/") }
|
355
358
|
|
359
|
+
it "doesn't return text if the ancestor is hidden" do
|
360
|
+
visit("/")
|
361
|
+
|
362
|
+
driver.find_css("#hidden-ancestor div").first.text.should eq ''
|
363
|
+
end
|
364
|
+
|
356
365
|
it "handles anchor tags" do
|
357
366
|
visit("#test")
|
358
367
|
driver.find_xpath("//*[contains(., 'hello')]").should_not be_empty
|
@@ -1081,7 +1090,7 @@ describe Capybara::Webkit::Driver do
|
|
1081
1090
|
<input class="watch" type="password"/>
|
1082
1091
|
<input class="watch" type="search"/>
|
1083
1092
|
<input class="watch" type="tel"/>
|
1084
|
-
<input class="watch" type="text"/>
|
1093
|
+
<input class="watch" type="text" value="original"/>
|
1085
1094
|
<input class="watch" type="url"/>
|
1086
1095
|
<textarea class="watch"></textarea>
|
1087
1096
|
<input class="watch" type="checkbox"/>
|
@@ -1117,7 +1126,7 @@ describe Capybara::Webkit::Driver do
|
|
1117
1126
|
|
1118
1127
|
before { visit("/") }
|
1119
1128
|
|
1120
|
-
let(:newtext) { '
|
1129
|
+
let(:newtext) { '12345' }
|
1121
1130
|
|
1122
1131
|
let(:keyevents) do
|
1123
1132
|
(%w{focus} +
|
@@ -1125,13 +1134,22 @@ describe Capybara::Webkit::Driver do
|
|
1125
1134
|
).flatten
|
1126
1135
|
end
|
1127
1136
|
|
1137
|
+
let(:textevents) { keyevents + %w(change blur) }
|
1138
|
+
|
1128
1139
|
%w(email number password search tel text url).each do | field_type |
|
1129
1140
|
it "triggers text input events on inputs of type #{field_type}" do
|
1130
1141
|
driver.find_xpath("//input[@type='#{field_type}']").first.set(newtext)
|
1131
|
-
driver.find_xpath("//
|
1142
|
+
driver.find_xpath("//body").first.click
|
1143
|
+
driver.find_xpath("//li").map(&:visible_text).should eq textevents
|
1132
1144
|
end
|
1133
1145
|
end
|
1134
1146
|
|
1147
|
+
it "triggers events for cleared inputs" do
|
1148
|
+
driver.find_xpath("//input[@type='text']").first.set('')
|
1149
|
+
driver.find_xpath("//body").first.click
|
1150
|
+
driver.find_xpath("//li").map(&:visible_text).should include('change')
|
1151
|
+
end
|
1152
|
+
|
1135
1153
|
it "triggers textarea input events" do
|
1136
1154
|
driver.find_xpath("//textarea").first.set(newtext)
|
1137
1155
|
driver.find_xpath("//li").map(&:visible_text).should eq keyevents
|
@@ -1925,6 +1943,42 @@ describe Capybara::Webkit::Driver do
|
|
1925
1943
|
end
|
1926
1944
|
end
|
1927
1945
|
|
1946
|
+
it "can switch to another window" do
|
1947
|
+
visit("/new_window")
|
1948
|
+
driver.switch_to_window(driver.window_handles.last)
|
1949
|
+
driver.find_xpath("//p").first.visible_text.should eq "finished"
|
1950
|
+
end
|
1951
|
+
|
1952
|
+
it "knows the current window handle" do
|
1953
|
+
visit("/new_window")
|
1954
|
+
driver.within_window(driver.window_handles.last) do
|
1955
|
+
driver.current_window_handle.should eq driver.window_handles.last
|
1956
|
+
end
|
1957
|
+
end
|
1958
|
+
|
1959
|
+
it "can close the current window" do
|
1960
|
+
visit("/new_window")
|
1961
|
+
original_handle = driver.current_window_handle
|
1962
|
+
driver.switch_to_window(driver.window_handles.last)
|
1963
|
+
driver.close_window(driver.current_window_handle)
|
1964
|
+
|
1965
|
+
driver.current_window_handle.should eq(original_handle)
|
1966
|
+
end
|
1967
|
+
|
1968
|
+
it "can close an unfocused window" do
|
1969
|
+
visit("/new_window")
|
1970
|
+
driver.close_window(driver.window_handles.last)
|
1971
|
+
driver.window_handles.size.should eq(1)
|
1972
|
+
end
|
1973
|
+
|
1974
|
+
it "can close the last window" do
|
1975
|
+
visit("/new_window")
|
1976
|
+
handles = driver.window_handles
|
1977
|
+
handles.each { |handle| driver.close_window(handle) }
|
1978
|
+
driver.html.should be_empty
|
1979
|
+
handles.should_not include(driver.current_window_handle)
|
1980
|
+
end
|
1981
|
+
|
1928
1982
|
it "waits for the new window to load" do
|
1929
1983
|
visit("/new_window?sleep=1")
|
1930
1984
|
driver.within_window(driver.window_handles.last) do
|
@@ -1969,7 +2023,7 @@ describe Capybara::Webkit::Driver do
|
|
1969
2023
|
|
1970
2024
|
it "raises an error if the window is not found" do
|
1971
2025
|
expect { driver.within_window('myWindowDoesNotExist') }.
|
1972
|
-
to raise_error(Capybara::Webkit::
|
2026
|
+
to raise_error(Capybara::Webkit::NoSuchWindowError)
|
1973
2027
|
end
|
1974
2028
|
|
1975
2029
|
it "has a number of window handles equal to the number of open windows" do
|
@@ -1978,12 +2032,35 @@ describe Capybara::Webkit::Driver do
|
|
1978
2032
|
driver.window_handles.size.should eq 2
|
1979
2033
|
end
|
1980
2034
|
|
2035
|
+
it "removes windows when closed via JavaScript" do
|
2036
|
+
visit("/new_window")
|
2037
|
+
driver.execute_script('console.log(window.document.title); window.close()')
|
2038
|
+
sleep 2
|
2039
|
+
driver.window_handles.size.should eq 1
|
2040
|
+
end
|
2041
|
+
|
1981
2042
|
it "closes new windows on reset" do
|
1982
2043
|
visit("/new_window")
|
1983
2044
|
last_handle = driver.window_handles.last
|
1984
2045
|
driver.reset!
|
1985
2046
|
driver.window_handles.should_not include(last_handle)
|
1986
2047
|
end
|
2048
|
+
|
2049
|
+
it "leaves the old window focused when opening a new window" do
|
2050
|
+
visit("/new_window")
|
2051
|
+
current_window = driver.current_window_handle
|
2052
|
+
driver.open_new_window
|
2053
|
+
|
2054
|
+
driver.current_window_handle.should eq current_window
|
2055
|
+
driver.window_handles.size.should eq 3
|
2056
|
+
end
|
2057
|
+
|
2058
|
+
it "opens blank windows" do
|
2059
|
+
visit("/new_window")
|
2060
|
+
driver.open_new_window
|
2061
|
+
driver.switch_to_window(driver.window_handles.last)
|
2062
|
+
driver.html.should be_empty
|
2063
|
+
end
|
1987
2064
|
end
|
1988
2065
|
|
1989
2066
|
it "preserves cookies across windows" do
|
@@ -2246,28 +2323,31 @@ describe Capybara::Webkit::Driver do
|
|
2246
2323
|
describe "logger app" do
|
2247
2324
|
it "logs nothing before turning on the logger" do
|
2248
2325
|
visit("/")
|
2326
|
+
@write.close
|
2249
2327
|
log.should_not include logging_message
|
2250
2328
|
end
|
2251
2329
|
|
2252
2330
|
it "logs its commands after turning on the logger" do
|
2253
2331
|
driver.enable_logging
|
2254
2332
|
visit("/")
|
2333
|
+
@write.close
|
2255
2334
|
log.should include logging_message
|
2256
2335
|
end
|
2257
2336
|
|
2337
|
+
before do
|
2338
|
+
@read, @write = IO.pipe
|
2339
|
+
end
|
2340
|
+
|
2258
2341
|
let(:logging_message) { 'Wrote response true' }
|
2259
2342
|
|
2260
2343
|
let(:driver) do
|
2261
|
-
connection = Capybara::Webkit::Connection.new(:stderr =>
|
2344
|
+
connection = Capybara::Webkit::Connection.new(:stderr => @write)
|
2262
2345
|
browser = Capybara::Webkit::Browser.new(connection)
|
2263
2346
|
Capybara::Webkit::Driver.new(AppRunner.app, :browser => browser)
|
2264
2347
|
end
|
2265
2348
|
|
2266
|
-
let(:output) { StringIO.new }
|
2267
|
-
|
2268
2349
|
def log
|
2269
|
-
|
2270
|
-
output.read
|
2350
|
+
@read.read
|
2271
2351
|
end
|
2272
2352
|
end
|
2273
2353
|
|
@@ -2383,6 +2463,34 @@ describe Capybara::Webkit::Driver do
|
|
2383
2463
|
end
|
2384
2464
|
end
|
2385
2465
|
|
2466
|
+
context "history" do
|
2467
|
+
let(:driver) do
|
2468
|
+
driver_for_app do
|
2469
|
+
get "/:param" do |param|
|
2470
|
+
<<-HTML
|
2471
|
+
<html>
|
2472
|
+
<body>
|
2473
|
+
<p>#{param}</p>
|
2474
|
+
<a href="/navigated">Navigate</a>
|
2475
|
+
</body>
|
2476
|
+
</html>
|
2477
|
+
HTML
|
2478
|
+
end
|
2479
|
+
end
|
2480
|
+
end
|
2481
|
+
|
2482
|
+
it "can navigate in history" do
|
2483
|
+
visit("/first")
|
2484
|
+
driver.find_xpath("//p").first.text.should eq('first')
|
2485
|
+
driver.find_xpath("//a").first.click
|
2486
|
+
driver.find_xpath("//p").first.text.should eq('navigated')
|
2487
|
+
driver.go_back
|
2488
|
+
driver.find_xpath("//p").first.text.should eq('first')
|
2489
|
+
driver.go_forward
|
2490
|
+
driver.find_xpath("//p").first.text.should eq('navigated')
|
2491
|
+
end
|
2492
|
+
end
|
2493
|
+
|
2386
2494
|
def driver_url(driver, path)
|
2387
2495
|
URI.parse(driver.current_url).merge(path).to_s
|
2388
2496
|
end
|