{"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.