Search code examples
selenium-webdriverrspeccapybaraselenium-firefoxdriverselenoid

In Selenium webdriver, for remote Firefox how to use OSS bridge instead of w3c bridge for handshaking


I am using selenoid for remote browser testing in ruby. In that I am using 'selenium-webdriver', 'capybara', 'rspec' for automation. And I am using attach_file method for uploading file to browser I want to upload file on Firefox and Chrome browser but it raises error on both;

In chrome

Selenium::WebDriver::Error::UnknownCommandError: unknown command: unknown command: session/***8d32e045e3***/se/file

In firefox

unexpected token at 'HTTP method not allowed'

So After searching I found the solution for chrome which is to set w3c option false in caps['goog:chromeOptions'] > caps['goog:chromeOptions'] = {w3c: false} So now chrome is using OSS bridge for handshaking but I don't know how to do it in Firefox. Similar solution is not available for Firefox. My browser capabilities are following:

if ENV['BROWSER'] == 'firefox'
    caps = Selenium::WebDriver::Remote::Capabilities.new
    caps['browserName'] = 'firefox'
    # caps['moz:firefoxOptions'] = {w3c: false} ## It is not working
  else
    caps = Selenium::WebDriver::Remote::Capabilities.new
    caps["browserName"] = "chrome"
    caps["version"] = "81.0"
    caps['goog:chromeOptions'] = {w3c: false}
  end
    caps["enableVNC"] = true
    caps["screenResolution"] = "1280x800"
    caps['sessionTimeout'] = '15m'

  Capybara.register_driver :selenium do |app|  
    Capybara::Selenium::Driver.new(app, browser: :remote,
    :desired_capabilities => caps,
    :url => ENV["REMOTE_URL"] || "http://*.*.*.*:4444/wd/hub"
    )
  end

  Capybara.configure do |config|  
   config.default_driver = :selenium
  end

Solution

  • I have found the problem. There is bug in selenium server which run on java so I have to change my selenium-webdriver gem version 3.142.7 and monkey-patch. You can find more information here about the bug and resolution.

    For now I have to change my gem and monkey patch the selenium-webdriver-3.142.7\lib\selenium\webdriver\remote\w3c\commands.rb file. check for below line which is on line no 150.

    upload_file: [:post, 'session/:session_id/se/file']

    and update it to

    upload_file: [:post, 'session/:session_id/file']