Poltergeist执行visit操作超时,常规方案无效,求其他解决办法
针对Poltergeist无头模式第三次运行超时的解决方案
看起来你已经尝试了不少常规方法,但还没命中核心问题。我来帮你拆解几个关键问题点和可行的解决步骤:
1. 先修复Poltergeist驱动的致命配置错误
你的驱动注册代码犯了一个低级错误:三次调用Capybara::Poltergeist::Driver.new,但Ruby里这种写法只会让最后一个实例生效——也就是说你设置的timeout:120根本没起作用,还是在用默认超时时间!这大概率是超时的主要原因。
正确的配置方式是把所有选项合并到一个哈希里:
Capybara.register_driver :poltergeist do |app| Capybara::Poltergeist::Driver.new(app, { debug: false, timeout: 120, js_errors: false }) end
2. 把所有sleep替换成Capybara智能等待
手动sleep是测试不稳定的元凶之一,Capybara本身自带智能等待机制,完全可以替代硬编码的等待时间:
- 登录后的
sleep(5)替换为expect(page).to have_content("Hi testsuperuser", wait: 10) - 高级搜索点击后的
sleep(5)替换为expect(page).to have_field('playerSearch[customerSearch][firstName]', wait: 10) - 等待"Processing request..."消失的循环可以简化为
expect(page).to have_no_content('Processing request...', wait: 15)
修改后的@player_is_found钩子示例:
Before('@player_is_found') do expect(page).to have_content("Hi testsuperuser", wait: 10) advanced_search = find('#playerSearch > div > div.pull-right > button.advanced-search.btn.btn-link.btn-small', wait: 10) advanced_search.click # 等待搜索表单加载完成 expect(page).to have_field('playerSearch[customerSearch][firstName]', wait: 10) fill_in 'playerSearch[customerSearch][firstName]', :with => $first_name fill_in 'playerSearch[customerSearch][surname]', :with => $last_name fill_in 'playerSearch[customerSearch][dateOfBirth]', :with => $date_of_birth click_on 'Search' # 等待处理提示消失 expect(page).to have_no_content('Processing request...', wait: 15) end
3. 优化会话管理,避免内存泄漏
无头模式下多次运行后,未彻底销毁的浏览器进程会占用大量内存,导致后续请求超时。你可以在After钩子中主动销毁Poltergeist进程:
After do |scenario| # 彻底销毁Poltergeist浏览器进程 if Capybara.current_driver == :poltergeist page.driver.quit end Capybara.current_driver = Capybara.default_driver Capybara.reset_sessions! end
另外,给@portal_page_is_open钩子设置最高优先级,确保每次打开登录页都是全新会话:
Before('@portal_page_is_open', :order => 0) do Capybara.reset_sessions! visit "#{$portal}/login" expect(page).to have_content("Log in", wait: 10) end
4. 其他调试手段
- 打开Poltergeist的
debug: true配置,查看页面加载的详细日志,定位到底是哪一步卡住了 - 给
visit方法显式增加等待时间:visit "#{$portal}/login", wait: 30 - 检查测试环境的网络稳定性,确保
http://test.com的响应速度正常,必要时增加测试环境的CPU/内存资源
内容的提问来源于stack exchange,提问作者CountDubular
相关产品推荐
相关产品推荐

