【问题标题】:Ruby: Selenium and WebMock causing TypeErrorRuby:Selenium 和 WebMock 导致 TypeError
【发布时间】:2017-05-22 16:08:12
【问题描述】:

WebMock 和 Selenium 的组合导致第一次调用 visit 时出现类型错误

 Failure/Error: id['ELEMENT'] || id['element-6066-11e4-a52e-4f735466cecf']
      TypeError:
        no implicit conversion of String into Integer
# /selenium-webdriver-3.4.0/lib/selenium/webdriver/common/bridge_helper.rb:43:in `[]'
# /selenium-webdriver-3.4.0/lib/selenium/webdriver/common/bridge_helper.rb:43:in `element_id_from'
# /selenium-webdriver-3.4.0/lib/selenium/webdriver/remote/bridge.rb:638:in `block in find_elements_by'
# /selenium-webdriver-3.4.0/lib/selenium/webdriver/remote/bridge.rb:638:in `each'
# /selenium-webdriver-3.4.0/lib/selenium/webdriver/remote/bridge.rb:638:in `map'
# /selenium-webdriver-3.4.0/lib/selenium/webdriver/remote/bridge.rb:638:in `find_elements_by'
# /selenium-webdriver-3.4.0/lib/selenium/webdriver/common/search_context.rb:79:in `find_elements'
# /capybara-2.14.0/lib/capybara/selenium/driver.rb:86:in `find_xpath'
# /capybara-2.14.0/lib/capybara/node/base.rb:108:in `find_xpath'
# /capybara-2.14.0/lib/capybara/queries/selector_query.rb:135:in `block in resolve_for'
# /capybara-2.14.0/lib/capybara/node/base.rb:81:in `synchronize'
# /capybara-2.14.0/lib/capybara/queries/selector_query.rb:131:in `resolve_for'
# /capybara-2.14.0/lib/capybara/node/finders.rb:40:in `block in find'
# /capybara-2.14.0/lib/capybara/node/base.rb:85:in `synchronize'
# /capybara-2.14.0/lib/capybara/node/finders.rb:38:in `find'
# /capybara-2.14.0/lib/capybara/node/actions.rb:92:in `fill_in'
# /capybara-2.14.0/lib/capybara/session.rb:784:in `block (2 levels) in <class:Session>'
# /capybara-angular-0.2.5/lib/capybara/angular/dsl.rb:8:in `block (2 levels) in <module:DSL>'
# ./spec/features/assesment_picker_spec.rb:34:in `block (3 levels) in <top (required)>'

但是,当我删除所有 WebMock 代码时,我的测试就会执行。我已经在我的 WebMock 异常中允许了 localhost,但是我的测试仍然无法执行。我不确定在使用 WebMock 时还需要做什么才能让 Selenium 运行。此外,如果 Selenium 规范是第一个运行的,它们就会通过。

水豚设置

Capybara.configure do |config|
  config.run_server = false
  config.app_host = root_url #retrieved elsewhere

  Capybara.register_driver :chrome do |app|
    Capybara::Selenium::Driver.new(app, browser: :chrome)
  end

  config.save_path = File.join Dir.pwd, 'tmp', 'capybara'
end

Capybara.default_driver = :chrome
Capybara.current_driver = Capybara.default_driver
Capybara.javascript_driver = Capybara.default_driver

规范助手

require 'rspec/rails'
require 'rspec/autorun'
require 'factory_girl_rails'
require 'webmock/rspec'

WebMock.disable_net_connect!(allow_localhost: true, allow: [/browserstack.com/])

# Load support files
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }

RSpec.configure do |config|
  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
end

从 remote/bridge#find_elements_by 中的 find_elements 返回的哈希

$ how
"css selector"
$ what
"a"
$ execute :find_elements, {}, {using: how, value: what}

{
              "acceptSslCerts" => true,
     "applicationCacheEnabled" => false,
    "browserConnectionEnabled" => false,
                 "browserName" => "chrome",
                      "chrome" => {
        "chromedriverVersion" => "2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b)",
                "userDataDir" => "/var/folders/2h/ws89fb2s381c9_3fzy6f9gzm0000gn/T/.org.chromium.Chromium.RPWXqC"
    },
         "cssSelectorsEnabled" => true,
             "databaseEnabled" => false,
               "handlesAlerts" => true,
              "hasTouchScreen" => false,
           "javascriptEnabled" => true,
      "locationContextEnabled" => true,
      "mobileEmulationEnabled" => false,
                "nativeEvents" => true,
    "networkConnectionEnabled" => false,
            "pageLoadStrategy" => "normal",
                    "platform" => "Mac OS X",
                   "rotatable" => false,
           "takesHeapSnapshot" => true,
             "takesScreenshot" => true,
    "unexpectedAlertBehaviour" => "",
                     "version" => "57.0.2987.133",
           "webStorageEnabled" => true
}

工具

$ chromedriver -v
ChromeDriver 2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b)
$ bundle list selenium-webdriver
/Users/aaron/.rvm/gems/ruby-2.3.4/gems/selenium-webdriver-3.4.0

【问题讨论】:

  • 发布错误消息的堆栈跟踪,以便我们查看它的实际来源。此外,我希望您意识到 WebMock 实际上不会让您模拟对来自浏览器的请求的响应,它只允许模拟您的应用程序发出的请求,并且通常不赞成使用应该是端到端的功能规范 (capybara) .

标签: ruby selenium selenium-webdriver capybara webmock


【解决方案1】:

您使用的 selenium-webdriver 很可能与您使用的 chromedriver 版本不兼容。更新到最新的 selenium-webdriver(3.4.0,我正在输入)和 chromedriver(2.29)。您可能还需要指示 WebMock 允许 127.0.0.1 上的连接用于 selenium 和 chromedriver 之间的通信,具体取决于您的配置方式。

【讨论】:

  • @TIMBERings 你刚刚更新到那个,因为你的错误日志非常清楚地显示 selenium-webdriver 3.2.2 ?
  • 我没有更新堆栈跟踪。现在一切都应该更新。我包含了一些来自进一步调试的更多信息
  • @TIMBERings 您显示的响应不是对 :find_elements 调用的有效响应,所以我很困惑您为什么会得到它。您没有 WebMock 使用 VCR 等播放预先录制的响应吗?如果是这样,您需要将其关闭以进行 selenium 通信。
  • 这也是我不明白的。实际测试中的应用程序启用了 WebMock 来模拟来自我们 API 的信息。包括 WebMock::API; WebMock.enable!, WebMock.disable_net_connect!(allow_localhost: true)。除此之外,没有使用录像机或类似的东西。
  • @TIMBERings 听起来您确实在以某种方式嘲笑硒连接。我想在您的项目中搜索您看到的无效响应中的一些字符串。除此之外,它没有任何意义。
【解决方案2】:

我一直在为 Browserstack 和 SauceLabs 导入路边模块,而不仅仅是在我运行远程驱动程序时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-19
    • 2019-07-14
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多