vlambda博客
学习文章列表

AppUI自动化中的图像识别的使用

     人工智能现在使用的越来越成熟了,如人脸识别,图像识别等,在AppUI自动化测试中,也有越来越多的框架或是公司引入图像识别技术来提高自动化测试的执行效率。图像识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术,是应用深度学习算法的一种实践应用。 现阶段图像识别技术一般分为人脸识别与商品识别,人脸识别主要运用在安全检查、身份核验与移动支付中;商品识别主要运用在商品流通过程中,特别是无人货架、智能零售柜等无人零售领域 。

        图像的传统识别流程分为四个步骤:图像采集→图像预处理→特征提取→图像识别。图像识别软件国外代表的有康耐视等,国内代表的有图智能、海深科技等。另外在地理学中指将遥感图像进行分类的技术。

一,测试框架中的图像识别

     在我们做 App 自动化测试的时候,会发现很多场景下元素没有 id、content-desc、text 等等属性,并且有可能也会碰到由于开发采用的是自定义 View,View 中的元素也无法识别到,很多的自动化测试框架对此类场景束手无策。Appium 在 V1.9.0 中有给我们带来了针对于图像识别的全新图片元素定位的方法:-image

具体使用方法可以参考:http://testingpai.com/article/1597824416789

      如果是公司自己做二次开发的自动化测试框架,可以根据业务需要自行集成图像识别功能,方便在做AppUI自动化测试时,提高测试效率。

二,收费的图像识别服务

       现在越来越多的公司都提供了云服务,在服务的产品当中,都有图像识别服务,如下所示:


当前提供图像识别服务的云有:

  • 百度云:https://cloud.baidu.com/solution/aiplatform/index.html

  • 阿里云:https://ai.aliyun.com/image?utm_content=se_1006839984

  • 腾讯云:https://cloud.tencent.com/product/generalocr

  • 商汤图像识别:https://www.sensetime.com/cn/technology-detail?categoryId=30

      当你们公司需要引入图像识别服务,来提高AppUI自动化测试效率时,就需要购买相应的服务。当得到对应的Key后,就可以通过调用相应的API来处理图像识别需求,结合AppUI自动化测试框架,处理自动化实施过程中传统框架无法操作的元素识别等操作。

三,APPUI中如何引用图像识别

      在做APPUI自动化测试时,常规的做法就是:

   (1)引入自动化测试框架,如Appium;

  (2)借助于编码语言,通过对App元素的属性,如resouce_id, Xpath, text等属性定位要操作的元素;

  (3)根据测试用例的需求,对相应的元素做指定的操作,如:click,send_keys等。

     但在自动化测试执行过程中,就会遇到各种问题,如:

(1)被测试App元素属性有变化,属性被开发修改,打包的时候代码混淆从而造成测试用例必须进行维护;

(2)测试用例执行完成,需要检测的内容较多,定位检测元素效率比较低等。

(3)被测App无法获取元素属性,传统定位方法无法定位;

(4)App测试中唤起其他的应用,造成driver需要切换等。

    为了解决这样的问题,引入图像识别方法是最优的解决方案,而图像识别解决的App通用操作有:

1,获取页面所有元素,检测需要操作的元素

通过图像识别功能,先将用例执行到需要操作的页面;对当前页面进行截屏,然后调用图像识别功能,识别出当前页面上的所有元素。接下来需要过滤出要操作的页面元素,如,通过元素上的文字筛选元素;通过元素类别,如image,button来区分元素;通过位置来筛选元素,如:元素在屏幕右上角,则判断元素的位置,x大于屏幕的一半,y小于屏幕的三分之一就是要查找的元素。找到要操作的元素后,执行需要的操作即可。

2,通过元素文字操作元素

一个应用无论从元素属性,还是打包混淆来影响自动化测试,但是元素显示的文字内容变化的频率是相对来说要小的多。如果能通过元素的文案来操作元素,将是不错的选择。我们借助于图像识别法,可以识别出元素对应的文字所在的位置,然后使用driver.click(x,y),就可以单击相应位置的元素。此方法可以执行单击元素操作,当然也可以对输入框输入内容。如果对输入框输入内容的话,先单击这个输入框,让其处于激活状态,然后使用driver.sendKeys()输入内容。

3,检测测试结果

    当一个测试用例执行完成后,需要检测一下用例的执行情况。此时可以通过封装函数,获取当前页面的所有文字信息,然后检测用例执行效果的关键文字,是否在当前页面?如果在,则认为当前用例执行通过,如果不在则用例执行失败。

    当然,如果用例关注的检测点较多,或是关注页面布局,图片信息等,则可以采取图像对比法。我们截取标准的页面显示,然后在执行完用例后,保存当前页面与标准页面做对比,设置相似度,如99%为测试通过,否则为测试失败。但是此方法有一定的问题,不能做兼容性测试,不同的设备显示的内容是不一样的。

4,封装业务操作

    在完成了上面的基本元素的图像操作后,就可以根据你要测试的产品的业务逻辑,封装一定的业务函数,从而提高代码的通过性。如下:美团众包的图像识别法进入接单设置功能函数:

/**

* 进入接单设置页

*/

public void enterOrderSetting()

{

   if(!checkEleByText("刷新列表"))

   {

       startWork();

   }

   Utils.sleep(3000);

   clickByText("接单设置");

   //处理首次进入的提醒

   if(checkEleByText("知道了"))

   {

       clickByText("知道了");

   }

   System.out.println("进入接单设置页....");

  Utils.sleep(3000);

   driver.back();

}

四,AppUI图像识别法使用注意事项

      图像识别法虽然可以解决不少AppUI自动化存在的问题,但是我们也需要知道其劣势,合理地与传统的自动化测试框架配合,从而才能达到使我们的自动化测试工程执行效率最好,发挥最佳的使用用。

1,图像识别的效率消耗

在引用语言,框架的图像识别法时,需要先将当前页面进行截图,然后分析图像上的元素,文案信息。无论是什么图像识别算法,都是有一定的效率消耗的,所以不能在测试用例中反复引用图像识别法,要根据业务操作,安排好执行策略,提高效率。

2,图像识别的网络消耗

     如果使用的是第三方提供的图像识别服务,识别效率比我们自己的会高一些,但是就会有相应的网络请求。过多的网络请求,也会影响自动化测试的执行效率,同时开通的服务是按次收费的,如果测试安排的不合理,网络和金钱的消耗会非常多。

3,合理结合传统框架与图像识别

在实施AppUI自动化测试时,先分析产品的情况,如果产品变化较小,元素属性清晰,建议首先选择通过元素属性进行定位,如resouce_id。针对元素属性变化较多,页面无法抓取属性(竞对产品),H5页面,跨App的操作,检测元素内容较多,检测对象是图片等情况,就引入图像识别法解决相应的问题。

五,总结

  本文介绍了如何在AppUI自动化测试中使用图像识别法,此方法可以降低测试的维护成本,提高测试用例的执行效率。当然,也有一定的限制,可以根据公司的需要,可使用的资源来合理规划你的自动化测试架构设计,将AppUI自动化真正地在业务中使用起来,发挥其有的使用。