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.