prompt modal response should aloow qoutes, etc

This commit is contained in:
Thomas Walpole 2017-11-18 11:48:51 -08:00
parent 5fbfe95370
commit 8cf16bc129
2 changed files with 39 additions and 21 deletions

View File

@ -36,25 +36,8 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
end
def initialize(app, options={})
load_selenium
@session = nil
begin
require 'selenium-webdriver'
# Fix for selenium-webdriver 3.4.0 which misnamed these
if !defined?(::Selenium::WebDriver::Error::ElementNotInteractableError)
::Selenium::WebDriver::Error.const_set('ElementNotInteractableError', Class.new(::Selenium::WebDriver::Error::WebDriverError))
end
if !defined?(::Selenium::WebDriver::Error::ElementClickInterceptedError)
::Selenium::WebDriver::Error.const_set('ElementClickInterceptedError', Class.new(::Selenium::WebDriver::Error::WebDriverError))
end
rescue LoadError => e
if e.message =~ /selenium-webdriver/
raise LoadError, "Capybara's selenium driver is unable to load `selenium-webdriver`, please install the gem and add `gem 'selenium-webdriver'` to your Gemfile if you are using bundler."
else
raise e
end
end
@app = app
@browser = nil
@exit_status = nil
@ -375,6 +358,16 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
end
def insert_modal_handlers(accept, response_text)
prompt_response = if accept
if response_text.nil?
"default_text"
else
"'#{response_text.gsub("\\", "\\\\\\").gsub("'", "\\\\'")}'"
end
else
'null'
end
script = <<-JS
if (typeof window.capybara === 'undefined') {
window.capybara = {
@ -412,7 +405,7 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
}
window.prompt = function(str = "", default_text = "") {
window.capybara.handler_called(modal_handler, str.toString());
return #{accept ? (response_text.nil? ? "default_text" : "'#{response_text}'") : 'null'};
return #{prompt_response};
}
JS
execute_script script
@ -497,4 +490,23 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
arg
end
end
def load_selenium
begin
require 'selenium-webdriver'
# Fix for selenium-webdriver 3.4.0 which misnamed these
if !defined?(::Selenium::WebDriver::Error::ElementNotInteractableError)
::Selenium::WebDriver::Error.const_set('ElementNotInteractableError', Class.new(::Selenium::WebDriver::Error::WebDriverError))
end
if !defined?(::Selenium::WebDriver::Error::ElementClickInterceptedError)
::Selenium::WebDriver::Error.const_set('ElementClickInterceptedError', Class.new(::Selenium::WebDriver::Error::WebDriverError))
end
rescue LoadError => e
if e.message =~ /selenium-webdriver/
raise LoadError, "Capybara's selenium driver is unable to load `selenium-webdriver`, please install the gem and add `gem 'selenium-webdriver'` to your Gemfile if you are using bundler."
else
raise e
end
end
end
end

View File

@ -40,13 +40,20 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
end
it "should accept the prompt with a blank response when there is a default" do
pending "Geckodriver doesn't set a blank response currently" if @session.respond_to?(:mode) && @session.mode.to_s == "selenium_marionette"
pending "Geckodriver doesn't set a blank response currently" if marionette?(@session)
@session.accept_prompt with: '' do
@session.click_link('Open defaulted prompt')
end
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='']")
end
it "should allow special characters in the reponse" do
@session.accept_prompt with: '\'the\' \b "response"' do
@session.click_link('Open prompt')
end
expect(@session).to have_xpath(%{//a[@id='open-prompt' and @response=concat("'the' ", '\\b "response"')]})
end
it "should accept the prompt if the message matches" do
@session.accept_prompt 'Prompt opened', with: 'matched' do
@session.click_link('Open prompt')
@ -62,7 +69,6 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
end.to raise_error(Capybara::ModalNotFound)
end
it "should return the message presented" do
message = @session.accept_prompt with: 'the response' do
@session.click_link('Open prompt')