Skip to content

Instantly share code, notes, and snippets.

@zetetic
Last active September 23, 2021 17:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zetetic/82766452f77b864d577aab67221d749e to your computer and use it in GitHub Desktop.
Save zetetic/82766452f77b864d577aab67221d749e to your computer and use it in GitHub Desktop.
Demonstrate Selenium issue when session has been deleted
--require spec_helper

Demonstrate Selenium issue when sessions are deleted

These examples show unexpected responses when Selenium deletes sessions because the browser session timeout has been exceeded.

You'll need Docker (and possibly docker-compose, for older Docker installs) To run the examples:

  • check out into a new folder
  • run docker compose build
  • run docker compose run example rspec -e one
  • run docker compose down
  • run docker compose run example rspec -e two
  • run docker compose down

Replace 'docker compose' with 'docker-compose' if your Docker does not support the compose action

version: '3'
services:
example:
build: .
depends_on:
- chrome
networks:
- selenium_standalone
environment:
- SELENIUM_HUB=chrome:4444
command: rspec
chrome:
image: ${SELENIUM_CHROME_IMAGE:-selenium/standalone-chrome:4.0.0}
hostname: chrome
networks:
- selenium_standalone
privileged: true
shm_size: ${SHM_SIZE:-2g}
ports:
- "4444"
environment:
- SE_NODE_SESSION_TIMEOUT=10
networks:
selenium_standalone:
FROM ruby
RUN apt-get update && apt-get install -y jq
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
COPY wait-for.sh /
RUN chmod +x /wait-for.sh
COPY Gemfile .
RUN bundle install
COPY .rspec .
RUN mkdir spec
COPY *.rb spec/
ENTRYPOINT ["/entrypoint.sh"]
CMD ["rspec"]
#!/bin/bash
if [ ${SELENIUM_HUB+x} ]; then
/wait-for.sh
fi
eval "$*"
require 'capybara'
describe "Example", type: :feature do
let(:url) { url = "https://example.com" }
let(:delay) { 20 }
it "one" do
visit(url)
expect(page).to have_text(/Example Domain/)
puts "OK"
sleep delay
visit(url)
expect(page).to have_text(/Example Domain/)
end
it "two" do
visit(url)
page.save_screenshot("screenshot.png")
puts "OK"
expect(page).to have_text(/Example Domain/)
sleep delay
page.save_screenshot("screenshot.png")
end
end
# frozen_string_literal: true
source "https://rubygems.org"
gem 'selenium-webdriver', '4.0.0.rc1'
gem 'capybara'
gem 'rspec'
gem 'byebug'
require 'selenium/webdriver'
require 'selenium/webdriver/chrome'
require 'capybara'
require 'capybara/rspec'
require 'capybara/dsl'
RSpec.configure do |config|
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
config.shared_context_metadata_behavior = :apply_to_host_groups
config.include Capybara::DSL
end
Capybara.register_driver :chrome_remote do |app|
raise "missing setting for SELENIUM_HUB" unless ENV["SELENIUM_HUB"]
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome
args = {
browser: :remote,
url: "http://#{ENV["SELENIUM_HUB"]}/wd/hub",
capabilities: capabilities
}
Capybara::Selenium::Driver.new(app, **args)
end
Capybara.configure do |config|
config.run_server = false
config.default_driver = :chrome_remote
config.app_host = 'https://www.example.com'
end
#!/bin/bash
set -e
cmd="$@"
while ! curl -sSL "http://${SELENIUM_HUB}/wd/hub/status" 2>&1 \
| jq -r '.value.ready' 2>&1 | grep "true" >/dev/null; do
echo 'Waiting for the Selenium server'
sleep 1
done
>&2 echo "Selenium server is ready"
exec $cmd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment