Skip to content

Commit

Permalink
Change Selenium Chrome driver reset order to minimize race conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
twalpole committed May 28, 2019
1 parent 2f3aa8f commit 9db4cbf
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion lib/capybara/selenium/driver_specializations/chrome_driver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,34 @@ def reset!

switch_to_window(window_handles.first)
window_handles.slice(1..-1).each { |win| close_window(win) }
super
return super if chromedriver_version < 73

timer = Capybara::Helpers.timer(expire_in: 10)
begin
@browser.navigate.to('about:blank')
clear_storage unless uniform_storage_clear?
wait_for_empty_page(timer)
rescue *unhandled_alert_errors
accept_unhandled_reset_alert
retry
end

types = ['cookies']
types << 'local_storage' if clear_all_storage?
execute_cdp('Storage.clearDataForOrigin', origin: '*', storageTypes: types.join(','))
end

private

def clear_all_storage?
options.values_at(:clear_session_storage, :clear_local_storage).none? { |s| s == false }
end

def uniform_storage_clear?
clear = options.values_at(:clear_session_storage, :clear_local_storage)
clear.all? { |s| s == false } || clear.none? { |s| s == false }
end

def clear_storage
# Chrome errors if attempt to clear storage on about:blank
# In W3C mode it crashes chromedriver
Expand Down Expand Up @@ -69,6 +92,13 @@ def build_node(native_node, initial_cache = {})
def bridge
browser.send(:bridge)
end

def chromedriver_version
@chromedriver_version ||= begin
caps = browser.capabilities
caps['chrome']&.fetch('chromedriverVersion', nil).to_f
end
end
end

Capybara::Selenium::Driver.register_specialization :chrome, Capybara::Selenium::Driver::ChromeDriver

0 comments on commit 9db4cbf

Please sign in to comment.