在 Selenium webdriver 中,对于远程 Firefox 如何使用 OSS 桥而不是 w3c 桥进行握手

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

我在 ruby 中使用 selenoid 进行远程浏览器测试。 因为我使用 'selenium-webdriver'、'capybara'、'rspec' 进行自动化。我正在使用 attach_file 方法将文件上传到浏览器 我想在 Firefox 和 Chrome 浏览器上上传文件,但在两者上都会引发错误;

在chrome

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

在火狐中

unexpected token at 'HTTP method not allowed'

所以在搜索之后我找到了 chrome 的解决方案,即在 caps['goog:chromeOptions'] > caps[[=30] 中将 w3c 选项设置为 false =]] = {w3c: false} 所以现在 chrome 正在使用 OSS 桥 进行握手,但我不知道如何在 Firefox 中进行。类似的解决方案不适用于 Firefox。 我的浏览器功能如下:

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

在 Firefox 图像中,我们通过添加模拟此 API 而不是 Geckodriver(未实现它)的 Selenoid 二进制文件来支持 /session/<id>/file API。

我找到问题了。 运行 在 java 上的 selenium 服务器中存在错误,因此我必须更改我的 selenium-webdriver gem 版本 3.142.7 和猴子补丁。 您可以找到有关错误和解决方案的更多信息here

现在我必须更改我的 gem 并猴子修补 selenium-webdriver-3.142.7\lib\selenium\webdriver\remote\w3c\commands.rb 文件。检查第 150 行的以下行。

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

并将其更新为

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