lib/xcmonkey/driver.rb in xcmonkey-0.3.0 vs lib/xcmonkey/driver.rb in xcmonkey-1.0.0

- old
+ new

@@ -1,20 +1,32 @@ class Driver - attr_accessor :udid, :bundle_id, :duration, :enable_simulator_keyboard + attr_accessor :udid, :bundle_id, :enable_simulator_keyboard, :session_duration, :session_path, :session_actions def initialize(params) self.udid = params[:udid] self.bundle_id = params[:bundle_id] - self.duration = params[:duration] + self.session_duration = params[:duration] + self.session_path = params[:session_path] self.enable_simulator_keyboard = params[:enable_simulator_keyboard] + self.session_actions = params[:session_actions] + @session = { params: params, actions: [] } ensure_driver_installed end + def monkey_test_precondition + ensure_device_exists + ensure_app_installed + terminate_app + open_home_screen(with_tracker: true) + launch_app + end + def monkey_test(gestures) + monkey_test_precondition app_elements = describe_ui.shuffle current_time = Time.now - while Time.now < current_time + duration + while Time.now < current_time + session_duration el1_coordinates = central_coordinates(app_elements.first) el2_coordinates = central_coordinates(app_elements.last) case gestures.sample when :precise_tap tap(coordinates: el1_coordinates) @@ -38,14 +50,37 @@ ) else next end app_elements = describe_ui.shuffle - Logger.error('App lost') if app_elements.include?(@home_tracker) + next unless app_elements.include?(@home_tracker) + + save_session + Logger.error('App lost') end + save_session end + def repeat_monkey_test + monkey_test_precondition + session_actions.each do |action| + case action['type'] + when 'tap' + tap(coordinates: { x: action['x'], y: action['y'] }) + when 'press' + press(coordinates: { x: action['x'], y: action['y'] }, duration: action['duration']) + when 'swipe' + swipe( + start_coordinates: { x: action['x'], y: action['y'] }, + end_coordinates: { x: action['endX'], y: action['endY'] }, + duration: action['duration'] + ) + end + Logger.error('App lost') if describe_ui.shuffle.include?(@home_tracker) + end + end + def open_home_screen(with_tracker: false) `idb ui button --udid #{udid} HOME` detect_home_unique_element if with_tracker end @@ -111,23 +146,35 @@ `idb list-apps --udid #{udid}` end def tap(coordinates:) Logger.info('Tap:', payload: JSON.pretty_generate(coordinates)) + @session[:actions] << { type: :tap, x: coordinates[:x], y: coordinates[:y] } unless session_actions `idb ui tap --udid #{udid} #{coordinates[:x]} #{coordinates[:y]}` end def press(coordinates:, duration:) Logger.info("Press (#{duration}s):", payload: JSON.pretty_generate(coordinates)) + @session[:actions] << { type: :press, x: coordinates[:x], y: coordinates[:y], duration: duration } unless session_actions `idb ui tap --udid #{udid} --duration #{duration} #{coordinates[:x]} #{coordinates[:y]}` end def swipe(start_coordinates:, end_coordinates:, duration:) Logger.info( "Swipe (#{duration}s):", payload: "#{JSON.pretty_generate(start_coordinates)} => #{JSON.pretty_generate(end_coordinates)}" ) + unless session_actions + @session[:actions] << { + type: :swipe, + x: start_coordinates[:x], + y: start_coordinates[:y], + endX: end_coordinates[:x], + endY: end_coordinates[:y], + duration: duration + } + end coordinates = "#{start_coordinates[:x]} #{start_coordinates[:y]} #{end_coordinates[:x]} #{end_coordinates[:y]}" `idb ui swipe --udid #{udid} --duration #{duration} #{coordinates}` end def central_coordinates(element) @@ -164,9 +211,13 @@ rand(0.1..0.7).ceil(1) end def press_duration rand(0.5..1.5).ceil(1) + end + + def save_session + File.write("#{session_path}/xcmonkey-session.json", JSON.pretty_generate(@session)) end private def ensure_driver_installed