• Selenium实现录屏的一种方法


    由于UI层自动化的不稳定性,经常会遇到执行中断或用例失败的问题,以下是一些常见的措施。

    1. 详细的日志
    2. 定位出错时截图
    3. Pytest的缓存机制(可以记录成功了哪些失败了哪些)
    4. 自动重试机制(如pytest-rerunfailures)
    5. 用例录像

    用例录像是最直观的一种方式,可以查看到实时的操作情况。很多云平台如Saucelabs等都提供了用例录像的功能。
    然而很遗憾selenium本身没有这种能力。除了借助三方软件如ffmpeg同步录屏外,另外一种实现方法是另外启动一个线程,不断截图,最后将图片拼接成git。
    操作方法如下。

    实时截图

    1. 编写一个循环截图函数shot
    def shot(dr):
        i = 0
        while True:
            img_file = os.path.join(img_dir, f'{i}.png')
            try:
                dr.save_screenshot(img_file)
            except:
                return
            i += 1
    

    由于webdriver接口执行截图命令的速度限制,每一轮截图无需再sleep。
    2. 操作web时,启动一个线程

    img_dir = 'img'  # 临时图片目录
    dr = webdriver.Chrome()
    
    t = threading.Thread(target=shot, args=(dr, img_dir))  # 新建线程
    t.start()  # 启动截图线程
    
    dr.get('https://www.baidu.com')
    dr.find_element('id', 'kw').send_keys('简书 韩志超')
    dr.find_element('id', 'su').click()
    time.sleep(1)
    dr.get('https://www.qq.com')
    dr.back()
    time.sleep(2)
    dr.quit()
    
    1. 图片拼接成gif

    需要安装pillow: pip install pillow

    img_list = os.listdir(img_dir)  # 列出目录所有图片
    img_list.sort(key=lambda x: int(x[:-4]))  # 排序
    
    first_img = Image.open(os.path.join(img_dir, img_list[0]))  # 第一张图片对象
    else_imgs = [Image.open(os.path.join(img_dir, img)) for img in img_list[1:]]  # 剩余图片对象
    
    first_img.save("record.gif", append_images=else_imgs,
                   duration=300,
                   save_all=True) # 拼接保存
    

    完整代码

    from selenium import webdriver
    import threading
    import os
    import time
    from PIL import Image
    
    
    def clear_dir(path):
        """创建或清空目录"""
        if not os.path.isdir(path):
            os.mkdir(path)  # 创建目录
        else:  # 清空目录
            [os.remove(os.path.join(path, file_name)) for file_name in os.listdir(path)]
    
    
    def shot(dr, img_dir):
        """循环截图函数"""
        i = 0
        clear_dir(img_dir)  # 清空目录
        while True:
            img_file = os.path.join(img_dir, f'{i}.png')
            try:
                dr.save_screenshot(img_file)
            except:
                return
            i += 1
    
    
    # Selenium操作
    img_dir = 'img'  # 临时图片目录
    dr = webdriver.Chrome()
    
    t = threading.Thread(target=shot, args=(dr, img_dir))  # 新建线程
    t.start()  # 启动截图线程
    
    dr.get('https://www.baidu.com')
    dr.find_element('id', 'kw').send_keys('简书 韩志超')
    dr.find_element('id', 'su').click()
    time.sleep(1)
    dr.get('https://www.qq.com')
    dr.back()
    time.sleep(2)
    dr.quit()
    
    # 图片拼接成gif
    img_list = os.listdir(img_dir)  # 列出目录所有图片
    img_list.sort(key=lambda x: int(x[:-4]))  # 排序
    
    first_img = Image.open(os.path.join(img_dir, img_list[0]))  # 第一张图片对象
    else_imgs = [Image.open(os.path.join(img_dir, img)) for img in img_list[1:]]  # 剩余图片对象
    
    first_img.save("record.gif", append_images=else_imgs,
                   duration=300,  # 每张图片的过过渡时间
                   save_all=True) # 拼接保存,如果想要循环播放可以加上loop=0
    
    

    最终效果--有点像幻灯片

  • 相关阅读:
    Eureka获取服务列表源码解析
    Eureka客户端续约及服务端过期租约清理源码解析
    Eureka应用注册与集群数据同步源码解析
    Eureka重要对象简介
    EurekaClient自动装配及启动流程解析
    idea2019注册码
    EurekaServer自动装配及启动流程解析
    程序员的算法课(5)-动态规划算法
    程序员的算法课(4)-二分查找
    程序员的算法课(3)-递归(recursion)算法
  • 原文地址:https://www.cnblogs.com/superhin/p/13857521.html
Copyright © 2020-2023  润新知