:driver_opts is deprecated. Use :service with an instance of Selenium::WebDriver::Service instead

Viewed 1942
2019-06-19 15:44:43 WARN Selenium [DEPRECATION] :driver_opts is deprecated. Use :service with an instance of Selenium::WebDriver::Service instead.
Screenshot error, but continue to execute.
wrong number of arguments (given 0, expected 1)
2019-06-19 15:44:43 WARN Selenium [DEPRECATION] :driver_opts is deprecated. Use :service with an instance of Selenium::WebDriver::Service instead.
2019-06-19 15:44:43 WARN Selenium [DEPRECATION] :driver_opts is deprecated. Use :service with an instance of Selenium::WebDriver::Service instead.
          visit in hook, after scenario +1s, @1s
2019-06-19 15:44:43 WARN Selenium [DEPRECATION] :driver_opts is deprecated. Use :service with an instance of Selenium::WebDriver::Service instead.

I've been using the below code snippet to init a session with old 'selenium-webdriver' v3.6.0 and got the above error:

Updated on June 23rd.

if Capybara.default_driver == :selenium
    Capybara.register_driver :selenium do |app|
        # In the block, we build up an `options` hash to pass to
        #   Capybara::Selenium::Driver.new(app, options)
        # which in turn calls
        #   Selenium::WebDriver.for(options[:browser], options)

        browser = Configuration.fetch('browser.type', :firefox) 
        options = {
            browser: browser, # chrome
        }

        if Configuration.fetch('options.webdriver.use_hub', false)
            {...}
        elsif browser == :firefox
            {...}
        elsif browser == :chrome
            chrome_logpath = "../chromedriver.log"
            options[:service] = ::Selenium::WebDriver::Service.chrome(
                args: {
                    verbose: true,
                    log_path: chrome_logpath,
                }
            )
            chrome_options = Selenium::WebDriver::Chrome::Options.new
            chrome_options.add_argument("user-agent='QA Test'")
            chrome_options.add_option('w3c',false)
            options[:options] = chrome_options
        end
    Capybara::Selenium::Driver.new(app, options)
    end
end

After bumped that gem to v3.142.0 then I got that error. Tracing back to the Selenium Webdriver Changelog in https://github.com/SeleniumHQ/selenium/blob/master/rb/CHANGES then i found the following description, which might break the current code 3.141.592 (2019-04-18)

Chrome: 
Added support for instantiating service class directly and moved all driver executable configuration there (command-line arguments, port, etc.)
Passing driver_opts, driver_path and port to driver initializer is now deprecated 
so use Selenium::WebDriver::Service.chrome instead, 
which allows to customize executable behavior in similar way.
 Once initialized, this object can be passed as :service keyword 
during driver initialization. 
* Deprecated Chrome.driver_path= in favor of Service::Chrome.driver_path=

Googling for a while i found some results and workaround like using 'webdriver' gem but i don't like it that much.

So wonder if something that i can change my snippet above to adapt with that selenium-webdriver ver 3.142.0 and onwards? I'm using Capybara v3.18.0 at the moment.

Thanks everyone,

1 Answers

That's not an error, it's a deprecation warning. It's telling you that you will need to change your code before selenium-webdriver v4.0 is released. If you feel you must update your code today it would be something like

elsif browser == :chrome

  options[:service] = ::Selenium::WebDriver::Service.chrome(
    args: {
      verbose: true,
      log_path: "../chromedriver.log",
    }
  )

  chrome_options = Selenium::WebDriver::Chrome::Options.new

  # add user agent to that class options
  chrome_options.add_argument("user-agent='QA Test'")
  options[:options] = chrome_options
end

The other stuff you show

Screenshot error, but continue to execute.
wrong number of arguments (given 0, expected 1)

is something different and isn't coming from any of the code you're showing.

Related