You should be able to drop this into your Cucumber 'hooks' directory, and the magic video-record-on-failure will kick in.
On Mac, this needs https://gist.github.com/sleekweasel/1aee7b339f3f6319dda0 too.
You should be able to drop this into your Cucumber 'hooks' directory, and the magic video-record-on-failure will kick in.
On Mac, this needs https://gist.github.com/sleekweasel/1aee7b339f3f6319dda0 too.
| require 'open3' | |
| require 'timeout' | |
| require 'process' | |
| def video_file(infix, ext = 'mp4') | |
| "video_#{infix}.#{ext}" | |
| end | |
| capture_video = (ENV['CAPTURE_VIDEO'] || 'failure').downcase | |
| class ScreenRecord | |
| @@set = false | |
| @@screenrecord = nil | |
| def self.cmd | |
| return @@screenrecord if @@set | |
| out = Open3.capture2e("#{adb_command} shell screenrecord --help") | |
| @@set = true | |
| @@screenrecord = | |
| case out | |
| when /--bugreport/ | |
| 'screenrecord --bugreport' | |
| when /not found/ | |
| nil | |
| else | |
| 'screenrecord' | |
| end | |
| end | |
| end | |
| class AndroidVideoCapture | |
| def start_capture(_embedder) | |
| if ScreenRecord.cmd | |
| @video_file = video_file(Time.now.strftime('%H%M%S')) | |
| @screenrecord = Open3.popen2e("#{adb_command} shell") | |
| @screenrecord[0] << "rm -rf /sdcard/#{video_file('*')}\n" | |
| @screenrecord[0] << "#{ScreenRecord.cmd} --verbose --bit-rate 100000 /sdcard/#{@video_file} &\n" | |
| @screenrecord[0] << "CPID=$!\n" | |
| end | |
| end | |
| def stop_capture(_embedder) | |
| @screenrecord[0] << "if ps | grep screenrecord | grep $CPID; then kill -2 $CPID ; fi\n" | |
| @screenrecord[0] << "while ps | grep screenrecord | grep $CPID ; do sleep 1; done; exit\n" | |
| begin | |
| Timeout.timeout(5) { @screenrecord[2].value } | |
| rescue Timeout::Error | |
| Process.detach(@screenrecord[2].pid) | |
| end | |
| File.open("#{@video_file}.log", 'w') { |f| f << @screenrecord[1].readlines.join("\n") } | |
| @screenrecord[0].close | |
| @screenrecord[1].close | |
| end | |
| def acquire_capture(embedder) | |
| system "#{adb_command} pull /sdcard/#{@video_file} ." | |
| if File.exist?(@video_file) | |
| embedder.embed(@video_file, 'video/mp4', "video #{@video_file}") | |
| # embed("#{@video_file}.log", 'text/plain', 'capture log') | |
| end | |
| end | |
| def dispose_capture(_embedder) | |
| File.delete("#{@video_file}.log") | |
| end | |
| end | |
| class MacQuickTimeCapture | |
| # http://www.paulcalnan.com/archives/2014/10/quicktime-screen-recording-of-a-single-window.html | |
| def start_capture(_embedder) | |
| %x( osascript #{File.dirname(__FILE__)}/hooks_video_ios/videocapture.scpt start Simulator 1 #{File.dirname(__FILE__)}/hooks_video_ios/clickdrag ) | |
| end | |
| def stop_capture(_embedder) | |
| end | |
| def acquire_capture(embedder) | |
| @video_base = video_file(Time.now.strftime('%H%M%S'), '') | |
| # Sandboxing requires saving to somewhere official first. As if someone couldn't move it afterwards. Duh. | |
| qtpxcomp = "#{ENV['HOME']}/Movies/#{@video_base}qtpxcomposition" | |
| %x( osascript #{File.dirname(__FILE__)}/hooks_video_ios/videocapture.scpt save #{qtpxcomp} ) | |
| qtpxmovie = "#{qtpxcomp}/Screen Recording.mov" | |
| if File.exist?(qtpxmovie) | |
| FileUtils.mv(qtpxmovie, "#{@video_base}mov") | |
| embedder.embed("#{@video_base}mov", 'video/mp4', "Movie #{@video_base}mov") | |
| end | |
| end | |
| def dispose_capture(_embedder) | |
| %x( osascript #{File.dirname(__FILE__)}/hooks_video_ios/videocapture.scpt stop ) | |
| end | |
| end | |
| Before do | |
| @video_capture = nil | |
| if capture_video != 'never' | |
| @video_capture = case | |
| when OS == ANDROID | |
| AndroidVideoCapture.new | |
| when OS == IOS && ENV['IOS_VIDEO_CAPTURE'] == 'quicktime' | |
| MacQuickTimeCapture.new | |
| # else | |
| # nil # Pending TightVNC patches. | |
| end | |
| @video_capture.start_capture(self) if @video_capture | |
| end | |
| end | |
| After do |scenario| | |
| unless @video_capture.nil? | |
| @video_capture.stop_capture(self) | |
| if scenario.failed? || scenario.source_tag_names.include?('@capture_video') || capture_video == 'always' | |
| @video_capture.acquire_capture(self) | |
| else | |
| @video_capture.dispose_capture(self) | |
| end | |
| end | |
| end |
Hello,
I saw your code and try execute my cucumber scenario recording, but i got this error:
Failed to open TCP connection to 127.0.0.1:4723 (No connection could be made because the target machine actively refused it. - connect(2) for "127.0.0.1" port 4723) (Errno::ECONNREFUSED)
You have any idea the reason of this?
Thanks for help and sorry for bad english :/