【发布时间】:2015-03-16 13:18:34
【问题描述】:
我在使用 Capybara 和 poltergeist 驱动程序进行一些功能测试时遇到了奇怪的问题。 测试应该在我的在线商店中执行一个简单的结帐。 它们在我本地的 MacBook 和 Ubuntu vagrant box 上都可以通过。但是,在 Codeship、Wercker 或 Semaphore 等 CI 服务上,它们会因相同的错误而失败。
我的规格:
require 'rails_helper'
describe 'Checkout' do
let!(:product) { FactoryGirl.create(:product) }
it 'checks out via CreditCard', js: true do
visit products_path
expect(page.body).to have_link('Test Product 1')
click_link('Test Product 1')
#rest of spec ommitted
end
end
我在 CI 上遇到的错误是:
2) Checkout checks out via CreditCard
Failure/Error: click_link('Test Product 1')
Capybara::ElementNotFound:
Unable to find link "Test Product 1"
对我来说这太奇怪了,因为第一个期望 'expect(page.body).to have_link('Test Product 1')' 似乎通过了,但在下一步它失败了它应该在哪里实际点击它刚刚确定出现在页面上的链接?
然后我重新配置了 poltergeist 驱动程序,以收集更多调试信息。
rails_helper.rb 的片段:
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, {js_errors: false,
#inspector: true,
phantomjs_logger: Rails.logger,
logger: nil,
phantomjs_options: ['--debug=no', '--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=TLSv1'],
debug: true
})
end
Capybara.server_port = 3003
Capybara.app_host = 'http://application-test.lvh.me:3003' # lvh.me always resolves to 127.0.0.1
Capybara.javascript_driver = :poltergeist
Capybara.current_driver = :poltergeist
Capybara.default_wait_time = 5
现在我可以在 CI 控制台上看到测试成功访问了我的 products_path 并且正在返回预期的 html 页面(包括我应该单击的链接)。 我删除了 HTML 响应的其余部分以使其更具可读性:
{"name"=>"visit", "args"=>["http://application-test.lvh.me:3003/products"]}
{"response"=>{"status"=>"success"}}
{"name"=>"body", "args"=>[]}
{"response"=>"--- snip --- <div class=\"info\">\n<a class=\"name color-pomegranate\" href=\"/en/products/6\">\nTest Product 1\n</a>\n850,00 \n</div> --- snap ---"}
{"name"=>"find", "args"=>[:xpath, ".//a[./@href][(((./@id = 'Test Product 1' or normalize-space(string(.)) = 'Test Product 1') or ./@title = 'Test Product 1') or .//img[./@alt = 'Test Product 1'])]"]}
{"response"=>{"page_id"=>4, "ids"=>[0]}}
{"name"=>"visible", "args"=>[4, 0]}
{"response"=>false}
{"name"=>"find", "args"=>[:xpath, ".//a[./@href][(((./@id = 'Test Product 1' or contains(normalize-space(string(.)), 'Test Product 1')) or contains(./@title, 'Test Product 1')) or .//img[contains(./@alt, 'Test Product 1')])]"]}
{"response"=>{"page_id"=>4, "ids"=>[1]}}
{"name"=>"visible", "args"=>[4, 1]}
{"response"=>false}
最后两个 find 动作重复直到 Capybara 超时,然后测试失败。 我通过一些在线 xpath 验证器仔细检查了 xpath Capybara 使用,但正如预期的那样,它与 HTML 链接匹配。 我还使用 capybara-screenshot gem 在失败时转储 HTML 正文,并且有问题的链接也存在。
那么为什么测试仍然失败? 有没有我不知道的比赛条件?为什么它在本地传递,但没有在任何 CI 服务上传递?
这是我的 gem 版本:
- 水豚 (2.4.4)
- 水豚截图 (1.0.3)
- database_cleaner (1.3.0)
- factory_girl (4.5.0)
- factory_girl_rails (4.5.0)
- 闹鬼 (1.5.1)
- 导轨 (4.1.8)
- rspec (3.1.0)
- rspec-rails (3.1.0)
- 和 phantomjs 1.9.7
【问题讨论】:
标签: ruby-on-rails-4 capybara rspec-rails poltergeist