Ruby中的自动化测试继续在CircleCI上失败

时间:2018-01-18 13:32:42

标签: ruby automation capybara selenium-chromedriver

我正在开发一个带有Rails应用程序自动化测试的项目。 使用自动化测试的项目是与Rails应用程序分开的项目,该应用程序使用Capybara和无头Chrome在CircleCI上运行测试。

这是配置文件:

module WaitForAjax
  def wait_for_ajax
    Timeout.timeout(Capybara.default_max_wait_time) do
      loop until finished_all_ajax_requests?
    end
  end

  def finished_all_ajax_requests?
    page.evaluate_script('jQuery.active').zero?
  end
end

RSpec.configure do |config|
  config.include WaitForAjax, type: :feature
  config.before do
    Capybara.register_driver :poltergeist do |app|
      options = {
        :js_errors => false,
          :debug => false,
          :phantomjs_options => ['--load-images=no', '--disk-cache=false'],
          :inspector => true
      }
      Capybara::Poltergeist::Driver.new(app, options)
    end
    Capybara.register_driver :selenium_chrome do |app|
      Capybara::Selenium::Driver.new(app, :browser => :chrome, desired_capabilities: Selenium::WebDriver::Remote::Capabilities
                                                                                         .chrome("chromeOptions" => { "args" => ["start-maximized"] }))
    end

    Capybara.register_driver :headless_chrome do |app|
      capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
        chromeOptions: { args: %w[headless disable-gpu] }
      )

      Capybara::Selenium::Driver.new app,
        browser: :chrome,
        desired_capabilities: capabilities
    end

    Capybara.default_max_wait_time = 5
    Capybara.javascript_driver = :headless_chrome
    Capybara.default_driver = :selenium_chrome
  end
end

Capybara.configure do |config|
  config.run_server = false
  Capybara.default_driver = :selenium_chrome
  config.app_host = 'myapphost.com'
end

目前正在发生的是当我运行整个测试套件时,在CircleCI和我的本地机器上,一些测试在没有任何明显原因的情况下以随机方式继续失败。如果我在本地计算机上按文件运行测试文件,我不会遇到任何问题。 我想知道是否有人可能知道这个问题的任何解决方案或调试建议,我将非常感谢。 非常感谢。

更新:

it 'should fill epay iframe form fields and finish transaction' do
  patient_id = DatabaseHelper.run_query(SQL_QUERIES['corral']['get_imported_patient'] % [@premium_practice_schema.to_s, @imported_patient_surname + ' ' + @imported_patient_name]).first[:id] # rubocop:disable Metrics/LineLength

  create_ach_transaction('today_amount': 100, 'total_amount': 500, 'patient_id': patient_id, 'payments_number': 2)

  expect(page.find(Patients::FIRST_PATIENT_BALANCE).text.gsub(/\$|\./, '').to_i).to eq 500 * 100
end

错误:

失败/错误:期待(page.find(Patients :: FIRST_PATIENT_BALANCE).text.gsub(/ \ $ |。/,'')。to_i).to eq 500 * 100

   expected: 50000
        got: 10000

1 个答案:

答案 0 :(得分:0)

您使用期望的方式是打败Capybara提供的等待/重试行为,以便处理动态页面。我不完全确定这个改变会修复你当前的失败,但它会减少片状测试的数量(并且不再需要像wait_for_ajax这样的东西)。基本上,你永远不应该使用eq匹配器来处理与Capybara返回的元素有关的任何事情。而不是

expect(page.find(Patients::FIRST_PATIENT_BALANCE).text.gsub(/\$|\./, '').to_i).to eq 500 * 100 . 

无法在动态页面上等待元素内容发生变化(以及实际测试内容的边界线不可读,以及从货币号码中删除.在验证准确性时绝不是一个好主意),你应该写它像

expect(page).to have_css(Patients::FIRST_PATIENT_BALANCE, exact_text: "$500.00") # or whatever the total is supposed to be as shown on the page

假设Patients::FIRST_PATIENT_BALANCE是一个CSS选择器,如果它是XPath表达式则使用have_xpath。这也可以写成

expect(find(Patients::FIRST_PATIENT_BALANCE)).to have_text("$500.00", exact: true)

如果需要,或者您已经引用了FIRST_PATIENT_BALANCE元素。

相关问题