Current section

Files

Jump to
testcontainers lib container selenium_container.ex
Raw

lib/container/selenium_container.ex

# SPDX-License-Identifier: MIT
defmodule Testcontainers.Container.SeleniumContainer do
@moduledoc """
Work in progress. Not stable for use yet. Not yet documented for this very reason.
Can use https://github.com/stuart/elixir-webdriver for client in tests
"""
alias Testcontainers.ContainerBuilder
alias Testcontainers.Container
alias Testcontainers.Container.SeleniumContainer
alias Testcontainers.WaitStrategy.PortWaitStrategy
alias Testcontainers.WaitStrategy.LogWaitStrategy
@default_image "selenium/standalone-chrome"
@default_tag "118.0"
# TODO find proper names for these two ports
@default_port1 7900
@default_port2 4400
@wait_timeout 120_000
defstruct image: "#{@default_image}:#{@default_tag}",
wait_timeout: @wait_timeout,
# TODO find proper names for these two ports
port1: @default_port1,
port2: @default_port2
def new, do: %__MODULE__{}
def with_image(%__MODULE__{} = config, image) when is_binary(image) do
%{config | image: image}
end
# TODO find proper name for this port
def with_port1(%__MODULE__{} = config, port1) when is_integer(port1) do
%{config | port1: port1}
end
# TODO find proper name for this port
def with_port2(%__MODULE__{} = config, port2) when is_integer(port2) do
%{config | port2: port2}
end
def with_wait_timeout(%__MODULE__{} = config, wait_timeout) when is_integer(wait_timeout) do
%{config | wait_timeout: wait_timeout}
end
def default_image, do: @default_image
defimpl ContainerBuilder, for: __MODULE__ do
import Container
@log_regex ~r/.*(RemoteWebDriver instances should connect to|Selenium Server is up and running|Started Selenium Standalone).*\n/
@spec build(%SeleniumContainer{}, keyword()) :: %Container{}
@impl true
def build(%SeleniumContainer{} = config, _options) do
if not String.starts_with?(config.image, SeleniumContainer.default_image()) do
raise ArgumentError,
message:
"Image #{config.image} is not compatible with #{SeleniumContainer.default_image()}"
end
new(config.image)
|> with_exposed_ports([config.port1, config.port2])
|> with_waiting_strategies([
LogWaitStrategy.new(@log_regex, config.wait_timeout, 1000),
PortWaitStrategy.new("127.0.0.1", config.port1, config.wait_timeout, 1000),
PortWaitStrategy.new("127.0.0.1", config.port2, config.wait_timeout, 1000)
])
end
end
end