我正在开发一个带有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
答案 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元素。