Skip to content

Commit b2afe0c

Browse files
committed
Support freezing the page with Chrome
1 parent 411f3bf commit b2afe0c

File tree

9 files changed

+54
-4
lines changed

9 files changed

+54
-4
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ matrix:
117117
addons:
118118
homebrew:
119119
taps: homebrew/cask-versions
120-
casks: microsoft-edge-canary
120+
casks: microsoft-edge-dev
121121
before_install:
122122
- wget https://msedgewebdriverstorage.blob.core.windows.net/edgewebdriver/76.0.168.0/edgedriver_mac64.zip
123123
- unzip edgedriver_mac64.zip -d /usr/local/bin

lib/capybara/driver/base.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ def go_forward
3535
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#go_forward'
3636
end
3737

38+
def freeze_page
39+
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#freeze_page'
40+
end
41+
42+
def thaw_page
43+
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#thaw_page'
44+
end
45+
3846
def execute_script(script, *args)
3947
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#execute_script'
4048
end

lib/capybara/selenium/driver.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def browser
4545
end
4646
end
4747
processed_options = options.reject { |key, _val| SPECIAL_OPTIONS.include?(key) }
48+
4849
@browser = Selenium::WebDriver.for(options[:browser], processed_options)
4950

5051
specialize_driver

lib/capybara/selenium/driver_specializations/chrome_driver.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ def reset!
5454
execute_cdp('Storage.clearDataForOrigin', origin: '*', storageTypes: storage_types_to_clear)
5555
end
5656

57+
def freeze_page
58+
bridge.http.call(:post, "session/#{bridge.session_id}/goog/page/freeze", {})
59+
end
60+
61+
def thaw_page
62+
bridge.http.call(:post, "session/#{bridge.session_id}/goog/page/resume", {})
63+
evaluate_script('1==1') # Ensure page has restarted
64+
end
65+
5766
private
5867

5968
def storage_types_to_clear

lib/capybara/spec/public/test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@ $(function() {
4848
});
4949
$('#clickable').click(function(e) {
5050
var link = $(this);
51+
$(link).after('<a id="clickable-processing" href="#">Processing<a>');
5152
setTimeout(function() {
5253
$(link).after('<a id="has-been-clicked" href="#">Has been clicked</a>');
5354
$(link).after('<input type="submit" value="New Here">');
5455
$(link).after('<input type="text" id="new_field">');
5556
$('#change').remove();
57+
$('#clickable-processing').remove();
5658
}, 1000);
5759
return false;
5860
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# frozen_string_literal: true
2+
3+
Capybara::SpecHelper.spec 'Driver' do
4+
context 'freeze_page', requires: %i[freeze js] do
5+
it 'can pause a page' do
6+
@session.visit('/with_js')
7+
@session.find(:css, '#clickable').click
8+
sleep 0.1
9+
@session.driver.freeze_page
10+
11+
expect(@session).to have_css('#clickable-processing')
12+
sleep 3 # Time needs to be longer than click action delay
13+
expect(@session).not_to have_css('#has-been-clicked')
14+
expect(@session).to have_css('#clickable-processing')
15+
16+
@session.driver.thaw_page
17+
expect(@session).to have_css('#has-been-clicked').and(have_no_css('#clickable-processing'))
18+
end
19+
20+
it "doesn't prevent driver JS" do
21+
@session.visit('/with_js')
22+
@session.find(:css, '#clickable')
23+
@session.driver.freeze_page
24+
25+
expect(@session.evaluate_script('1==1')).to eq true
26+
27+
@session.driver.thaw_page
28+
end
29+
end
30+
end

spec/selenium_spec_firefox.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ module TestSessions
4242
SeleniumFirefox = Capybara::Session.new(:selenium_firefox, TestApp)
4343
end
4444

45-
skipped_tests = %i[response_headers status_code trigger]
45+
skipped_tests = %i[response_headers status_code trigger freeze]
4646

4747
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Firefox) if ENV['CI']
4848

spec/selenium_spec_firefox_remote.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ module TestSessions
5656
str if File.exist?(str)
5757
end
5858

59-
skipped_tests = %i[response_headers status_code trigger download]
59+
skipped_tests = %i[response_headers status_code trigger download freeze]
6060

6161
Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVER.to_s, capybara_skip: skipped_tests do |example|
6262
case example.metadata[:full_description]

spec/selenium_spec_safari.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ module TestSessions
3636
Safari = Capybara::Session.new(SAFARI_DRIVER, TestApp)
3737
end
3838

39-
skipped_tests = %i[response_headers status_code trigger windows drag]
39+
skipped_tests = %i[response_headers status_code trigger windows drag freeze]
4040

4141
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Safari) if ENV['CI']
4242

0 commit comments

Comments
 (0)