Skip to content

Commit

Permalink
Test remote selenium-webdriver on CI
Browse files Browse the repository at this point in the history
  • Loading branch information
ianks authored and twalpole committed Apr 27, 2018
1 parent e45ed4b commit 48631b5
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 22 deletions.
19 changes: 18 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
language: ruby
sudo: required
dist: trusty
services:
- docker
rvm:
- 2.5.0
- 2.3.6
Expand Down Expand Up @@ -30,6 +32,9 @@ cache:

matrix:
include:
- gemfile: Gemfile
rvm: 2.5.0
env: CAPYBARA_CHROME_REMOTE=true
- gemfile: gemfiles/Gemfile.rspec-34
rvm: 2.3.6
env: CAPYBARA_FF=true
Expand Down Expand Up @@ -66,6 +71,7 @@ matrix:
- gemfile: gemfiles/Gemfile.beta-versions
- gemfile: gemfiles/Gemfile.edge-marionette
- rvm: rbx-3
- env: CAPYBARA_CHROME_REMOTE=true
before_install:
- gem update --system
# - gem update bundler
Expand All @@ -77,12 +83,23 @@ before_install:
bundle config local.selenium-webdriver ../selenium/build/rb;
fi
before_script:
- if [[ -z $HEADLESS ]]; then
- if [[ -z $HEADLESS && -z $CAPYBARA_CHROME_REMOTE ]]; then
export DISPLAY=:99.0;
sh -e /etc/init.d/xvfb start;
sleep 1;
mkdir -p ~/.config/awesome;
echo "require('awful'); tags = {}; tags[1] = awful.tag({'name'})" > ~/.config/awesome/rc.lua;
awesome &
fi
- if [[ $CAPYBARA_CHROME_REMOTE = true ]]; then
docker-compose up -d selenium

TIMEOUT=10

until wget --spider http://localhost:4444 > /dev/null 2>&1 || [ $TIMEOUT -eq 0 ]; do
echo "Waiting for selenium server, $((TIMEOUT--)) remaining attempts...";
sleep 1;
done
fi

script: "bundle exec rake travis"
12 changes: 8 additions & 4 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,22 @@ require 'yard'

desc "Run all examples with Firefox non-marionette"

rspec_opts = %w[--color]

RSpec::Core::RakeTask.new(:spec_marionette) do |t|
t.rspec_opts = %w[--color]
t.rspec_opts = rspec_opts
t.pattern = './spec{,/*/**}/*{_spec.rb,_spec_marionette.rb}'
end

%w[chrome ie edge].each do |driver|
%w[chrome ie edge chrome_remote].each do |driver|
RSpec::Core::RakeTask.new(:"spec_#{driver}") do |t|
t.rspec_opts = %w[--color]
t.rspec_opts = rspec_opts
t.pattern = "./spec/*{_spec_#{driver}.rb}"
end
end

RSpec::Core::RakeTask.new(:spec_rack) do |t|
t.rspec_opts = %w[--color]
t.rspec_opts = rspec_opts
t.pattern = './spec{,/*/**}/*{_spec.rb}'
end

Expand All @@ -40,6 +42,8 @@ task :travis do
Rake::Task[:spec_ie].invoke
elsif ENV['CAPYBARA_EDGE']
Rake::Task[:spec_edge].invoke
elsif ENV['CAPYBARA_CHROME_REMOTE']
Rake::Task[:spec_chrome_remote].invoke
else
Rake::Task[:spec_chrome].invoke
end
Expand Down
10 changes: 10 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
version: "2.1"

services:
selenium:
network_mode: "host"
image: "selenium/${SELENIUM_IMAGE:-standalone-chrome-debug}"
volumes:
- "/dev/shm:/dev/shm"
- "${PWD}:${PWD}" # For making attach_file specs work
20 changes: 8 additions & 12 deletions lib/capybara/selenium/driver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ def self.load_selenium

def browser
unless @browser
if firefox?
options[:desired_capabilities] ||= {}
options[:desired_capabilities][:unexpectedAlertBehaviour] = "ignore"
end
# if firefox?
# options[:desired_capabilities] ||= {}
# options[:desired_capabilities][:unexpectedAlertBehaviour] = "ignore"
# end

@processed_options = options.reject { |key, _val| SPECIAL_OPTIONS.include?(key) }
@browser = Selenium::WebDriver.for(options[:browser], @processed_options)
Expand Down Expand Up @@ -305,30 +305,26 @@ def marionette?

# @api private
def firefox?
browser_name == "firefox"
browser.browser == :firefox
end

# @api private
def chrome?
browser_name == "chrome"
browser.browser == :chrome
end

# @api private
def edge?
browser_name == "edge"
browser.browser == :edge
end

# @api private
def ie?
browser_name == "ie"
browser.browser == :ie
end

private

def browser_name
options[:browser].to_s
end

def clear_storage
if options[:clear_session_storage]
if @browser.respond_to? :session_storage
Expand Down
6 changes: 3 additions & 3 deletions lib/capybara/selenium/node.rb
Original file line number Diff line number Diff line change
Expand Up @@ -255,23 +255,23 @@ def scroll_if_needed

def set_date(value) # rubocop:disable Naming/AccessorMethodName
if value.respond_to?(:to_date)
set_text(value.to_date.strftime(SET_FORMATS[driver.options[:browser].to_sym][:date]))
set_text(value.to_date.strftime(SET_FORMATS[driver.browser.browser][:date]))
else
set_text(value)
end
end

def set_time(value) # rubocop:disable Naming/AccessorMethodName
if value.respond_to?(:to_time)
set_text(value.to_time.strftime(SET_FORMATS[driver.options[:browser].to_sym][:time]))
set_text(value.to_time.strftime(SET_FORMATS[driver.browser.browser][:time]))
else
set_text(value)
end
end

def set_datetime_local(value) # rubocop:disable Naming/AccessorMethodName
if value.respond_to?(:to_time)
set_text(value.to_time.strftime(SET_FORMATS[driver.options[:browser].to_sym][:datetime]))
set_text(value.to_time.strftime(SET_FORMATS[driver.browser.browser][:datetime]))
else
set_text(value)
end
Expand Down
56 changes: 56 additions & 0 deletions spec/selenium_spec_chrome_remote.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# 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!
TCPSocket.open(selenium_host, selenium_port)
rescue
raise 'Selenium is not running. ' \
"You can run a selenium server easily with: \n" \
' $ docker-compose up -d selenium'
end

Capybara.register_driver :selenium_chrome_remote do |app|
ensure_selenium_running!

url = "http://#{selenium_host}:#{selenium_port}/wd/hub"
caps = Selenium::WebDriver::Remote::Capabilities.chrome

Capybara::Selenium::Driver.new app,
browser: :remote,
desired_capabilities: caps,
url: url
end

CHROME_REMOTE_DRIVER = :selenium_chrome_remote

module TestSessions
Chrome = Capybara::Session.new(CHROME_REMOTE_DRIVER, TestApp)
end

skipped_tests = %i[response_headers status_code trigger]
# skip window tests when headless for now - closing a window not supported by chromedriver/chrome
skipped_tests << :windows if ENV['TRAVIS'] && (ENV['SKIP_WINDOW'] || ENV['HEADLESS'])

Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_REMOTE_DRIVER.to_s, capybara_skip: skipped_tests

RSpec.describe "Capybara::Session with chrome" do
include Capybara::SpecHelper
include_examples "Capybara::Session", TestSessions::Chrome, CHROME_REMOTE_DRIVER
include_examples Capybara::RSpecMatchers, TestSessions::Chrome, CHROME_REMOTE_DRIVER

it 'is considered to be chrome' do
expect(session.driver).to be_chrome
end
end
10 changes: 8 additions & 2 deletions spec/shared_selenium_session.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,15 @@
end

it "should have return code 1 when running selenium_driver_rspec_failure.rb" do
skip if ENV['HEADLESS']
skip if headless_or_remote?

system(@env, 'rspec spec/fixtures/selenium_driver_rspec_failure.rb', out: File::NULL, err: File::NULL)
expect($CHILD_STATUS.exitstatus).to eq(1)
end

it "should have return code 0 when running selenium_driver_rspec_success.rb" do
skip if ENV['HEADLESS']
skip if headless_or_remote?

system(@env, 'rspec spec/fixtures/selenium_driver_rspec_success.rb', out: File::NULL, err: File::NULL)
expect($CHILD_STATUS.exitstatus).to eq(0)
end
Expand Down Expand Up @@ -226,4 +228,8 @@
end
end
end

def headless_or_remote?
!ENV['HEADLESS'].nil? || session.driver.options[:browser] == :remote
end
end

0 comments on commit 48631b5

Please sign in to comment.