Context:
I am using 2 local PCs to make a docker swarm cluster where I deploy 1 selenium Grid hub and 10 selenium Grid nodes. All ui regression tests are running on these docker containers. The browser can be Chrome or Firefox.
Problem:
One day , half of the tests, about 150 out of 300 tests are failed. below is some errors. When remote debug to the container , I see the browser is crashed.
org.openqa.selenium.WebDriverException: unknown error: session deleted because of page crash
from tab crashed
(Session info: chrome=79.0.3945.117)
org.openqa.selenium.WebDriverException: unknown error: session deleted because of page crash
from unknown error: cannot determine loading status
from tab crashed
(Session info: chrome=79.0.3945.117)
Root Cause:
This is related to shared memory (/dev/shm) in the docker container. The application seems has some changes and it causes the chromium now complained about small /dev/shm size.
to know what is /dev/shm memory, refer this link
Official document docker-selenium also mentions this problem.
default size of selenium node chrome-debug container is 64MB. This is typically too small for Chromium and will cause Chromium to crash when rendering large pages
seluser@ad8cc1964b71:/$ sudo df -h /dev/shm Filesystem Size Used Avail Use% Mounted on shm 64M 0 64M 0% /dev/shm
Solution:
Increase the /dev/shm size. 2 Gb is apparently working for my need.
seluser@626a09495438:/$ df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 2.0G 0 2.0G 0% /dev/shm
Command to run docker:
$ docker run -d -v /dev/shm:/dev/shm selenium/node-chrome-debug:latest
#OR
$ docker run -d --shm-size=2g selenium/node-chrome-debug:latest
#OR
docker run -it --rm \
--name tmpfs \
--mount type=tmpfs,dst=/dev/shm,tmpfs-size=2147483648 \
selenium/node-chrome-debug:latest
Command for Docker Swarm compose:
chrome_debug1: image: selenium/node-chrome-debug:latest ports: - "5901:5900" environment: HUB_HOST: hub HUB_PORT: 4444 NODE_MAX_SESSION: 1 NODE_MAX_INSTANCES: 1 volumes: - type: tmpfs target: /dev/shm tmpfs: size: 2147483648 deploy: replicas: 1 placement: constraints: - node.role == manager
Since Chromium 65, this is no longer necessary. Instead, launch the browser with the --disable-dev-shm-usage flag. Below is sample code for Playwright:
const browser = await playwright.chromium.launch({
args: ['--disable-dev-shm-usage']
});