python+uiautomator2判断app是否进入到闪屏广告页面

发布时间 2023-06-13 19:16:05作者: Receiver
  • 前提背景:app内部存在多处广告,需要进行进行自动化:
    1. 查看app是否成功跳转了页面
    2. 页面是否空白
    3. 大致经历的耗时
  • 主要思路如下:点击前进行截图操作,点击后进行判断
  • 判断图片是否空白
    def is_blank(image_path, gray_value=250, threshold=0.9):
        """
        函数会计算一幅图像中超过250(在0到255的灰度值中,255代表白色)的像素的比例,
        如果这个比例超过了阈值(默认为0.05,即5%),那么就判断这幅图像为空白。
        :param image_path:
        :param gray_value:
        :param threshold:
        :return:
        """
    
        # 记录函数开始运行的时间
        # start_time = time.time()
    
        # 打开图像
        img = Image.open(image_path)
        # 将图像转换为灰度模式
        img = img.convert('L')
        # 将图像转换为numpy数组
        img_array = np.asarray(img)
        # 计算图像的总像素
        total_pixels = img_array.shape[0] * img_array.shape[1]
        # 计算图像中白色(或者接近白色)像素的数量
        white_pixels = np.sum(img_array > gray_value)
        # 如果图像中超过一定比例的像素是白色(或接近白色),则判断图像为空白
    
        # 记录函数结束运行的时间
        # end_time = time.time()
        # 计算并打印函数运行的总时间
        # elapsed_time = end_time - start_time
        # print(f"The function took {elapsed_time} seconds to complete.")
        return white_pixels / total_pixels > threshold
  • 图片比较是否相同
    def is_same_image(file1, file2, threshold=10):
        # 打开图片
        img1 = Image.open(file1)
        img2 = Image.open(file2)
    
        # 对比基本信息
        if img1.size != img2.size or img1.mode != img2.mode:
            return False
    
        # 对比像素信息
        for i in range(img1.size[0]):
            for j in range(img1.size[1]):
                p1 = img1.getpixel((i, j))
                p2 = img2.getpixel((i, j))
                diff = sum([abs(p1[k] - p2[k]) for k in range(3)])
                if diff > threshold:
                    return False
        # 两张图片一致
        return True
  • 最后删除图片
    def delete(image_path):
        """
        删除图片
        :param image_path:
        :return:
        """
        if os.path.isfile(image_path):
            os.remove(image_path)
            print('图片删除成功')
  • 获取当前app的activity
    def get_current_activity():
        """
        获取当前页面的activity
        :return:
        """
        cmd = 'adb -s {} shell "dumpsys window | grep mCurrentFocus"'.format(
            get_android_devices())
        activity_info = invoke(cmd).splitlines()
        log.info(activity_info)
        activity = str(activity_info[0]).split("/")[-1][:-1]
        log.info(activity)
        return activity
    

     

  • 完整代码
    import os
    from PIL import Image
    import numpy as np

    activity1 = get_current_activity() save_path = os.path.join(os.getcwd(), 'screenshots') # 保存截图的本地路径 if not os.path.exists(save_path): os.makedirs(save_path) screenshot_name = "闪屏点击前图片.png" screenshot_path1 = os.path.join(save_path, screenshot_name) # 图片保存路径 d.screenshot(screenshot_path1) if d(textContains='第三方应用').exists: d(textContains='第三方应用').click() else: assert False, "不存在对应按钮,需要重新载入新方法" start_time = time.time() time.sleep(3) # 截屏 screenshot_name = "闪屏.png" screenshot_path = os.path.join(save_path, screenshot_name) # 图片保存路径 d.screenshot(screenshot_path) for i in range(0, 3): if is_blank(screenshot_path): delete(screenshot_path) time.sleep(1) screenshot_name = "闪屏.png" screenshot_path = os.path.join(save_path, screenshot_name) # 图片保存路径 d.screenshot(screenshot_path) end_time = time.time() elapsed_time = end_time - start_time if i == 2: assert False, "经过{}秒,当前页面仍然空白".format(elapsed_time) else: delete(screenshot_path) end_time = time.time() elapsed_time = end_time - start_time print("经过{}秒,进入页面".format(elapsed_time)) break # 判断跳转到别的app screenshot_name = "闪屏点击后图片.png" screenshot_path2 = os.path.join(save_path, screenshot_name) # 图片保存路径 d.screenshot(screenshot_path2) if is_same_image(screenshot_path1, screenshot_path2): assert False, "没有跳转任何页面" else: if api.get_current_app() != 'xxx': print("跳转到别的app【{}】".format(api.get_current_app())) else: # 判断跳转到别的非首页的activity if get_current_activity() != activity1: print("跳转到当前app页面:【{}】".format(get_current_activity())) else: print("在app当前页面弹出框") d.app_start('xxx包','xx activity')

     即可进行闪屏点击,判断跳转进入的页面