【问题标题】:Capybara Poltergeist feature test failing on CI but passes locallyCapybara Poltergeist 功能测试在 CI 上失败,但在本地通过
【发布时间】: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


    【解决方案1】:

    虽然我无法重现此问题,但我记得以前遇到过这个问题。我相信你的台词:

    expect(page.body).to have_link('Test Product 1')
    

    正在传递,因为该链接实际上位于 html 页面的主体上,即使它可能由于 CSS 或 JS 行为而被隐藏。但是,该行:

    click_link('Test Product 1')
    

    在单击链接之前肯定会检查可见性。您应该检查您的 spec_helper.rb 配置以确保:

    Capybara.ignore_hidden_elements = true
    

    存在,因此第一行不会通过。我想我还必须将我提到的第一行更改为:

    # Change page.body to page, to look at the rendered page, not the literal one
    expect(page).to have_link('Test Product 1')
    

    执行此操作后,第一行会阻塞线程并等待链接变为可见。然后剩下的测试就通过了。

    希望这能解决它。

    【讨论】:

    • 确实,如果我设置Capybara.ignore_hidden_elements = true,即使第一个期望也会失败。所以该元素似乎不可见。但是,如果我输入expect(page).to have_link('Test Product 1'),它仍然会失败,因为它会阻塞,直到 Capybara 达到超时。所以无论出于何种原因,这些元素永远不会变得可见..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2018-12-18
    相关资源
    最近更新 更多