Ruby on rails Rails:使用Capybara在多线程环境中浏览本地和远程页面
在Rails应用程序中,我使用Capybara和Poltergeist和PhantomJS对用户定义的各种URL进行快照,并保存这些快照以供以后比较。由于快照执行使用Sidekiq在后台工作,因此使用默认(全局)Capybara会话将导致争用条件错误,因此我编写了一个帮助器方法来初始化每个线程的新Capybara会话:Ruby on rails Rails:使用Capybara在多线程环境中浏览本地和远程页面,ruby-on-rails,multithreading,testing,capybara,phantomjs,Ruby On Rails,Multithreading,Testing,Capybara,Phantomjs,在Rails应用程序中,我使用Capybara和Poltergeist和PhantomJS对用户定义的各种URL进行快照,并保存这些快照以供以后比较。由于快照执行使用Sidekiq在后台工作,因此使用默认(全局)Capybara会话将导致争用条件错误,因此我编写了一个帮助器方法来初始化每个线程的新Capybara会话: def new_capybara_session # When using Capybara / PhantomJS in a threaded environment li
def new_capybara_session
# When using Capybara / PhantomJS in a threaded environment like Sidekiq,
# each job needs its own separate session to prevent race conditions and
# the consequent bizarre errors.
Capybara::Session.new(:poltergeist)
end
只要快照代码设置为独占使用这个新会话,只要URL是远程的,我就不会在同时拍摄多个快照时遇到问题
然而,在我的测试套件中,我通过访问一个本地URL(即从Chrome中,我将一些随机网页保存到/public/test\u sites/foo.html
等等)来练习这个快照代码。这些测试失败;tt证明我的新Capybara会话对象(使用上述方法初始化)无法加载本地URL,即使它可以加载远程URL。但是,如果我包含Capybara::DSL
并使用全局/默认Capybara会话对象,我可以很好地加载远程和本地URL
为什么会这样?使用手动创建的Capybara::Session对象时,如何加载本地URL?如果我不能做到这一点,我就不能为快照代码编写彻底的测试。请参阅。初始化Capybara::会话时,必须指定要使用的驱动程序,但也可以指定本地机架应用程序。后一个参数允许Capybara查找和加载本地URL。指定应用程序的最简单方法是使用Capybara.app
我将创建新Capybara会话的方法更改为以下内容,之后我可以加载本地URL和远程URL:
def new_capybara_session
# When using Capybara / PhantomJS in a threaded environment like Sidekiq,
# each job needs its own separate session to prevent race conditions and
# the consequent bizarre errors.
Capybara::Session.new(:poltergeist, Capybara.app)
end