{"browser": "chromium", "headless": true, "chromiumSandbox": false, "devtools": false, "handleSIGHUP": true, "handleSIGINT": true, "handleSIGTERM": true, "slowMo": 0.0, "timeout": 30000.0, "tracesDir": "/home/lukas/Volume/repo/BanGUI/e2e/browser/traces/temp/fff9f30c-e589-4ae0-acc2-4addbd55aab7"}
Starting Browser process /home/lukas/Volume/repo/BanGUI/.venv/lib/python3.12/site-packages/Browser/wrapper/index.js using at 127.0.0.1:59711
Successfully created browser with options: {"browser":"chromium","headless":true,"chromiumSandbox":false,"devtools":false,"handleSIGHUP":true,"handleSIGINT":true,"handleSIGTERM":true,"slowMo":0,"timeout":30000,"tracesDir":"/home/lukas/Volume/repo/BanGUI/e2e/browser/traces/temp/fff9f30c-e589-4ae0-acc2-4addbd55aab7"}
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
Successfully initialized new page object and opened url: about:blank
No context was open. New context was automatically opened when this page is created.
BrowserControl
Setter
Open a new Page.
Successfully opened URL http://localhost:5173/login
${FRONTEND_URL}/login
BrowserControl
Setter
Navigates to the given ``url``.
Waited for Element with selector css=form at state visible
css=form
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
Text: 'BanGUI\nEnter your master password to continue.\nPassword*\nSign in'
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
Closed browser
BrowserControl
Setter
Closes the current browser.
Login must run before Login As Admin — use New Page to avoid session cookie.
Vite SPA always returns 200; focus on DOM assertions after client-side routing.
{"browser": "chromium", "headless": true, "chromiumSandbox": false, "devtools": false, "handleSIGHUP": true, "handleSIGINT": true, "handleSIGTERM": true, "slowMo": 0.0, "timeout": 30000.0, "tracesDir": "/home/lukas/Volume/repo/BanGUI/e2e/browser/traces/temp/60026f36-199b-4876-95b2-0ef31f553a2a"}
Successfully created browser with options: {"browser":"chromium","headless":true,"chromiumSandbox":false,"devtools":false,"handleSIGHUP":true,"handleSIGINT":true,"handleSIGTERM":true,"slowMo":0,"timeout":30000,"tracesDir":"/home/lukas/Volume/repo/BanGUI/e2e/browser/traces/temp/60026f36-199b-4876-95b2-0ef31f553a2a"}
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
GET Request : url=http://localhost:8000/api/v1/setup
path_url=/api/v1/setup
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
GET Response : url=http://localhost:8000/api/v1/setup
status=200, reason=OK
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '18', 'content-type': 'application/json', 'x-correlation-id': '15e2fb57-c104-4f69-ab11-a5d95bb38bca', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"completed":true}
${response} = <Response [200]>
${response}
${BACKEND_URL}/api/v1/setup
Sends a GET request.
${body} = {'completed': True}
${body}
${response.json()}
Returns the given values which can then be assigned to a variables.
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${setup_payload}
master_password=${hashed}
database_path=
fail2ban_socket=
timezone=UTC
session_duration_minutes=60
Creates and returns a dictionary based on the given ``items``.
${BACKEND_URL}/api/v1/setup
json=${setup_payload}
Sends a POST request.
${response}
${BACKEND_URL}/api/v1/auth/login
Sends a POST request.
${password} = Hallo123!
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed} = sha256('Hallo123!'.encode()).hexdigest()
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${login_payload} = {'password': "sha256('Hallo123!'.encode()).hexdigest()"}
${login_payload}
password=${hashed}
Creates and returns a dictionary based on the given ``items``.
POST Request : url=http://localhost:8000/api/v1/auth/login
path_url=/api/v1/auth/login
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '56', 'Content-Type': 'application/json'}
body=b'{"password": "sha256(\'Hallo123!\'.encode()).hexdigest()"}'
POST Response : url=http://localhost:8000/api/v1/auth/login
status=401, reason=Unauthorized
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '162', 'content-type': 'application/json', 'x-correlation-id': 'fcda12ce-c348-4ba2-9ace-b33f61728c43', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"code":"authentication_required","detail":"No password is configured — run setup first.","metadata":{},"correlation_id":"fcda12ce-c348-4ba2-9ace-b33f61728c43"}
HTTPError: 401 Client Error: Unauthorized for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/auth/login
json=${login_payload}
Sends a POST request.
HTTPError: 401 Client Error: Unauthorized for url: http://localhost:8000/api/v1/auth/login
${session_cookie}
bangui_session
BrowserControl
Getter
Returns information of cookie with ``name`` as a Robot Framework dot dictionary or a string.
${session_cookie}
${session_cookie}
Makes a variable available everywhere within the scope of the current suite.
Logged in as admin.
Logs the given message with the given level.
HTTPError: 401 Client Error: Unauthorized for url: http://localhost:8000/api/v1/auth/login
${FRONTEND_URL}/setup
BrowserControl
Setter
Navigates to the given ``url``.
css=form,button
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
BrowserControl
Setter
Closes the current browser.
Setup wizard accessible before auth; may redirect to /login if already done.
HTTPError: 401 Client Error: Unauthorized for url: http://localhost:8000/api/v1/auth/login
Switching browser to browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Successfully changed active browser: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Reusing existing browser with id: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
GET Request : url=http://localhost:8000/api/v1/setup
path_url=/api/v1/setup
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
GET Response : url=http://localhost:8000/api/v1/setup
status=200, reason=OK
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '18', 'content-type': 'application/json', 'x-correlation-id': 'f903c47a-343d-4e00-bcb0-8d9d0a068e0e', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"completed":true}
${response} = <Response [200]>
${response}
${BACKEND_URL}/api/v1/setup
Sends a GET request.
${body} = {'completed': True}
${body}
${response.json()}
Returns the given values which can then be assigned to a variables.
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${setup_payload}
master_password=${hashed}
database_path=
fail2ban_socket=
timezone=UTC
session_duration_minutes=60
Creates and returns a dictionary based on the given ``items``.
${BACKEND_URL}/api/v1/setup
json=${setup_payload}
Sends a POST request.
${response}
${BACKEND_URL}/api/v1/auth/login
Sends a POST request.
${password} = Hallo123!
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed} = sha256('Hallo123!'.encode()).hexdigest()
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${login_payload} = {'password': "sha256('Hallo123!'.encode()).hexdigest()"}
${login_payload}
password=${hashed}
Creates and returns a dictionary based on the given ``items``.
POST Request : url=http://localhost:8000/api/v1/auth/login
path_url=/api/v1/auth/login
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '56', 'Content-Type': 'application/json'}
body=b'{"password": "sha256(\'Hallo123!\'.encode()).hexdigest()"}'
POST Response : url=http://localhost:8000/api/v1/auth/login
status=429, reason=Too Many Requests
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'retry-after': '60', 'content-length': '186', 'content-type': 'application/json', 'x-correlation-id': '681bc9a0-464e-434e-8ae9-1b471dba7d77', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"code":"rate_limit_exceeded","detail":"Too many login attempts. Please try again later.","metadata":{"retry_after_seconds":60.0},"correlation_id":"681bc9a0-464e-434e-8ae9-1b471dba7d77"}
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/auth/login
json=${login_payload}
Sends a POST request.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${session_cookie}
bangui_session
BrowserControl
Getter
Returns information of cookie with ``name`` as a Robot Framework dot dictionary or a string.
${session_cookie}
${session_cookie}
Makes a variable available everywhere within the scope of the current suite.
Logged in as admin.
Logs the given message with the given level.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${FRONTEND_URL}/
BrowserControl
Setter
Navigates to the given ``url``.
css=main
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
BrowserControl
Setter
Closes the current browser.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
Switching browser to browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Successfully changed active browser: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Reusing existing browser with id: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
GET Request : url=http://localhost:8000/api/v1/setup
path_url=/api/v1/setup
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
GET Response : url=http://localhost:8000/api/v1/setup
status=200, reason=OK
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '18', 'content-type': 'application/json', 'x-correlation-id': '6377f3ad-048e-45a2-90c4-8bc5dd97981f', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"completed":true}
${response} = <Response [200]>
${response}
${BACKEND_URL}/api/v1/setup
Sends a GET request.
${body} = {'completed': True}
${body}
${response.json()}
Returns the given values which can then be assigned to a variables.
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${setup_payload}
master_password=${hashed}
database_path=
fail2ban_socket=
timezone=UTC
session_duration_minutes=60
Creates and returns a dictionary based on the given ``items``.
${BACKEND_URL}/api/v1/setup
json=${setup_payload}
Sends a POST request.
${response}
${BACKEND_URL}/api/v1/auth/login
Sends a POST request.
${password} = Hallo123!
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed} = sha256('Hallo123!'.encode()).hexdigest()
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${login_payload} = {'password': "sha256('Hallo123!'.encode()).hexdigest()"}
${login_payload}
password=${hashed}
Creates and returns a dictionary based on the given ``items``.
POST Request : url=http://localhost:8000/api/v1/auth/login
path_url=/api/v1/auth/login
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '56', 'Content-Type': 'application/json'}
body=b'{"password": "sha256(\'Hallo123!\'.encode()).hexdigest()"}'
POST Response : url=http://localhost:8000/api/v1/auth/login
status=429, reason=Too Many Requests
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'retry-after': '60', 'content-length': '186', 'content-type': 'application/json', 'x-correlation-id': '50194cf2-57cb-4c05-a696-776920d73d39', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"code":"rate_limit_exceeded","detail":"Too many login attempts. Please try again later.","metadata":{"retry_after_seconds":60.0},"correlation_id":"50194cf2-57cb-4c05-a696-776920d73d39"}
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/auth/login
json=${login_payload}
Sends a POST request.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${session_cookie}
bangui_session
BrowserControl
Getter
Returns information of cookie with ``name`` as a Robot Framework dot dictionary or a string.
${session_cookie}
${session_cookie}
Makes a variable available everywhere within the scope of the current suite.
Logged in as admin.
Logs the given message with the given level.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${FRONTEND_URL}/map
BrowserControl
Setter
Navigates to the given ``url``.
css=canvas,svg,.map-container
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
BrowserControl
Setter
Closes the current browser.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
Switching browser to browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Successfully changed active browser: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Reusing existing browser with id: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
GET Request : url=http://localhost:8000/api/v1/setup
path_url=/api/v1/setup
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
GET Response : url=http://localhost:8000/api/v1/setup
status=200, reason=OK
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '18', 'content-type': 'application/json', 'x-correlation-id': 'e906034a-f457-4e1a-9cea-bb9e0849f3dd', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"completed":true}
${response} = <Response [200]>
${response}
${BACKEND_URL}/api/v1/setup
Sends a GET request.
${body} = {'completed': True}
${body}
${response.json()}
Returns the given values which can then be assigned to a variables.
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${setup_payload}
master_password=${hashed}
database_path=
fail2ban_socket=
timezone=UTC
session_duration_minutes=60
Creates and returns a dictionary based on the given ``items``.
${BACKEND_URL}/api/v1/setup
json=${setup_payload}
Sends a POST request.
${response}
${BACKEND_URL}/api/v1/auth/login
Sends a POST request.
${password} = Hallo123!
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed} = sha256('Hallo123!'.encode()).hexdigest()
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${login_payload} = {'password': "sha256('Hallo123!'.encode()).hexdigest()"}
${login_payload}
password=${hashed}
Creates and returns a dictionary based on the given ``items``.
POST Request : url=http://localhost:8000/api/v1/auth/login
path_url=/api/v1/auth/login
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '56', 'Content-Type': 'application/json'}
body=b'{"password": "sha256(\'Hallo123!\'.encode()).hexdigest()"}'
POST Response : url=http://localhost:8000/api/v1/auth/login
status=429, reason=Too Many Requests
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'retry-after': '60', 'content-length': '186', 'content-type': 'application/json', 'x-correlation-id': '931bccb1-7194-467d-8d2d-ceb5a978b69f', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"code":"rate_limit_exceeded","detail":"Too many login attempts. Please try again later.","metadata":{"retry_after_seconds":60.0},"correlation_id":"931bccb1-7194-467d-8d2d-ceb5a978b69f"}
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/auth/login
json=${login_payload}
Sends a POST request.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${session_cookie}
bangui_session
BrowserControl
Getter
Returns information of cookie with ``name`` as a Robot Framework dot dictionary or a string.
${session_cookie}
${session_cookie}
Makes a variable available everywhere within the scope of the current suite.
Logged in as admin.
Logs the given message with the given level.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${FRONTEND_URL}/jails
BrowserControl
Setter
Navigates to the given ``url``.
css=main,table,.jails-list
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
BrowserControl
Setter
Closes the current browser.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
Switching browser to browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Successfully changed active browser: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Reusing existing browser with id: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
GET Request : url=http://localhost:8000/api/v1/setup
path_url=/api/v1/setup
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
GET Response : url=http://localhost:8000/api/v1/setup
status=200, reason=OK
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '18', 'content-type': 'application/json', 'x-correlation-id': '70927f95-6bba-4adc-80f8-1ad987233a78', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"completed":true}
${response} = <Response [200]>
${response}
${BACKEND_URL}/api/v1/setup
Sends a GET request.
${body} = {'completed': True}
${body}
${response.json()}
Returns the given values which can then be assigned to a variables.
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${setup_payload}
master_password=${hashed}
database_path=
fail2ban_socket=
timezone=UTC
session_duration_minutes=60
Creates and returns a dictionary based on the given ``items``.
${BACKEND_URL}/api/v1/setup
json=${setup_payload}
Sends a POST request.
${response}
${BACKEND_URL}/api/v1/auth/login
Sends a POST request.
${password} = Hallo123!
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed} = sha256('Hallo123!'.encode()).hexdigest()
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${login_payload} = {'password': "sha256('Hallo123!'.encode()).hexdigest()"}
${login_payload}
password=${hashed}
Creates and returns a dictionary based on the given ``items``.
POST Request : url=http://localhost:8000/api/v1/auth/login
path_url=/api/v1/auth/login
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '56', 'Content-Type': 'application/json'}
body=b'{"password": "sha256(\'Hallo123!\'.encode()).hexdigest()"}'
POST Response : url=http://localhost:8000/api/v1/auth/login
status=429, reason=Too Many Requests
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'retry-after': '60', 'content-length': '186', 'content-type': 'application/json', 'x-correlation-id': '20e88f18-e33c-4cc0-8619-9375a4429415', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"code":"rate_limit_exceeded","detail":"Too many login attempts. Please try again later.","metadata":{"retry_after_seconds":60.0},"correlation_id":"20e88f18-e33c-4cc0-8619-9375a4429415"}
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/auth/login
json=${login_payload}
Sends a POST request.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${session_cookie}
bangui_session
BrowserControl
Getter
Returns information of cookie with ``name`` as a Robot Framework dot dictionary or a string.
${session_cookie}
${session_cookie}
Makes a variable available everywhere within the scope of the current suite.
Logged in as admin.
Logs the given message with the given level.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/jails
Sends a GET request.
${jails}
${response.json()}
Returns the given values which can then be assigned to a variables.
${count}
${jails}
Returns and logs the length of the given item as an integer.
${first_jail}
${jails}
0
Returns the value specified with an ``index`` from ``list``.
${jail_name}
${first_jail}[name]
Returns the given values which can then be assigned to a variables.
Using jail: ${jail_name}
Logs the given message with the given level.
${jail_name}
manual-Jail
Returns the given values which can then be assigned to a variables.
No jails found; using fallback name: ${jail_name}
Logs the given message with the given level.
${FRONTEND_URL}/jails/${jail_name}
BrowserControl
Setter
Navigates to the given ``url``.
css=main,h1,h2,.jail-detail
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
BrowserControl
Setter
Closes the current browser.
Guard: check jail exists via GET /api/jails first; use first jail name.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
Switching browser to browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Successfully changed active browser: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Reusing existing browser with id: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
GET Request : url=http://localhost:8000/api/v1/setup
path_url=/api/v1/setup
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
GET Response : url=http://localhost:8000/api/v1/setup
status=200, reason=OK
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '18', 'content-type': 'application/json', 'x-correlation-id': '6afffb05-0a80-464d-85d0-e76d457ad99a', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"completed":true}
${response} = <Response [200]>
${response}
${BACKEND_URL}/api/v1/setup
Sends a GET request.
${body} = {'completed': True}
${body}
${response.json()}
Returns the given values which can then be assigned to a variables.
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${setup_payload}
master_password=${hashed}
database_path=
fail2ban_socket=
timezone=UTC
session_duration_minutes=60
Creates and returns a dictionary based on the given ``items``.
${BACKEND_URL}/api/v1/setup
json=${setup_payload}
Sends a POST request.
${response}
${BACKEND_URL}/api/v1/auth/login
Sends a POST request.
${password} = Hallo123!
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed} = sha256('Hallo123!'.encode()).hexdigest()
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${login_payload} = {'password': "sha256('Hallo123!'.encode()).hexdigest()"}
${login_payload}
password=${hashed}
Creates and returns a dictionary based on the given ``items``.
POST Request : url=http://localhost:8000/api/v1/auth/login
path_url=/api/v1/auth/login
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '56', 'Content-Type': 'application/json'}
body=b'{"password": "sha256(\'Hallo123!\'.encode()).hexdigest()"}'
POST Response : url=http://localhost:8000/api/v1/auth/login
status=429, reason=Too Many Requests
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'retry-after': '60', 'content-length': '186', 'content-type': 'application/json', 'x-correlation-id': '62345c0c-072c-4fb1-b579-776d24a721d3', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"code":"rate_limit_exceeded","detail":"Too many login attempts. Please try again later.","metadata":{"retry_after_seconds":60.0},"correlation_id":"62345c0c-072c-4fb1-b579-776d24a721d3"}
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/auth/login
json=${login_payload}
Sends a POST request.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${session_cookie}
bangui_session
BrowserControl
Getter
Returns information of cookie with ``name`` as a Robot Framework dot dictionary or a string.
${session_cookie}
${session_cookie}
Makes a variable available everywhere within the scope of the current suite.
Logged in as admin.
Logs the given message with the given level.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${FRONTEND_URL}/config
BrowserControl
Setter
Navigates to the given ``url``.
css=main,.tabs,.config-editor
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
BrowserControl
Setter
Closes the current browser.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
Switching browser to browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Successfully changed active browser: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Reusing existing browser with id: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
GET Request : url=http://localhost:8000/api/v1/setup
path_url=/api/v1/setup
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
GET Response : url=http://localhost:8000/api/v1/setup
status=200, reason=OK
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '18', 'content-type': 'application/json', 'x-correlation-id': '55b641d4-f5dd-4ee4-92bd-f259b726178f', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"completed":true}
${response} = <Response [200]>
${response}
${BACKEND_URL}/api/v1/setup
Sends a GET request.
${body} = {'completed': True}
${body}
${response.json()}
Returns the given values which can then be assigned to a variables.
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${setup_payload}
master_password=${hashed}
database_path=
fail2ban_socket=
timezone=UTC
session_duration_minutes=60
Creates and returns a dictionary based on the given ``items``.
${BACKEND_URL}/api/v1/setup
json=${setup_payload}
Sends a POST request.
${response}
${BACKEND_URL}/api/v1/auth/login
Sends a POST request.
${password} = Hallo123!
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed} = sha256('Hallo123!'.encode()).hexdigest()
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${login_payload} = {'password': "sha256('Hallo123!'.encode()).hexdigest()"}
${login_payload}
password=${hashed}
Creates and returns a dictionary based on the given ``items``.
POST Request : url=http://localhost:8000/api/v1/auth/login
path_url=/api/v1/auth/login
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '56', 'Content-Type': 'application/json'}
body=b'{"password": "sha256(\'Hallo123!\'.encode()).hexdigest()"}'
POST Response : url=http://localhost:8000/api/v1/auth/login
status=429, reason=Too Many Requests
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'retry-after': '60', 'content-length': '186', 'content-type': 'application/json', 'x-correlation-id': '1615aebf-f0fa-4ab4-a156-88bc8e689b00', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"code":"rate_limit_exceeded","detail":"Too many login attempts. Please try again later.","metadata":{"retry_after_seconds":60.0},"correlation_id":"1615aebf-f0fa-4ab4-a156-88bc8e689b00"}
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/auth/login
json=${login_payload}
Sends a POST request.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${session_cookie}
bangui_session
BrowserControl
Getter
Returns information of cookie with ``name`` as a Robot Framework dot dictionary or a string.
${session_cookie}
${session_cookie}
Makes a variable available everywhere within the scope of the current suite.
Logged in as admin.
Logs the given message with the given level.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${FRONTEND_URL}/history
BrowserControl
Setter
Navigates to the given ``url``.
css=main,table,.history-table
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
BrowserControl
Setter
Closes the current browser.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
Switching browser to browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Successfully changed active browser: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
Reusing existing browser with id: browser=1965d4f7-7156-47f2-9aa5-859a0466429c
chromium
headless=${TRUE}
BrowserControl
Setter
Create a new playwright Browser with specified options.
GET Request : url=http://localhost:8000/api/v1/setup
path_url=/api/v1/setup
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
body=None
GET Response : url=http://localhost:8000/api/v1/setup
status=200, reason=OK
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'content-length': '18', 'content-type': 'application/json', 'x-correlation-id': 'ee85940c-9907-4a46-a5aa-fc51bcd28f9f', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"completed":true}
${response} = <Response [200]>
${response}
${BACKEND_URL}/api/v1/setup
Sends a GET request.
${body} = {'completed': True}
${body}
${response.json()}
Returns the given values which can then be assigned to a variables.
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${setup_payload}
master_password=${hashed}
database_path=
fail2ban_socket=
timezone=UTC
session_duration_minutes=60
Creates and returns a dictionary based on the given ``items``.
${BACKEND_URL}/api/v1/setup
json=${setup_payload}
Sends a POST request.
${response}
${BACKEND_URL}/api/v1/auth/login
Sends a POST request.
${password} = Hallo123!
${password}
Hallo123!
Returns the given values which can then be assigned to a variables.
${hashed} = sha256('Hallo123!'.encode()).hexdigest()
${hashed}
"sha256('${password}'.encode()).hexdigest()"
modules=hashlib
Evaluates the given expression in Python and returns the result.
${login_payload} = {'password': "sha256('Hallo123!'.encode()).hexdigest()"}
${login_payload}
password=${hashed}
Creates and returns a dictionary based on the given ``items``.
POST Request : url=http://localhost:8000/api/v1/auth/login
path_url=/api/v1/auth/login
headers={'User-Agent': 'python-requests/2.32.5', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '56', 'Content-Type': 'application/json'}
body=b'{"password": "sha256(\'Hallo123!\'.encode()).hexdigest()"}'
POST Response : url=http://localhost:8000/api/v1/auth/login
status=429, reason=Too Many Requests
headers={'date': 'Tue, 05 May 2026 17:39:04 GMT', 'server': 'uvicorn', 'retry-after': '60', 'content-length': '186', 'content-type': 'application/json', 'x-correlation-id': '83b3f9b0-e0d9-4d6c-b833-2af9994a35d9', 'content-security-policy': "default-src 'self'", 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block'}
body={"code":"rate_limit_exceeded","detail":"Too many login attempts. Please try again later.","metadata":{"retry_after_seconds":60.0},"correlation_id":"83b3f9b0-e0d9-4d6c-b833-2af9994a35d9"}
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${response}
${BACKEND_URL}/api/v1/auth/login
json=${login_payload}
Sends a POST request.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${session_cookie}
bangui_session
BrowserControl
Getter
Returns information of cookie with ``name`` as a Robot Framework dot dictionary or a string.
${session_cookie}
${session_cookie}
Makes a variable available everywhere within the scope of the current suite.
Logged in as admin.
Logs the given message with the given level.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
${FRONTEND_URL}/blocklists
BrowserControl
Setter
Navigates to the given ``url``.
css=main,.blocklists-panel,.panel
visible
timeout=15s
PageContent
Wait
Waits for the element found by ``selector`` to satisfy state option.
css=body
not contains
Something went wrong
Assertion
Getter
PageContent
Returns text attribute of the element found by ``selector``.
BrowserControl
Setter
Closes the current browser.
HTTPError: 429 Client Error: Too Many Requests for url: http://localhost:8000/api/v1/auth/login
All Tests
01 Page Loading
Error in file '/home/lukas/Volume/repo/BanGUI/e2e/resources/common.resource' on line 5: Processing variable file '/home/lukas/Volume/repo/BanGUI/e2e/resources/../../.env' failed: Importing variable file '/home/lukas/Volume/repo/BanGUI/e2e/resources/../../.env' failed: Module name cannot contain dots when importing by path.