在rails项目上使用水豚和selenium-webdriver运行系统测试失败:由于bridge.rb:44:in`handshake中的ArgumentError

我有以下水豚配置:

Capybara.register_driver :chrome_headless do |app|
  media_tab_screen_size = '1280,800'
  chrome_capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
    loggingPrefs: {
      browser: 'ALL',
      client: 'ALL',
      driver: 'ALL',
      server: 'ALL'
    },
    chromeOptions: {
      args: %W[no-sandbox
               disable-dev-shm-usage
               no-default-browser-check
               start-maximized
               headless
               disable-gpu
               window-size=#{media_tab_screen_size}]
    }
  )
  if ENV['HUB_URL']
    Capybara::Selenium::Driver.new(app,
                                   browser: :remote,
                                   url: ENV['HUB_URL'],
                                   desired_capabilities: chrome_capabilities)
  else
    Capybara::Selenium::Driver.new(app,
                                   browser: :chrome,
                                   desired_capabilities: chrome_capabilities)
  end
end

RSpec.configure do |config|

    driven_by :chrome_headless

    # Sets host for tests with selenium
    Capybara.app_host = "http://#{IPSocket.getaddress(Socket.gethostname)}:3000"
    # Capybara.server = :puma # Until your setup is working
    Capybara.server_host = IPSocket.getaddress(Socket.gethostname)
    Capybara.server_port = 3000
end

当我使用 docker-compose 和 through selenium/standalone-chrome:88.0image运行系统测试时,当我像这样运行测试时出现以下错误:
docker-compose run --rm -e RAILS_ENV=test web bin/rails spec:system

          ArgumentError:
            wrong number of arguments (given 1, expected 0)
          # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/bridge.rb:44:in `handshake'
          # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/remote/driver.rb:39:in `initialize'
          # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/common/driver.rb:58:in `new'
          # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver/common/driver.rb:58:in `for'
          # /usr/local/bundle/gems/selenium-webdriver-3.142.7/lib/selenium/webdriver.rb:88:in `for'
          # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/selenium/driver.rb:83:in `browser'
          # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/selenium/driver.rb:104:in `visit'
          # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/session.rb:278:in `visit'
          # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/dsl.rb:53:in `call'
          # /usr/local/bundle/gems/capybara-3.35.3/lib/capybara/dsl.rb:53:in `visit'
          # ./spec/system/home_page_spec.rb:7:in `block (2 levels) in <top (required)>'
          # /usr/local/bundle/gems/webmock-3.11.2/lib/webmock/rspec.rb:37:in `block (2 levels) in <main>'

     1.2) Failure/Error:
                    def self.handshake(**opts)
                      desired_capabilities = opts.delete(:desired_capabilities) { Capabilities.new }

                      if desired_capabilities.is_a?(Symbol)
                        unless Capabilities.respond_to?(desired_capabilities)
                          raise Error::WebDriverError, "invalid desired capability: #{desired_capabilities.inspect}"
                        end

                        desired_capabilities = Capabilities.__send__(desired_capabilities)
                      end

          ArgumentError:
            wrong number of arguments (given 1, expected 0)

我真的不知道是什么原因造成的,是配置问题还是兼容性问题。我试图无数次调试它并更改 gems 版本,但什么也没发生。我将不胜感激任何帮助。

回答

查看堆栈跟踪中列出的代码,远程驱动程序正在执行

def initialize(opts = {})
  listener = opts.delete(:listener)
  @bridge = Bridge.handshake(opts)
  ...

这是调用远程桥代码

def self.handshake(**opts)
  desired_capabilities = opts.delete(:desired_capabilities) { Capabilities.new }
  ...

从中我们可以看出,远程驱动程序正在传递一个哈希值,但handshake需要关键字参数。这将在 Ruby < 3.0 中起作用,因为最后一个 Hash 参数将被解释为关键字 args(在 Ruby 2.7 中它会给出弃用警告),但在 Ruby 3.0+ 中则不然,所以我假设您使用的是 Ruby 3.0,它不是'与 Selenium 3.x 不兼容

  • Yes, Updating selenium to 4.0 made it work. I never thought I wanna do this since the recent version was a beta. but it worked

以上是在rails项目上使用水豚和selenium-webdriver运行系统测试失败:由于bridge.rb:44:in`handshake中的ArgumentError的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>