【发布时间】: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