forward system test driver options configured

in initializer block to the selenium driver
for non-headless browsers

* refactored browser options initialization.
* improved method names in AD::SystemTesting::Browser
* improved AD::SystemTest driver tests
This commit is contained in:
glaszig 2019-11-24 22:36:31 +01:00
parent 5c4afb6b52
commit 769188e1c3
4 changed files with 49 additions and 50 deletions

@ -1,3 +1,7 @@
* Fix system test driver option initialization for non-headless browsers.
*glaszig*
* `redirect_to.action_controller` notifications now include the `ActionDispatch::Request` in * `redirect_to.action_controller` notifications now include the `ActionDispatch::Request` in
their payloads as `:request`. their payloads as `:request`.

@ -3,10 +3,11 @@
module ActionDispatch module ActionDispatch
module SystemTesting module SystemTesting
class Browser # :nodoc: class Browser # :nodoc:
attr_reader :name attr_reader :name, :options
def initialize(name) def initialize(name)
@name = name @name = name
set_default_options
end end
def type def type
@ -20,23 +21,9 @@ def type
end end
end end
def options def configure
case name initialize_options
when :headless_chrome yield options if block_given? && options
headless_chrome_browser_options
when :headless_firefox
headless_firefox_browser_options
end
end
def capabilities
@option ||=
case type
when :chrome
::Selenium::WebDriver::Chrome::Options.new
when :firefox
::Selenium::WebDriver::Firefox::Options.new
end
end end
# driver_path can be configured as a proc. The webdrivers gem uses this # driver_path can be configured as a proc. The webdrivers gem uses this
@ -63,17 +50,37 @@ def preload
end end
private private
def headless_chrome_browser_options def initialize_options
capabilities.args << "--headless" @options ||= begin
capabilities.args << "--disable-gpu" if Gem.win_platform? case type
when :chrome
capabilities ::Selenium::WebDriver::Chrome::Options.new
when :firefox
::Selenium::WebDriver::Firefox::Options.new
end
end
end end
def headless_firefox_browser_options def set_default_options
capabilities.args << "-headless" case name
when :headless_chrome
set_headless_chrome_browser_options
when :headless_firefox
set_headless_firefox_browser_options
end
end
capabilities def set_headless_chrome_browser_options
configure do |capabilities|
capabilities.args << "--headless"
capabilities.args << "--disable-gpu" if Gem.win_platform?
end
end
def set_headless_firefox_browser_options
configure do |capabilities|
capabilities.args << "-headless"
end
end end
end end
end end

@ -7,7 +7,7 @@ def initialize(name, **options, &capabilities)
@name = name @name = name
@browser = Browser.new(options[:using]) @browser = Browser.new(options[:using])
@screen_size = options[:screen_size] @screen_size = options[:screen_size]
@options = options[:options] @options = options[:options] || {}
@capabilities = capabilities @capabilities = capabilities
@browser.preload unless name == :rack_test @browser.preload unless name == :rack_test
@ -25,7 +25,7 @@ def registerable?
end end
def register def register
define_browser_capabilities(@browser.capabilities) @browser.configure(&@capabilities)
Capybara.register_driver @name do |app| Capybara.register_driver @name do |app|
case @name case @name
@ -36,10 +36,6 @@ def register
end end
end end
def define_browser_capabilities(capabilities)
@capabilities.call(capabilities) if @capabilities
end
def browser_options def browser_options
@options.merge(options: @browser.options).compact @options.merge(options: @browser.options).compact
end end

@ -56,61 +56,53 @@ class DriverTest < ActiveSupport::TestCase
end end
test "define extra capabilities using chrome" do test "define extra capabilities using chrome" do
driver_option = nil
driver = ActionDispatch::SystemTesting::Driver.new(:selenium, screen_size: [1400, 1400], using: :chrome) do |option| driver = ActionDispatch::SystemTesting::Driver.new(:selenium, screen_size: [1400, 1400], using: :chrome) do |option|
option.add_argument("start-maximized") option.add_argument("start-maximized")
option.add_emulation(device_name: "iphone 6") option.add_emulation(device_name: "iphone 6")
option.add_preference(:detach, true) option.add_preference(:detach, true)
driver_option = option
end end
driver.use driver.use
browser_options = driver.__send__(:browser_options)
expected = { "goog:chromeOptions" => { args: ["start-maximized"], mobileEmulation: { deviceName: "iphone 6" }, prefs: { detach: true } } } expected = { "goog:chromeOptions" => { args: ["start-maximized"], mobileEmulation: { deviceName: "iphone 6" }, prefs: { detach: true } } }
assert_equal expected, driver_option.as_json assert_equal expected, browser_options[:options].as_json
end end
test "define extra capabilities using headless_chrome" do test "define extra capabilities using headless_chrome" do
driver_option = nil
driver = ActionDispatch::SystemTesting::Driver.new(:selenium, screen_size: [1400, 1400], using: :headless_chrome) do |option| driver = ActionDispatch::SystemTesting::Driver.new(:selenium, screen_size: [1400, 1400], using: :headless_chrome) do |option|
option.add_argument("start-maximized") option.add_argument("start-maximized")
option.add_emulation(device_name: "iphone 6") option.add_emulation(device_name: "iphone 6")
option.add_preference(:detach, true) option.add_preference(:detach, true)
driver_option = option
end end
driver.use driver.use
browser_options = driver.__send__(:browser_options)
expected = { "goog:chromeOptions" => { args: ["start-maximized"], mobileEmulation: { deviceName: "iphone 6" }, prefs: { detach: true } } } expected = { "goog:chromeOptions" => { args: ["--headless", "start-maximized"], mobileEmulation: { deviceName: "iphone 6" }, prefs: { detach: true } } }
assert_equal expected, driver_option.as_json assert_equal expected, browser_options[:options].as_json
end end
test "define extra capabilities using firefox" do test "define extra capabilities using firefox" do
driver_option = nil
driver = ActionDispatch::SystemTesting::Driver.new(:selenium, screen_size: [1400, 1400], using: :firefox) do |option| driver = ActionDispatch::SystemTesting::Driver.new(:selenium, screen_size: [1400, 1400], using: :firefox) do |option|
option.add_preference("browser.startup.homepage", "http://www.seleniumhq.com/") option.add_preference("browser.startup.homepage", "http://www.seleniumhq.com/")
option.add_argument("--host=127.0.0.1") option.add_argument("--host=127.0.0.1")
driver_option = option
end end
driver.use driver.use
browser_options = driver.__send__(:browser_options)
expected = { "moz:firefoxOptions" => { args: ["--host=127.0.0.1"], prefs: { "browser.startup.homepage" => "http://www.seleniumhq.com/" } } } expected = { "moz:firefoxOptions" => { args: ["--host=127.0.0.1"], prefs: { "browser.startup.homepage" => "http://www.seleniumhq.com/" } } }
assert_equal expected, driver_option.as_json assert_equal expected, browser_options[:options].as_json
end end
test "define extra capabilities using headless_firefox" do test "define extra capabilities using headless_firefox" do
driver_option = nil
driver = ActionDispatch::SystemTesting::Driver.new(:selenium, screen_size: [1400, 1400], using: :headless_firefox) do |option| driver = ActionDispatch::SystemTesting::Driver.new(:selenium, screen_size: [1400, 1400], using: :headless_firefox) do |option|
option.add_preference("browser.startup.homepage", "http://www.seleniumhq.com/") option.add_preference("browser.startup.homepage", "http://www.seleniumhq.com/")
option.add_argument("--host=127.0.0.1") option.add_argument("--host=127.0.0.1")
driver_option = option
end end
driver.use driver.use
browser_options = driver.__send__(:browser_options)
expected = { "moz:firefoxOptions" => { args: ["--host=127.0.0.1"], prefs: { "browser.startup.homepage" => "http://www.seleniumhq.com/" } } } expected = { "moz:firefoxOptions" => { args: ["-headless", "--host=127.0.0.1"], prefs: { "browser.startup.homepage" => "http://www.seleniumhq.com/" } } }
assert_equal expected, driver_option.as_json assert_equal expected, browser_options[:options].as_json
end end
test "does not define extra capabilities" do test "does not define extra capabilities" do