Record video with Xvfb + FFmpeg using Selenium in headless mode

45 Views Asked by At

I am trying to record video using Selenium in headless mode. I am using Xvfb and FFmpeg bindings for Python. I've already tried:

import subprocess
import threading
import time

from chromedriver_py import binary_path
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from xvfbwrapper import Xvfb


def record_video(xvfb_width, xvfb_height, xvfb_screen_num):
    subprocess.call(
        [
            'ffmpeg',
            '-f',
            'x11grab',
            '-video_size',
            f'{xvfb_width}x{xvfb_height}',
            '-i',
            xvfb_screen_num,
            '-codec:v',
            'libx264',
            '-r',
            '12',
            'videos/video.mp4',
        ]
    )


with Xvfb() as xvfb:
    '''
    xvfb.xvfb_cmd[1]) returns scren num
    :217295622
    :319294854
    :<generated_dynamically>
    '''
    xvfb_width, xvfb_height, xvfb_screen_num = xvfb.width, xvfb.height, xvfb.xvfb_cmd[1]
    thread = threading.Thread(target=record_video, args=(xvfb_width, xvfb_height, xvfb_screen_num))
    thread.start()
    opts = webdriver.ChromeOptions()
    opts.add_argument('--headless')
    try:
        driver = webdriver.Chrome(service=Service(executable_path=binary_path), options=opts)
    finally:
        driver.close()
        driver.quit()

As much as I understand xvfb.xvfb_cmd[1] returns an information about virtual display isn't it ? When I executed this script, I got the error message:

[x11grab @ 0x5e039cfe2280] Failed to query xcb pointer0.00 bitrate=N/A speed=N/A    
:1379911620: Generic error in an external library

I also tried to use the following commands:

xvfb-run --listen-tcp --server-num 1 --auth-file /tmp/xvfb.auth -s "-ac -screen 0 1920x1080x24" python main.py &

ffmpeg -f x11grab -video_size 1920x1080 -i :1 -codec:v libx264 -r 12 videos/video.mp4

In the commands above, there are used xvfb-run --server-num 1 and ffmpeg -i :1, why ?

Overall, when Selenium is running in the headless mode what's going on behind the scenes ? Is it using virtual display ? If yes, how can I detect display id of this, etc. Am I on the right path ?

I am not using Docker or any kind of virtualization. All kind of tests are running on my local Ubuntu machine.

0

There are 0 best solutions below