Path: blob/trunk/rb/spec/unit/selenium/webdriver/remote/driver_spec.rb
1865 views
# frozen_string_literal: true12# Licensed to the Software Freedom Conservancy (SFC) under one3# or more contributor license agreements. See the NOTICE file4# distributed with this work for additional information5# regarding copyright ownership. The SFC licenses this file6# to you under the Apache License, Version 2.0 (the7# "License"); you may not use this file except in compliance8# with the License. You may obtain a copy of the License at9#10# http://www.apache.org/licenses/LICENSE-2.011#12# Unless required by applicable law or agreed to in writing,13# software distributed under the License is distributed on an14# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY15# KIND, either express or implied. See the License for the16# specific language governing permissions and limitations17# under the License.1819require File.expand_path('../spec_helper', __dir__)2021module Selenium22module WebDriver23module Remote24describe Driver do25let(:valid_response) do26{status: 200,27body: {value: {sessionId: 0, capabilities: {browserName: 'chrome'}}}.to_json,28headers: {content_type: 'application/json'}}29end3031def expect_request(body: nil, endpoint: nil)32body = (body || {capabilities: {alwaysMatch: {browserName: 'chrome', 'goog:chromeOptions': {}}}}).to_json33endpoint ||= 'http://127.0.0.1:4444/wd/hub/session'34stub_request(:post, endpoint).with(body: body).to_return(valid_response)35end3637it 'requires parameters' do38expect { described_class.new }39.to raise_exception(ArgumentError, 'Selenium::WebDriver::Remote::Driver needs :options to be set')40end4142it 'uses provided URL' do43server = 'https://example.com:4646/wd/hub'44expect_request(endpoint: "#{server}/session")4546expect { described_class.new(options: Options.chrome, url: server) }.not_to raise_exception47end4849it 'uses provided HTTP Client' do50client = Remote::Http::Default.new51expect_request5253driver = described_class.new(options: Options.chrome, http_client: client)54expect(driver.send(:bridge).http).to eq client55end5657it 'accepts Options as sole parameter' do58opts = {args: ['-f']}59expect_request(body: {capabilities: {alwaysMatch: {browserName: 'chrome', 'goog:chromeOptions': opts}}})6061expect { described_class.new(options: Options.chrome(**opts)) }.not_to raise_exception62end6364it 'does not allow both Options and Capabilities' do65msg = "Don't use both :options and :capabilities when initializing Selenium::WebDriver::Remote::Driver, " \66'prefer :options'67expect {68described_class.new(options: Options.chrome, capabilities: Remote::Capabilities.new(browser_name: 'chrome'))69}.to raise_exception(ArgumentError, msg)70end7172context 'with :capabilities' do73it 'accepts value as a Symbol' do74expect_request75expect { described_class.new(capabilities: :chrome) }.not_to raise_exception76end7778it 'accepts constructed Capabilities with Snake Case as Symbols' do79capabilities = Remote::Capabilities.new(browser_name: 'chrome', invalid: 'foobar')80expect_request(body: {capabilities: {alwaysMatch: {browserName: 'chrome', invalid: 'foobar'}}})8182expect { described_class.new(capabilities: capabilities) }.not_to raise_exception83end8485it 'accepts constructed Capabilities with Camel Case as Symbols' do86capabilities = Remote::Capabilities.new(browserName: 'chrome', invalid: 'foobar')87expect_request(body: {capabilities: {alwaysMatch: {browserName: 'chrome', invalid: 'foobar'}}})8889expect { described_class.new(capabilities: capabilities) }.not_to raise_exception90end9192it 'accepts constructed Capabilities with Camel Case as Strings' do93capabilities = Remote::Capabilities.new('browserName' => 'chrome', 'invalid' => 'foobar')94expect_request(body: {capabilities: {alwaysMatch: {browserName: 'chrome', invalid: 'foobar'}}})9596expect { described_class.new(capabilities: capabilities) }.not_to raise_exception97end9899context 'when value is an Array' do100let(:as_json_object) do101Class.new do102def as_json(*)103{'company:key': 'value'}104end105end106end107108it 'with Options instance' do109options = Options.chrome(args: ['-f'])110expect_request(body: {capabilities: {alwaysMatch: {browserName: 'chrome',111'goog:chromeOptions': {args: ['-f']}}}})112113expect { described_class.new(capabilities: [options]) }.not_to raise_exception114end115116it 'with Capabilities instance' do117capabilities = Remote::Capabilities.new(browser_name: 'chrome', invalid: 'foobar')118expect_request(body: {capabilities: {alwaysMatch: {browserName: 'chrome', invalid: 'foobar'}}})119120expect { described_class.new(capabilities: [capabilities]) }.not_to raise_exception121end122123it 'with Options instance and an instance of a custom object responding to #as_json' do124expect_request(body: {capabilities: {alwaysMatch: {browserName: 'chrome',125'goog:chromeOptions': {},126'company:key': 'value'}}})127expect { described_class.new(capabilities: [Options.chrome, as_json_object.new]) }.not_to raise_exception128end129130it 'with Options instance, Capabilities instance and instance of a custom object responding to #as_json' do131capabilities = Remote::Capabilities.new(browser_name: 'chrome', invalid: 'foobar')132options = Options.chrome(args: ['-f'])133expect_request(body: {capabilities: {alwaysMatch: {browserName: 'chrome', invalid: 'foobar',134'goog:chromeOptions': {args: ['-f']},135'company:key': 'value'}}})136137expect {138described_class.new(capabilities: [capabilities, options, as_json_object.new])139}.not_to raise_exception140end141end142end143end144end # Remote145end # WebDriver146end # Selenium147148149