ATX 使用 ATX 判断单选框选中状态、开关状态、图标类型

Mr.武 · 2020年12月21日 · 1492 次阅读

测试新人记录一下尝试解决单选框选中状态、开关状态、图标类型判断的经历

需求

使用 ATX 做自动化测试过程中遇到问题,该如何判断单选框是否选中、开关状态、图标类型呢?

尝试一

通过对比选中与未选中的单选框属性,发现选中与未选中没有属性发生变化,通过属性无法判断

尝试二

翻阅了 ATX 官方文档发现有个Image match,图像匹配功能,需要提供一张图片,match 会返回一个 similarity 值,在使用点击等事件
d.image.click(imdata, timeout=20.0)时,会轮询查找图片,如果 similarity>0.9 则认为匹配成功,进行点击等操作。
尝试过程中遇到问题:无论单选框是否选中 similarity 都大于 0.9(可能是图像识别不够精确所导致的问题?),所以认为此方法无法判断

尝试三

既然 ATX 的方法行不通,那我能不能自己写一个方法呢?

百度查了一下有几种图片对比方法,虽然看不懂,但是可以拿来用:
值哈希算法
差值哈希算法
感知哈希算法
余弦相似度

思路 1:取一张预期图片 (即未选中单选框的图片),使用 ATX 元素截图方法截取实际图片,使用图片对比方法把预期图片和实际图片进行对比,查看对比结果值,如果该值大于某个特定值 (经过多次图片对比测试得出的一个值) 则认为未选中,反之选中
尝试 1:经过测试发现找不到一个特定的值(使用哈希算法得到的两个值可能对比结果正好是相反的,感觉不够精确,不知道是不是方法不对),而且列表中两个相同的单选框截出来的图片是不一样的,不知道为什么,所以尝试了第二个思路。

思路 2:取两张预期图片 (一张选中单选框的图片,一张未选中单选框的图片),使用 ATX 元素截图方法截取实际图片,使用图片对比方法分别将实际图片和选中单选框图片、未选中单选框图片进行对比,分别得到两个结果 A、B,两个结果进行对比,如果 A>B 则认为单选框为选中状态,反之则为未选中状态。

使用哈希值得到返回值的是一个整数,存在两个结果为相同值的情况(两个对比结果可能都为 14),所以最后使用余弦距离进行对比,具体实现原理不清楚,但是可以得知余弦距离越大,图片相似度越高。
参考链接:https://blog.csdn.net/weixin_39121325/article/details/84187453

代码如下:

百度查到的通过计算余弦距离来判断两张图片的相似度

# 对图片进行统一化处理
    def get_thum(self, image, size=(64, 64), greyscale=False):
        # 利用image对图像大小重新设置, Image.ANTIALIAS为高质量的
        image = image.resize(size, Image.ANTIALIAS)
        if greyscale:
            # 将图片转换为L模式,其为灰度图,其每个像素用8个bit表示
            image = image.convert('L')
        return image

    # 计算图片的余弦距离
    def image_similarity_vectors_via_numpy(self, image1, image2):
        image1 = self.get_thum(image1)
        image2 = self.get_thum(image2)
        images = [image1, image2]
        vectors = []
        norms = []
        for image in images:
            vector = []
            for pixel_tuple in image.getdata():
                vector.append(average(pixel_tuple))
            vectors.append(vector)
            # linalg=linear(线性)+algebra(代数),norm则表示范数
            # 求图片的范数??
            norms.append(linalg.norm(vector, 2))
        a, b = vectors
        a_norm, b_norm = norms
        # dot返回的是点积,对二维数组(矩阵)进行计算
        res = dot(a / a_norm, b / b_norm)
        return res
  • 判断单选框是否选中,需要三张图片,预期未选中图片、预期选中图片、实际截图,如果预期未选中图片和实际截图对比结果>预期选中图片和实际截图对比结果,则认为未选中单选框返回 False,反之则选中返回 True,开关按钮同理 选中单选框图片 未选中单选框图片
# 判断是否选中
def judge_choose(self, no_choose, choose, practical):
    '''
    判断是否选中单选框
    :param no_choose:
    :param choose:
    :param practical:
    :return: False:未选中,True:选中
    '''
    no_choose = Image.open(no_choose)
    choose = Image.open(choose)
    pr = Image.open(practical)
    no_choose_con_result = self.image_similarity_vectors_via_numpy(no_choose, pr)
    choose_con_result = self.image_similarity_vectors_via_numpy(choose, pr)
    if no_choose_con_result > choose_con_result:
        result = False
    else:
        result = True
    return result
  • 判断图标类型和判断单选框是一样的,需要多张图片对比,然后取出对比结果的最大值即可,单选框其实也可以这么做,后面可以写成一个通用的方法
# 判断未接,已接,已拨,转移,录音的图标状态
def judge_choose_icon(self, missed, received, dialled, tansfer, icon):
    '''
    判断未接,已接,已拨,转移,录音的图标状态
    '''
    missed = Image.open(missed)
    received = Image.open(received)
    dialled = Image.open(dialled)
    tansfer = Image.open(tansfer)
    icon = Image.open(icon)
    missed_con_result = self.image_similarity_vectors_via_numpy(missed, icon)
    received_con_result = self.image_similarity_vectors_via_numpy(received, icon)
    dialled_con_result = self.image_similarity_vectors_via_numpy(dialled, icon)
    tansfer_con_result = self.image_similarity_vectors_via_numpy(tansfer, icon)
    dic = {"未接": missed_con_result, "已接": received_con_result, "已拨": dialled_con_result, "转移": tansfer_con_result}
    new_max_dic = sorted(dic.items(), key=operator.itemgetter(1), reverse=True)
    max_dic=new_max_dic[0][0]
    return max_dic

总结

我们测试近期由手工测试向自动化测试方面转型,因为我们做的是智能电话,大部分都是单机应用,很少有需要连网的,所以没有那些 http 的接口,目前能做的也只有功能自动化测试,本来是由平台部经理负责自动化团队(经验丰富,测试、开发都比较熟悉),因为平台最近项目比较多,所以这件事情落到了我的头上,之前平台做了一些基础功能,后来接手过来之后重写了测试平台,优化已有的测试框架,内部培养功能测试向自动化测试转型。期间遇到各种困难,包括框架的限制,测试工具的限制,自动化测试团队管理的问题,现在也在一一解决,也在向着积极的方向发展。遇到困难并不可怕,可怕的是不敢去面对困难。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册