2014-03-24 33 views
1

我有一个Android应用程序,我想自动化/压力测试。 我在SCAR Divi 中制作了基于图像的自动化脚本,并针对安装在Bluestack上的应用运行它。 我想把它改成Genymotion,因为Bluestacks太慢了。Android的monkeyrunner - 检查屏幕是否包含图像或特定颜色

我已经有环境设置 (genymotion +图像与我的应用程序+ adb安装和工作)。 我在python中重写了我的脚本并在MonkeyRunner中使用它,但是...

除了发送手势,点击和等待, 我缺少图像识别功能。 我发现我可以用ImageMagic比较2个屏幕截图,但那不是我所需要的。

我需要检查某个按钮,或至少是否在屏幕上显示特定颜色。 任何人都可以指出我正确的方向吗?

我会的一些例子:(

回答

5

MonkeyRunner确实提供相当不错的基于图像的测试方法。下面我将向您展示如何从设备当前显示的屏幕上拍摄子图像。然后,你可以保存这个子图像和/或与参考图像

首先比较你需要把你的设备的当前屏幕截图

# Take a screenshot 
image = device.takeSnapshot() 

,那么你可以采取分图片。例如,该子图像可以是某个屏幕上的按钮,以验证该屏幕上是否存在该按钮。为了能够做到这一点,你可以使用下面的方法。下面的元组(0,0,50,100)只是一个例子。你应该提供你自己的。基本上它是(x,y,w,h)所需的子图像。

# Take the sub-image 
sub_image = image.getSubImage((0, 0, 50, 100)) 

该步骤之后,您可以保存图像和/或与参考图像比较。要与参考图像进行比较,您可以按如下所示进行比较:

# Load the reference image for comparison 
reference = MonkeyImage.loadFromFile(PATH_TO_REFERENCE_IMAGE) 

if not sub_image.sameAs(reference, 0.9): 
     print "Images do not match!" 
     # do something 

0.9是验收等级。如果两张图片匹配达到90%或以上,则会被视为已通过

希望这有助于您。如果遇到任何问题,请告诉我!

+0

你好gbudan。非常感谢您的答复。这很好,但前提是您要检查指定坐标的特定正方形是否与参考图像相同。我一定会用它来检查静态元素(比如按钮)。但是,我还需要检查某个位图(或至少某种颜色)是否为该屏幕截图的一部分,并且可以将其放置在任何位置。 – user2192002

+0

Ok @ user2192002,在这种情况下,您可以使用'getRawPixelInt(x,y)'方法。假设您正在寻找可以在屏幕上任何位置的**黄色**颜色线。为了简化,假设这条线是水平的,其宽度与屏幕宽度相同。所以,你可以做的是,首先做一个截图,然后从这个截图一次一个像素地从屏幕的顶部一直到底部的一个while循环。当'getRawPixelInt(x,y)'方法找到一个黄色像素时,这意味着你已经找到了该行的位置。您也可以为其他情况实施相同的逻辑。 – gbudan

+0

非常感谢您的回复gbudan。我会在星期一尝试实施和测试! – user2192002

0

AndroidViewClient可以获取整个屏幕或特定视图的截图真的很感激。这些屏幕快照通常写入使用文件

View.writeImageToFile(self, filename, format="PNG") 

但是,如果你有兴趣在获取原始图像的对象,这是一个PIL Image(见http://www.pythonware.com/products/pil/),你可以做

image = device.takeSnapshot() 

,然后根据您的需要使用库中的可用methods and tools对其进行操作或分析。

+0

因此...在伪代码中... 1.将图像保存到文件2.使用im.getcolors(maxcolors)获取图像3中所有颜色的列表。遍历列表来查找特定的颜色。这是一种解决方法,我敢打赌它会很慢。我仍在寻找一种方法来检查某个较大的图像是否由较小的预定义图像组成(如按钮)。 – user2192002

+0

正如我所提到的,您不必保存文件,因为您可以获取“Image”对象,并且可以为单个“View”(即“Button”)获取该“Image”。 –

相关问题