Skip to content

Commit

Permalink
Stop sending OSS capabilities in new session payload
Browse files Browse the repository at this point in the history
  • Loading branch information
p0deje committed Apr 18, 2019
1 parent 32de9d3 commit 88c0fd6
Show file tree
Hide file tree
Showing 9 changed files with 21 additions and 128 deletions.
4 changes: 0 additions & 4 deletions rb/lib/selenium/webdriver/ie/driver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,6 @@ def create_capabilities(opts)
options.native_events = native_events
end

# Backward compatibility with older IEDriverServer versions
caps[:ignore_protected_mode_settings] = options.ignore_protected_mode_settings
caps[:native_events] = options.native_events

options = options.as_json
caps.merge!(options) unless options.empty?

Expand Down
8 changes: 3 additions & 5 deletions rb/lib/selenium/webdriver/remote/bridge.rb
Original file line number Diff line number Diff line change
Expand Up @@ -628,14 +628,12 @@ def commands(command)
COMMANDS[command]
end

def merged_capabilities(oss_capabilities, options = nil)
w3c_capabilities = Capabilities.from_oss(oss_capabilities)
w3c_capabilities.merge!(options.as_json) if options
def merged_capabilities(capabilities, options = nil)
capabilities.merge!(options.as_json) if options

{
desiredCapabilities: oss_capabilities,
capabilities: {
firstMatch: [w3c_capabilities]
firstMatch: [capabilities]
}
}
end
Expand Down
69 changes: 4 additions & 65 deletions rb/lib/selenium/webdriver/remote/capabilities.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,9 @@ module Remote
# Specification of the desired and/or actual capabilities of the browser that the
# server is being asked to create.
#
# @api private
#

class Capabilities

EXTENSION_CAPABILITY_PATTERN = /\A[\w-]+:.*\z/.freeze

KNOWN = [
:browser_name,
:browser_version,
Expand Down Expand Up @@ -92,7 +88,7 @@ def chrome(opts = {})
def edge(opts = {})
new({
browser_name: 'MicrosoftEdge',
platform: :windows
platform_name: :windows
}.merge(opts))
end

Expand All @@ -111,7 +107,7 @@ def firefox(opts = {})
def safari(opts = {})
new({
browser_name: 'safari',
platform: :mac
platform_name: :mac
}.merge(opts))
end

Expand All @@ -121,17 +117,10 @@ def htmlunit(opts = {})
}.merge(opts))
end

def htmlunitwithjs(opts = {})
new({
browser_name: 'htmlunit',
javascript_enabled: true
}.merge(opts))
end

def internet_explorer(opts = {})
new({
browser_name: 'internet explorer',
platform: :windows
platform_name: :windows
}.merge(opts))
end
alias_method :ie, :internet_explorer
Expand Down Expand Up @@ -176,56 +165,6 @@ def json_create(data)

caps
end

#
# Creates W3C compliant capabilities from OSS ones.
# @param oss_capabilities [Hash, Remote::Capabilities]
#

def from_oss(oss_capabilities)
w3c_capabilities = new

# TODO: (AR) make capabilities enumerable?
oss_capabilities = oss_capabilities.__send__(:capabilities) unless oss_capabilities.is_a?(Hash)
oss_capabilities.each do |name, value|
next if value.nil?
next if value.is_a?(String) && value.empty?

capability_name = name.to_s

snake_cased_capability_names = KNOWN.map(&:to_s)
camel_cased_capability_names = snake_cased_capability_names.map(&w3c_capabilities.method(:camel_case))

next unless snake_cased_capability_names.include?(capability_name) ||
camel_cased_capability_names.include?(capability_name) ||
capability_name.match(EXTENSION_CAPABILITY_PATTERN)

w3c_capabilities[name] = value
end

# User can pass :firefox_options or :firefox_profile.
#
# TODO: (AR) Refactor this whole method into converter class.
firefox_options = oss_capabilities['firefoxOptions'] || oss_capabilities['firefox_options'] || oss_capabilities[:firefox_options]
firefox_profile = oss_capabilities['firefox_profile'] || oss_capabilities[:firefox_profile]
firefox_binary = oss_capabilities['firefox_binary'] || oss_capabilities[:firefox_binary]

if firefox_profile && firefox_options
second_profile = firefox_options['profile'] || firefox_options[:profile]
if second_profile && firefox_profile != second_profile
raise Error::WebDriverError, 'You cannot pass 2 different Firefox profiles'
end
end

if firefox_options || firefox_profile || firefox_binary
options = WebDriver::Firefox::Options.new(firefox_options || {})
options.binary = firefox_binary if firefox_binary
options.profile = firefox_profile if firefox_profile
w3c_capabilities.merge!(options.as_json)
end

w3c_capabilities
end
end

#
Expand Down Expand Up @@ -281,7 +220,7 @@ def proxy=(proxy)
# @api private
#

def as_json(*) # rubocop:disable Metrics/CyclomaticComplexity
def as_json(*)
hash = {}

@capabilities.each do |key, value|
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ def create_firefox_driver(opt = {})

def create_ie_driver(opt = {})
opt[:desired_capabilities] ||= WebDriver::Remote::Capabilities.ie
opt[:desired_capabilities]['requireWindowFocus'] = true
opt[:options] ||= WebDriver::IE::Options.new(require_window_focus: true)

WebDriver::Driver.for :ie, opt
end
Expand Down
6 changes: 3 additions & 3 deletions rb/spec/unit/selenium/webdriver/chrome/driver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ module Chrome

it 'takes desired capabilities' do
expect(http).to receive(:call) do |_, _, payload|
expect(payload[:desiredCapabilities][:chrome_options]).to include('foo' => 'bar')
expect(payload[:capabilities][:firstMatch][0][:chrome_options]).to include('foo' => 'bar')
resp
end

Expand All @@ -118,7 +118,7 @@ module Chrome

it 'lets direct arguments take precedence over capabilities' do
expect(http).to receive(:call) do |_, _, payload|
expect(payload[:desiredCapabilities]['goog:chromeOptions'][:args]).to eq(driver_args)
expect(payload[:capabilities][:firstMatch][0]['goog:chromeOptions'][:args]).to eq(driver_args)
resp
end

Expand All @@ -131,7 +131,7 @@ module Chrome

it 'does not merge empty options' do
expect(http).to receive(:call) do |_, _, payload|
expect(payload[:desiredCapabilities]['goog:chromeOptions'][:args]).to eq(%w[foo bar])
expect(payload[:capabilities][:firstMatch][0]['goog:chromeOptions'][:args]).to eq(%w[foo bar])
resp
end

Expand Down
42 changes: 1 addition & 41 deletions rb/spec/unit/selenium/webdriver/ie/driver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,57 +38,17 @@ module IE
expect { Driver.new(foo: 'bar') }.to raise_error(ArgumentError)
end

it 'accepts the :introduce_flakiness_by_ignoring_security_domains option' do
Driver.new(
introduce_flakiness_by_ignoring_security_domains: true,
http_client: http
)

expect(caps[:ignore_protected_mode_settings]).to be true
end

it 'has native events enabled by default' do
Driver.new(http_client: http)

expect(caps[:native_events]).to be true
end

it 'can disable native events' do
Driver.new(
native_events: false,
http_client: http
)

expect(caps[:native_events]).to be false
end

it 'takes desired capabilities' do
custom_caps = Remote::Capabilities.new
custom_caps['ignoreProtectedModeSettings'] = true

expect(http).to receive(:call) do |_, _, payload|
expect(payload[:desiredCapabilities]['ignoreProtectedModeSettings']).to be true
expect(payload[:capabilities][:firstMatch][0]['ignoreProtectedModeSettings']).to be true
resp
end

Driver.new(http_client: http, desired_capabilities: custom_caps)
end

it 'can override desired capabilities through direct arguments' do
custom_caps = Remote::Capabilities.new
custom_caps['ignoreProtectedModeSettings'] = false

expect(http).to receive(:call) do |_, _, payload|
expect(payload[:desiredCapabilities][:ignore_protected_mode_settings]).to be true
resp
end

Driver.new(
http_client: http,
desired_capabilities: custom_caps,
introduce_flakiness_by_ignoring_security_domains: true
)
end
end
end # IE
end # WebDriver
Expand Down
4 changes: 4 additions & 0 deletions rb/spec/unit/selenium/webdriver/ie/options_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ module IE
expect(opt.initial_browser_url).to eq('http://google.com')
end

it 'has native events on by default' do
expect(options.native_events).to eq(true)
end

it 'sets passed native_events' do
opt = Options.new(native_events: false)
expect(opt.native_events).to eq(false)
Expand Down
12 changes: 4 additions & 8 deletions rb/spec/unit/selenium/webdriver/remote/bridge_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,12 @@ module Remote
describe '#create_session' do
let(:http) { WebDriver::Remote::Http::Default.new }

it 'sends merged capabilities' do
it 'sends plain capabilities' do
payload = JSON.generate(
desiredCapabilities: {
browserName: 'internet explorer',
platform: 'WINDOWS'
},
capabilities: {
firstMatch: [{
browserName: 'internet explorer'
browserName: 'internet explorer',
platformName: 'windows'
}]
}
)
Expand All @@ -52,9 +49,8 @@ module Remote
Bridge.new(http_client: http).create_session(Capabilities.ie)
end

it 'passes Chrome options as capabilities' do
it 'passes options as capabilities' do
payload = JSON.generate(
desiredCapabilities: {},
capabilities: {
firstMatch: [{
'goog:chromeOptions' => {
Expand Down
2 changes: 1 addition & 1 deletion rb/spec/unit/selenium/webdriver/safari/driver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ module Safari
custom_caps['foo'] = 'bar'

expect(http).to receive(:call) do |_, _, payload|
expect(payload[:desiredCapabilities]['foo']).to eq 'bar'
expect(payload[:capabilities][:firstMatch][0]['foo']).to eq 'bar'
resp
end

Expand Down

0 comments on commit 88c0fd6

Please sign in to comment.