Recently, I am working on to use SELENIUM for automating testing.
A part of my goal is to use SELENIUM for stress test
We want to simulate the registration process to make sure the course system could be working as expected at the next semester when students register their courses.

I use ansible playbook to simplify the build of a selenium grid environment.

The following packages are mandatory.

sudo apt install python-docker
pip install docker-py
pip uninstall requests 
pip uninstall urllib3 
pip install requests

The script creating a selenium grid:
selenium_grid.yml

---
- hosts: localhost
  connection: local
  gather_facts: False
  vars:
    nodes: 10
    state: started
    dns: 192.168.100.153
  tasks:
    - name: "{{ '%s hub' | format(state) }}"
      docker_container:
        name: hub
        image: selenium/hub
        state: "{{ state }}"
        published_ports: 5555:4444
        recreate: yes
        cleanup: yes
        dns_servers: "{{ dns }}"

    - name: "{{ '%s nodes' | format(state) }}"
      docker_container:
        name: "{{ 'chrome%02d' | format(item) }}"
        image: selenium/node-chrome-debug
        state: "{{ state }}"
        published_ports: "{{ '59%02d:5900' | format(item) }}"
        recreate: yes
        cleanup: yes
        links: hub:hub
        dns_servers: "{{ dns }}"
      loop: "{{ range(1, nodes|int + 1, 1)|list }}"
$ ansible-playbook selenium_grid.yml 
 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [localhost] *******************************************************************************************************************

TASK [started hub] *****************************************************************************************************************
changed: [localhost]

TASK [started nodes] ***************************************************************************************************************
changed: [localhost] => (item=1)
changed: [localhost] => (item=2)
changed: [localhost] => (item=3)
changed: [localhost] => (item=4)
changed: [localhost] => (item=5)
changed: [localhost] => (item=6)
changed: [localhost] => (item=7)
changed: [localhost] => (item=8)
changed: [localhost] => (item=9)
changed: [localhost] => (item=10)

PLAY RECAP *************************************************************************************************************************
localhost                  : ok=2    changed=2    unreachable=0    failed=0   

zhangqiaoc@ubuntu01:~/ansible$ sudo docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED              STATUS                     PORTS                    NAMES
d4dd9291caf0        selenium/node-chrome-debug   "/opt/bin/entry_poin"   About a minute ago   Up About a minute          0.0.0.0:5910->5900/tcp   chrome10
00849df50f3e        selenium/node-chrome-debug   "/opt/bin/entry_poin"   About a minute ago   Up About a minute          0.0.0.0:5909->5900/tcp   chrome09
76a362efadcc        selenium/node-chrome-debug   "/opt/bin/entry_poin"   About a minute ago   Up About a minute          0.0.0.0:5908->5900/tcp   chrome08
170eb6cc8193        selenium/node-chrome-debug   "/opt/bin/entry_poin"   About a minute ago   Up About a minute          0.0.0.0:5907->5900/tcp   chrome07
9bcf4bd1fb5e        selenium/node-chrome-debug   "/opt/bin/entry_poin"   About a minute ago   Up About a minute          0.0.0.0:5906->5900/tcp   chrome06
8e3dcb28ac73        selenium/node-chrome-debug   "/opt/bin/entry_poin"   2 minutes ago        Up About a minute          0.0.0.0:5905->5900/tcp   chrome05
8b82403b0e6c        selenium/node-chrome-debug   "/opt/bin/entry_poin"   2 minutes ago        Up 2 minutes               0.0.0.0:5904->5900/tcp   chrome04
dd358d28ae29        selenium/node-chrome-debug   "/opt/bin/entry_poin"   2 minutes ago        Up 2 minutes               0.0.0.0:5903->5900/tcp   chrome03
0843057f3900        selenium/node-chrome-debug   "/opt/bin/entry_poin"   2 minutes ago        Up 2 minutes               0.0.0.0:5902->5900/tcp   chrome02
434bf300c0b5        selenium/node-chrome-debug   "/opt/bin/entry_poin"   2 minutes ago        Up 2 minutes               0.0.0.0:5901->5900/tcp   chrome01
4c962835b46c        selenium/hub                 "/opt/bin/entry_poin"   2 minutes ago        Up 2 minutes               0.0.0.0:5555->4444/tcp   hub
99cd793962e2        oracle/database:18.3.0-ee    "/bin/sh -c 'exec $O"   3 weeks ago          Exited (137) 2 weeks ago                            oracle18

You can check the status of the grid by the web interface.

Then, write a python script to call the selenium testing python scripts.

from subprocess import Popen

processes = []

cmd_pprd1 = "python main_pprd.py"
cmd_pprd2 = "python main_pprd2.py"
cmd_pprd3 = "python main_pprd3.py"

# processes.append(Popen(cmd_pprd1, shell=True))
# processes.append(Popen(cmd_pprd2, shell=True))
# processes.append(Popen(cmd_pprd3, shell=True))

for n in range(10):
    processes.append(Popen(cmd_pprd1, shell=True))

print len(processes)
for n in range(len(processes)):
    processes[n].wait()