缘起

前天同桌妹纸问一个控件怎么定位的问题,我张口就来,ID,xpath。。。。。妹纸说这些我都试过了,还是无法定位,不信我 Debug 给你看。N 种方法尝试后,只能接受现实,非原生控件,于是老脸一红,告诉妹纸,这是非原生控件,无法通过常规方式定位。搜索了一下,很多帖子都反映过这个问题,但是都没给出解决策略。不知道这些小伙伴最终有没有解决。遂决定,吃个大闸蟹,研究一下看能否解决。

非原生控件给自动化带来的痛点

常规解决方式

图像识别尝试

由于我们页面控件不会像验证码那么多干扰难识别,现在图形识别技术 Java,Python,C++ 等都非常成熟。一通百度后在 OpenCV 发现了 matchTemplate 方法,在图片中找指定的图片。主要用的以下两种方法:

具体实现

  1. 截取图

    1. 滑动到非原生控件,使元素可见
    2. 截取截目画面即为原图像
    3. 用画图工具打开原图像(不要人为放大或者缩小原图像),截取非原生控件的图像即为模板图像
    4. 原图像:
    5. 如下用画图工具打开,保证分别率不变下截取目标图像作为模板图像
    6. 模板图像(非原生控件图像)
  2. 取坐标

    1. 执行 OpenCV 函数 matchTemplate 获取坐标
    2. 为方便公司同事和社区伸手党使用,直接上码 LvmamaKit 代码工程 Git 传送门,调用 LvmamaKit.find2BElementPoint4Debug 会在原图像上标识出是否匹配成功
    3. 第二步成功后,调用 LvmamaKit.find2BElementPoint 返回 Json 格式坐标
    4. 回显示意图,忽略图片失真 5.返回坐标,自行计算出中心坐标 {"x":"309","y":"854","width":"105","height":"82"}
  3. 点坐标

    1. 拷贝返回的坐标,进行相对计算
    2. 点击相对坐标,完成你的自动化用例
  4. 识别密码
    1.密码键盘,1-9 随机变,图像识别妥妥的搞定。 示意图

  5. 搞定收工

    1. 明天可以给妹子解决非原生控件的定位问题咯

参考资料


↙↙↙阅读原文可查看相关链接,并与作者交流