• 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
    
    

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

  • 相关阅读:
    java忽略安全警告注解@SuppressWarnings
    spring data jpa 报for input String "id"错误解决
    spring Data Jpa 报错 failed to lazily initialize a collection of role: com.itheim.pojo.Role.users, could not initialize proxy
    记一次Content type 'application/json;charset=UTF-8' not supported解决方案
    包冲突异常 loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFacto
    Java运算符(&)、(|)、(^)、(~)
    Java中的原码、补码、反码
    vim编辑器
    Linux yum、tar、rpm、zip、gzip命令的使用
    error Couldn't find a package.json file in
  • 原文地址:https://www.cnblogs.com/superhin/p/13857521.html
Copyright © 2020-2023  润新知