Skip to content

Commit

Permalink
[rb] add driver specs to reflect current functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
titusfortner committed Nov 28, 2019
1 parent 01701f6 commit be1975e
Show file tree
Hide file tree
Showing 7 changed files with 468 additions and 86 deletions.
4 changes: 1 addition & 3 deletions rb/spec/integration/selenium/webdriver/driver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@
module Selenium
module WebDriver
describe Driver do
it_behaves_like 'driver that can be started concurrently', except: [{browser: :edge},
{browser: :safari},
{browser: :safari_preview}]
it_behaves_like 'driver that can be started concurrently', except: {browser: %i[edge safari safari_preview]}

it 'should get the page title' do
driver.navigate.to url_for('xhtmlTest.html')
Expand Down
3 changes: 1 addition & 2 deletions rb/spec/integration/selenium/webdriver/manager_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,7 @@ module WebDriver
expect(entries.first).to be_kind_of(LogEntry)
end

# Chrome - turned off by default
it 'can get the driver log', except: {browser: %i[chrome edge_chrome]} do
it 'can get the driver log' do
driver.navigate.to url_for('simpleTest.html')

entries = driver.manage.logs.get(:driver)
Expand Down
108 changes: 77 additions & 31 deletions rb/spec/unit/selenium/webdriver/chrome/driver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,57 +23,103 @@ module Selenium
module WebDriver
module Chrome
describe Driver do
let(:resp) { {'value' => {'sessionId' => 'foo', 'capabilities' => Remote::Capabilities.chrome.as_json}} }
let(:service) { instance_double(Service, start: true, uri: 'http://example.com') }
let(:caps) { Remote::Capabilities.new }
let(:http) { instance_double(Remote::Http::Default, call: resp).as_null_object }
let(:service) { instance_double(Service, start: true, uri: 'http://localhost') }
let(:valid_response) do
{status: 200,
body: {value: {sessionId: 0, capabilities: Remote::Capabilities.chrome}}.to_json,
headers: {"content_type": "application/json"}}
end

def expect_request(body: nil, endpoint: nil)
body = (body || {capabilities: {firstMatch: [browserName: "chrome"]}}).to_json
endpoint ||= "#{service.uri}/session"
stub_request(:post, endpoint).with(body: body).to_return(valid_response)
end

before do
allow(Remote::Capabilities).to receive(:chrome).and_return(caps)
allow(Service).to receive(:binary_path).and_return('/foo')
allow(Service).to receive(:new).and_return(service)
end

it 'does not set goog:chromeOptions by default' do
Driver.new(http_client: http)
it 'does not require any parameters' do
expect_request

expect(caps['goog:chromeOptions']).to be nil
expect { Driver.new }.not_to raise_exception
end

it 'raises an ArgumentError if args is not an Array' do
expect { Driver.new(args: '--foo=bar') }.to raise_error(ArgumentError)
it 'does not accept :desired_capabilities value as a Symbol' do
# Note: this is not a valid capabilities packet, so it is not accepted
expect_request(body: {capabilities: {firstMatch: ["chrome"]}})

expect { Driver.new(desired_capabilities: :chrome) }.not_to raise_exception
end

context 'with custom desired capabilities' do
subject(:build_new_driver) do
Driver.new(http_client: http, desired_capabilities: custom_caps)
context 'with :desired capabilities' do
it 'accepts Capabilities.chrome' do
capabilities = Remote::Capabilities.chrome(invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "chrome", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

let(:custom_caps) { Remote::Capabilities.new(cap_opts) }
let(:cap_opts) { {chrome_options: {'foo' => 'bar'}} }
it 'accepts constructed Capabilities with Snake Case as Symbols' do
capabilities = Remote::Capabilities.new(browser_name: 'chrome', invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "chrome", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts constructed Capabilities with Camel Case as Symbols' do
capabilities = Remote::Capabilities.new(browserName: 'chrome', invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "chrome", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'takes desired capabilities' do
expect(http).to receive(:call) do |_, _, payload|
expect(payload[:capabilities][:firstMatch][0][:chrome_options]).to include('foo' => 'bar')
resp
end
it 'accepts constructed Capabilities with Camel Case as Strings' do
capabilities = Remote::Capabilities.new('browserName' => 'chrome', 'invalid' => 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "chrome", invalid: 'foobar']}})

build_new_driver
expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

context 'with empty driver options' do
let(:cap_opts) { {'goog:chromeOptions' => {args: %w[foo bar]}} }
it 'accepts Hash with Camel Case keys as Symbols' do
capabilities = {browserName: 'chrome', invalid: 'foobar'}
expect_request(body: {capabilities: {firstMatch: [browserName: "chrome", invalid: 'foobar']}})

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

it 'accepts Hash with Camel Case keys as Strings' do
capabilities = {"browserName" => 'chrome', "invalid" => 'foobar'}
expect_request(body: {capabilities: {firstMatch: [browserName: "chrome", invalid: 'foobar']}})

build_new_driver
end
expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end
end

it 'accepts provided Options as sole parameter' do
opts = {args: ['-f'], invalid: 'foobar'}
expect_request(body: {capabilities: {firstMatch: ["browserName": "chrome", "goog:chromeOptions": opts]}})

expect { Driver.new(options: Options.new(opts)) }.not_to raise_exception
end

it 'accepts combination of Options and Capabilities' do
caps = Remote::Capabilities.chrome(invalid: 'foobar')
browser_opts = {args: ['-f']}
expect_request(body: {capabilities: {firstMatch: ["browserName": "chrome",
"invalid": "foobar",
"goog:chromeOptions": browser_opts]}})

expect {
Driver.new(options: Options.new(browser_opts), desired_capabilities: caps)
}.not_to raise_exception
end

it 'raises an ArgumentError if parameter is not recognized' do
msg = 'Unable to create a driver with parameters: {:invalid=>"foo"}'
expect { Driver.new(invalid: 'foo') }.to raise_error(ArgumentError, msg)
end
end
end # Chrome
end # WebDriver
Expand Down
111 changes: 101 additions & 10 deletions rb/spec/unit/selenium/webdriver/edge/driver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,113 @@ module Selenium
module WebDriver
module EdgeHtml
describe Driver do
let(:resp) { {'value' => {'sessionId' => 'foo', 'capabilities' => Remote::Capabilities.edge.as_json}} }
let(:service) { instance_double(Service, start: nil, uri: 'http://example.com') }
let(:caps) { Remote::Capabilities.edge }
let(:http) { instance_double(Remote::Http::Default, call: resp).as_null_object }
let(:service) { instance_double(Service, start: true, uri: 'http://localhost') }
let(:valid_response) do
{status: 200,
body: {value: {sessionId: 0, capabilities: Remote::Capabilities.edge}}.to_json,
headers: {"content_type": "application/json"}}
end

def expect_request(body: nil, endpoint: nil)
body = (body || {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
platformName: "windows"]}}).to_json
endpoint ||= "#{service.uri}/session"
stub_request(:post, endpoint).with(body: body).to_return(valid_response)
end

before do
allow(Remote::Capabilities).to receive(:internet_explorer).and_return(caps)
allow(Service).to receive(:binary_path).and_return('/foo')
allow(Service).to receive(:new).and_return(service)
end

it 'accepts server URL' do
expect(Service).not_to receive(:new)
expect(http).to receive(:server_url=).with(URI.parse('http://example.com:4321'))
it 'does not require any parameters' do
expect_request

expect { Driver.new }.not_to raise_exception
end

it 'does not accept :desired_capabilities value as a Symbol' do
# Note: this is not a valid capabilities packet, so it is not accepted
expect_request(body: {capabilities: {firstMatch: ["edge"]}})

expect { Driver.new(desired_capabilities: :edge) }.not_to raise_exception
end

context 'with :desired capabilities' do
it 'accepts Capabilities.edge_html' do
capabilities = Remote::Capabilities.edge_html(invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
platformName: "windows",
invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts constructed Capabilities with Snake Case as Symbols' do
capabilities = Remote::Capabilities.new(browser_name: 'MicrosoftEdge', invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts constructed Capabilities with Camel Case as Symbols' do
capabilities = Remote::Capabilities.new(browserName: 'MicrosoftEdge', invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts constructed Capabilities with Camel Case as Strings' do
capabilities = Remote::Capabilities.new('browserName' => 'MicrosoftEdge', 'invalid' => 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts Hash with Camel Case keys as Symbols' do
capabilities = {browserName: 'MicrosoftEdge', invalid: 'foobar'}
expect_request(body: {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts Hash with Camel Case keys as Strings' do
capabilities = {"browserName" => 'MicrosoftEdge', "invalid" => 'foobar'}
expect_request(body: {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end
end

it 'accepts provided Options as sole parameter' do
opts = {start_page: 'http://selenium.dev'}
expect_request(body: {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
platformName: "windows",
"ms:startPage": "http://selenium.dev"]}})

expect { Driver.new(options: Options.new(opts)) }.not_to raise_exception
end

it 'accepts combination of Options and Capabilities' do
caps = Remote::Capabilities.edge_html(invalid: 'foobar')
browser_opts = {start_page: 'http://selenium.dev'}
expect_request(body: {capabilities: {firstMatch: [browserName: "MicrosoftEdge",
platformName: "windows",
invalid: "foobar",
"ms:startPage": "http://selenium.dev"]}})

expect {
Driver.new(options: Options.new(browser_opts), desired_capabilities: caps)
}.not_to raise_exception
end

Driver.new(http_client: http, url: 'http://example.com:4321')
it 'raises an ArgumentError if parameter is not recognized' do
msg = 'Unable to create a driver with parameters: {:invalid=>"foo"}'
expect { Driver.new(invalid: 'foo') }.to raise_error(ArgumentError, msg)
end
end
end # Edge
Expand Down
99 changes: 91 additions & 8 deletions rb/spec/unit/selenium/webdriver/firefox/driver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,102 @@ module Selenium
module WebDriver
module Firefox
describe Driver do
let(:resp) { {'value' => {'sessionId' => 'foo', 'capabilities' => Remote::Capabilities.firefox.as_json}} }
let(:http) { instance_double(Remote::Http::Default, call: resp).as_null_object }
let(:caps) { Remote::Capabilities.firefox }
let(:service) { instance_double(Service, start: true, uri: 'http://localhost') }
let(:valid_response) do
{status: 200,
body: {value: {sessionId: 0, capabilities: Remote::Capabilities.firefox}}.to_json,
headers: {"content_type": "application/json"}}
end

def expect_request(body: nil, endpoint: nil)
body = (body || {capabilities: {firstMatch: [browserName: "firefox"]}}).to_json
endpoint ||= "#{service.uri}/session"
stub_request(:post, endpoint).with(body: body).to_return(valid_response)
end

before do
allow(Remote::Capabilities).to receive(:firefox).and_return(caps)
allow(Service).to receive(:new).and_return(service)
end

it 'does not require any parameters' do
expect_request

expect { Driver.new }.not_to raise_exception
end

it 'does not accept :desired_capabilities value as a Symbol' do
# Note: this is not a valid capabilities packet, so it is not accepted
expect_request(body: {capabilities: {firstMatch: ["firefox"]}})

expect { Driver.new(desired_capabilities: :firefox) }.not_to raise_exception
end

it 'accepts server URL' do
expect(Service).not_to receive(:new)
expect(http).to receive(:server_url=).with(URI.parse('http://example.com:4321'))
context 'with :desired capabilities' do
it 'accepts Capabilities.firefox' do
capabilities = Remote::Capabilities.firefox(invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "firefox", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts constructed Capabilities with Snake Case as Symbols' do
capabilities = Remote::Capabilities.new(browser_name: 'firefox', invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "firefox", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts constructed Capabilities with Camel Case as Symbols' do
capabilities = Remote::Capabilities.new(browserName: 'firefox', invalid: 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "firefox", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts constructed Capabilities with Camel Case as Strings' do
capabilities = Remote::Capabilities.new('browserName' => 'firefox', 'invalid' => 'foobar')
expect_request(body: {capabilities: {firstMatch: [browserName: "firefox", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts Hash with Camel Case keys as Symbols' do
capabilities = {browserName: 'firefox', invalid: 'foobar'}
expect_request(body: {capabilities: {firstMatch: [browserName: "firefox", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end

it 'accepts Hash with Camel Case keys as Strings' do
capabilities = {"browserName" => 'firefox', "invalid" => 'foobar'}
expect_request(body: {capabilities: {firstMatch: [browserName: "firefox", invalid: 'foobar']}})

expect { Driver.new(desired_capabilities: capabilities) }.not_to raise_exception
end
end

it 'accepts provided Options as sole parameter' do
opts = {args: ['-f'], invalid: 'foobar'}
expect_request(body: {capabilities: {firstMatch: ["browserName": "firefox", "moz:firefoxOptions": opts]}})

expect { Driver.new(options: Options.new(opts)) }.not_to raise_exception
end

it 'accepts combination of Options and Capabilities' do
caps = Remote::Capabilities.firefox(invalid: 'foobar')
browser_opts = {args: ['-f']}
expect_request(body: {capabilities: {firstMatch: ["browserName": "firefox",
"invalid": "foobar",
"moz:firefoxOptions": browser_opts]}})

expect {
Driver.new(options: Options.new(browser_opts), desired_capabilities: caps)
}.not_to raise_exception
end

Driver.new(http_client: http, url: 'http://example.com:4321')
it 'raises an ArgumentError if parameter is not recognized' do
msg = 'Unable to create a driver with parameters: {:invalid=>"foo"}'
expect { Driver.new(invalid: 'foo') }.to raise_error(ArgumentError, msg)
end
end
end # Firefox
Expand Down
Loading

0 comments on commit be1975e

Please sign in to comment.