optional clearing of local/session storage for selenium driver

This commit is contained in:
Thomas Walpole 2016-10-28 13:08:20 -07:00
parent d00fc2875c
commit ba3ad1264f
6 changed files with 111 additions and 3 deletions

View File

@ -4,9 +4,11 @@ require "uri"
class Capybara::Selenium::Driver < Capybara::Driver::Base
DEFAULT_OPTIONS = {
:browser => :firefox
:browser => :firefox,
clear_local_storage: false,
clear_session_storage: false
}
SPECIAL_OPTIONS = [:browser]
SPECIAL_OPTIONS = [:browser, :clear_local_storage, :clear_session_storage]
attr_reader :app, :options
@ -107,6 +109,20 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
# can trigger an endless series of unload modals
begin
@browser.manage.delete_all_cookies
if options[:clear_session_storage]
if @browser.respond_to? :session_storage
@browser.session_storage.clear
else
warn "sessionStorage clear requested but is not available for this driver"
end
end
if options[:clear_local_storage]
if @browser.respond_to? :local_storage
@browser.local_storage.clear
else
warn "localStorage clear requested but is not available for this driver"
end
end
rescue Selenium::WebDriver::Error::UnhandledError
# delete_all_cookies fails when we've previously gone
# to about:blank, so we rescue this error and do nothing

View File

@ -123,4 +123,8 @@ $(function() {
input.disabled = true;
}, 500)
})
$('#set-storage').click(function(e){
sessionStorage.setItem('session', 'session_value');
localStorage.setItem('local', 'local value');
})
});

View File

@ -97,7 +97,9 @@
<p>
<input id="disable-on-click"/>
</p>
<p>
<input id="set-storage"/>
</p>
<p>
<a href="#" id="delayed-page-change">Change page</a>
<a href="/with_html?options[]=things">Non-escaped query options</a>

View File

@ -8,6 +8,14 @@ Capybara.register_driver :selenium_chrome do |app|
Capybara::Selenium::Driver.new(app, :browser => :chrome, :args => args)
end
Capybara.register_driver :selenium_chrome_clear_storage do |app|
args = ENV['TRAVIS'] ? ['no-sandbox' ] : []
Capybara::Selenium::Driver.new(app, :browser => :chrome,
:args => args,
clear_local_storage: true,
clear_session_storage: true)
end
module TestSessions
Chrome = Capybara::Session.new(:selenium_chrome, TestApp)
end
@ -19,4 +27,28 @@ Capybara::SpecHelper.run_specs TestSessions::Chrome, "selenium_chrome", capybara
RSpec.describe "Capybara::Session with chrome" do
include_examples "Capybara::Session", TestSessions::Chrome, :selenium_chrome
context "storage" do
describe "#reset!" do
it "does not clear either storage by default" do
@session = TestSessions::Chrome
@session.visit('/with_js')
@session.find(:css, '#set-storage').click
@session.reset!
@session.visit('/with_js')
expect(@session.driver.browser.local_storage.keys).not_to be_empty
expect(@session.driver.browser.session_storage.keys).not_to be_empty
end
it "clears storage when set" do
@session = Capybara::Session.new(:selenium_chrome_clear_storage, TestApp)
@session.visit('/with_js')
@session.find(:css, '#set-storage').click
@session.reset!
@session.visit('/with_js')
expect(@session.driver.browser.local_storage.keys).to be_empty
expect(@session.driver.browser.session_storage.keys).to be_empty
end
end
end
end

View File

@ -12,6 +12,16 @@ Capybara.register_driver :selenium_firefox do |app|
)
end
Capybara.register_driver :selenium_firefox_cant_clear_storage do |app|
Capybara::Selenium::Driver.new(
app,
browser: :firefox,
desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false),
clear_local_storage: true,
clear_session_storage: true
)
end
module TestSessions
Selenium = Capybara::Session.new(:selenium_firefox, TestApp)
end
@ -28,6 +38,16 @@ Capybara::SpecHelper.run_specs TestSessions::Selenium, "selenium", capybara_skip
RSpec.describe "Capybara::Session with legacy firefox" do
include_examples "Capybara::Session", TestSessions::Selenium, :selenium_firefox
include_examples Capybara::RSpecMatchers, TestSessions::Selenium, :selenium_firefox
context "storage" do
it "warns storage clearing isn't available" do
@session = Capybara::Session.new(:selenium_firefox_cant_clear_storage, TestApp)
expect_any_instance_of(Kernel).to receive(:warn).with('sessionStorage clear requested but is not available for this driver')
expect_any_instance_of(Kernel).to receive(:warn).with('localStorage clear requested but is not available for this driver')
@session.visit('/')
@session.reset!
end
end
end
RSpec.describe Capybara::Selenium::Driver do

View File

@ -12,6 +12,16 @@ Capybara.register_driver :selenium_marionette do |app|
)
end
Capybara.register_driver :selenium_marionette_clear_storage do |app|
Capybara::Selenium::Driver.new(
app,
browser: :firefox,
desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: true),
clear_local_storage: true,
clear_session_storage: true
)
end
module TestSessions
SeleniumMarionette = Capybara::Session.new(:selenium_marionette, TestApp)
end
@ -43,5 +53,29 @@ RSpec.describe Capybara::Selenium::Driver do
expect(@driver.instance_variable_get(:@browser)).to be_nil
end
end
context "storage" do
describe "#reset!" do
it "does not clear either storage by default" do
@session = TestSessions::SeleniumMarionette
@session.visit('/with_js')
@session.find(:css, '#set-storage').click
@session.reset!
@session.visit('/with_js')
expect(@session.driver.browser.local_storage.keys).not_to be_empty
expect(@session.driver.browser.session_storage.keys).not_to be_empty
end
it "clears storage when set" do
@session = Capybara::Session.new(:selenium_marionette_clear_storage, TestApp)
@session.visit('/with_js')
@session.find(:css, '#set-storage').click
@session.reset!
@session.visit('/with_js')
expect(@session.driver.browser.local_storage.keys).to be_empty
expect(@session.driver.browser.session_storage.keys).to be_empty
end
end
end
end