2018-04-24 22:47:53 +00:00
# frozen_string_literal: true
require 'spec_helper'
require 'selenium-webdriver'
require 'shared_selenium_session'
require 'rspec/shared_spec_matchers'
def selenium_host
ENV . fetch ( 'SELENIUM_HOST' , '0.0.0.0' )
end
def selenium_port
ENV . fetch ( 'SELENIUM_PORT' , 4444 )
end
def ensure_selenium_running!
2018-06-28 17:18:50 +00:00
timer = Capybara :: Helpers . timer ( expire_in : 20 )
begin
TCPSocket . open ( selenium_host , selenium_port )
2018-07-10 21:18:39 +00:00
rescue StandardError
2018-06-28 17:18:50 +00:00
if timer . expired?
raise 'Selenium is not running. ' \
" You can run a selenium server easily with: \n " \
' $ docker-compose up -d selenium_chrome'
else
2018-07-10 21:18:39 +00:00
puts 'Waiting for Selenium docker instance...'
2018-06-28 17:18:50 +00:00
sleep 1
retry
end
end
2018-04-24 22:47:53 +00:00
end
2018-07-26 21:13:30 +00:00
def selenium_gte? ( version )
defined? ( Selenium :: WebDriver :: VERSION ) && ( Selenium :: WebDriver :: VERSION . to_f > = version )
end
2018-04-24 22:47:53 +00:00
Capybara . register_driver :selenium_chrome_remote do | app |
ensure_selenium_running!
url = " http:// #{ selenium_host } : #{ selenium_port } /wd/hub "
2018-11-01 16:37:36 +00:00
browser_options = :: Selenium :: WebDriver :: Chrome :: Options . new
2018-04-24 22:47:53 +00:00
Capybara :: Selenium :: Driver . new app ,
browser : :remote ,
2018-11-01 16:37:36 +00:00
desired_capabilities : :chrome ,
options : browser_options ,
2018-04-24 22:47:53 +00:00
url : url
end
CHROME_REMOTE_DRIVER = :selenium_chrome_remote
module TestSessions
Chrome = Capybara :: Session . new ( CHROME_REMOTE_DRIVER , TestApp )
end
2018-06-25 22:28:30 +00:00
TestSessions :: Chrome . driver . browser . file_detector = lambda do | args |
# args => ["/path/to/file"]
str = args . first . to_s
str if File . exist? ( str )
end
2018-06-17 20:35:29 +00:00
skipped_tests = % i [ response_headers status_code trigger download ]
2018-04-24 22:47:53 +00:00
2018-07-05 18:50:43 +00:00
Capybara :: SpecHelper . run_specs TestSessions :: Chrome , CHROME_REMOTE_DRIVER . to_s , capybara_skip : skipped_tests do | example |
case example . metadata [ :full_description ]
2018-07-24 21:13:03 +00:00
when 'Capybara::Session selenium_chrome_remote #attach_file with multipart form should not break when using HTML5 multiple file input uploading multiple files' ,
'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once for each set of files uploaded' ,
'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once when uploading multiple files from empty'
2018-07-26 21:13:30 +00:00
pending " Selenium with Remote Chrome doesn't support multiple file upload " unless selenium_gte? ( 3 . 14 )
2018-06-26 00:27:36 +00:00
end
end
2018-07-10 21:18:39 +00:00
RSpec . describe 'Capybara::Session with remote Chrome' do
2018-04-24 22:47:53 +00:00
include Capybara :: SpecHelper
2018-07-10 21:18:39 +00:00
include_examples 'Capybara::Session' , TestSessions :: Chrome , CHROME_REMOTE_DRIVER
2018-04-24 22:47:53 +00:00
include_examples Capybara :: RSpecMatchers , TestSessions :: Chrome , CHROME_REMOTE_DRIVER
2018-06-12 20:06:25 +00:00
it 'is considered to be chrome' do
2018-08-24 18:32:55 +00:00
expect ( session . driver . browser . browser ) . to eq :chrome
2018-04-24 22:47:53 +00:00
end
end