Starting from AndroidViewClient v4.0.0, monkeyrunner was ditched in favor of plain good old python. This change brought massive speed improvements in running tests as it was described in AndroidViewClient/culebra version 4.0.0: now 100% pure python, and takeSnapshot() is not an exception.
In order to measure the improvement, 2 scripts were added to the examples, one taking a screenshot using MonkeyDevice.takeSnapshot() and the orher using the alternative AdbClient.takeSnapshot(). As with other functionality, the API is maintained so changes to existing scripts are unnecessary or just minimum.
The script taking the screenshot of the device or emulator using monkeyrunner.
#! /usr/bin/env monkeyrunner ''' Copyright (C) 2012 Diego Torres Milano Created on Set 5, 2013 @author: diego ''' import sys import os from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice if len(sys.argv) < 2: print >> sys.stderr, "usage: %s filename.png" % sys.argv sys.exit(1) filename = sys.argv.pop(1) device = MonkeyRunner.waitForConnection() device.takeSnapshot().writeToFile(filename, 'PNG')
The script taking the screenshot of the device or emulator using python.
#! /usr/bin/env python ''' Copyright (C) 2012 Diego Torres Milano Created on Aug 31, 2013 @author: diego ''' import sys import os from com.dtmilano.android.viewclient import ViewClient if len(sys.argv) < 2: sys.exit("usage: %s filename.png [serialno]" % sys.argv) filename = sys.argv.pop(1) device, serialno = ViewClient.connectToDeviceOrExit(verbose=False) device.takeSnapshot().save(filename, 'PNG')
resultsBoth scripts were run to take the screenshot of a Nexus 4 (android api-18) home screen.
As you may have been anticipating, the python script run much faster and this is illustrated in the following chart.
Something to take into account is that both script are almost the same, except for some improvements that are supported only by AndroidViewClient, like the possibility of requesting a verbose connection or specifying the device serial number in the command line.
Also, notice that instead of writeToFile() like MonkeyImage does, save() is used. This is because AdbClient.takeSnapshot() returns a real PIL Image and not a wrapper.
Hope you enjoyed the changes.
If you have any question or comments just post it on Google+ or Stackoverflow.