diff --git a/doc/source/revent.rst b/doc/source/revent.rst index 8a0d8adc..8c843a74 100644 --- a/doc/source/revent.rst +++ b/doc/source/revent.rst @@ -246,7 +246,7 @@ definition.yaml file This defines each state of the workload and lists which templates are expected to be found and how many are required to be detected for a conclusive match. It also defines the expected state in each workload phase where a state detection -is run (currently those are setupComplete and runComplete). +is run (currently those are setup_complete and run_complete). Templates are picture elements to be matched in a screenshot. Each template mentioned in the definition file should be placed as a file with the same name @@ -260,7 +260,7 @@ understand the format. Note that more than just two states (for the afterSetup and afterRun phase) can be defined and this helps track the cause of errors in case an unexpected state is encountered. -.. code-block:: python +.. code-block:: yaml workload_name: angrybirds diff --git a/wlauto/commands/record.py b/wlauto/commands/record.py index 5b08a0a1..c7c3eabd 100644 --- a/wlauto/commands/record.py +++ b/wlauto/commands/record.py @@ -101,6 +101,8 @@ class RecordCommand(ReventCommand): self.parser.add_argument('-p', '--package', help='Package to launch before recording') self.parser.add_argument('-C', '--clear', help='Clear app cache before launching it', action="store_true") + self.parser.add_argument('-S', '--capture-screen', help='Record a screen capture after recording', + action="store_true") def run(self, args): if args.device: @@ -128,6 +130,9 @@ class RecordCommand(ReventCommand): self.logger.info("Press Enter when you have finished recording...") raw_input("") + if args.screencapture: + self.logger.info("Recording screen capture") + self.device.capture_screen(args.output or os.getcwdu()) self.device.killall("revent", signal.SIGTERM) self.logger.info("Waiting for revent to finish") while self.device.get_pids_of("revent"): diff --git a/wlauto/common/android/workload.py b/wlauto/common/android/workload.py index 4dc5e630..0441ce0f 100644 --- a/wlauto/common/android/workload.py +++ b/wlauto/common/android/workload.py @@ -240,7 +240,7 @@ class ApkWorkload(Workload): context.add_classifiers(apk_version=self.apk_version) if self.launch_main: - self.launch_package() # launch default activity without intent data + self.launch_package() # launch default activity without intent data self.device.execute('am kill-all') # kill all *background* activities self.device.clear_logcat() @@ -439,6 +439,7 @@ AndroidBenchmark = ApkWorkload # backward compatibility class ReventWorkload(Workload): + # pylint: disable=attribute-defined-outside-init def __init__(self, device, _call_super=True, **kwargs): if _call_super: @@ -452,7 +453,9 @@ class ReventWorkload(Workload): self.on_device_setup_revent = None self.on_device_run_revent = None self.statedefs_dir = None - self.check_states = None + + if self.check_states: + state_detector.check_match_state_dependencies() def setup(self, context): self.revent_setup_file = context.resolver.get(ReventFile(self, 'setup')) diff --git a/wlauto/utils/statedetect.py b/wlauto/utils/statedetect.py index 13463f61..94790659 100755 --- a/wlauto/utils/statedetect.py +++ b/wlauto/utils/statedetect.py @@ -40,6 +40,8 @@ try: except ImportError: imutils = None +from wlauto.exceptions import HostError + class StateDefinitionError(RuntimeError): pass @@ -58,10 +60,14 @@ def auto_canny(image, sigma=0.33): return edged +def check_match_state_dependencies(): + if np is None or cv2 is None or imutils is None: + raise HostError("State detection requires numpy, opencv (cv2) and imutils.") + + def match_state(screenshot_file, defpath, state_definitions): # pylint: disable=too-many-locals # check dependencies - if np is None or cv2 is None or imutils is None: - raise RuntimeError("State detection requires numpy, opencv (cv2) and imutils.") + check_match_state_dependencies() # check if file exists, then load screenshot into opencv and create edge map if not os.path.isfile(screenshot_file):