Cleanup obsolete tasks, simplify auth lock logic, increase test retry wait
- Remove completed Task 17 and 18 from Docs/tasks.md - Remove ANIWORLD_TESTING bypass in _check_locked (testing env now uses test auth service) - Remove redundant lock expiry cleanup (handled by _get_fail_record) - Fix login.html whitespace formatting - Increase setup retry wait from 6s to 45s for rate-limited CI environments
This commit is contained in:
@@ -1,19 +1,3 @@
|
|||||||
### Task 17: Fix `Login With Valid Password` UI Test
|
|
||||||
**Test Result:** FAIL — Same as Task 16 (`id=password-input` not found)
|
|
||||||
**File:** `tests/robot/ui/login.robot` and `src/server/web/templates/login.html`
|
|
||||||
**Instructions:**
|
|
||||||
Fix the element ID mismatches in `login.html` as described in Task 16. The `Perform Login` keyword in `tests/robot/resources/ui_keywords.resource` fills `id=password-input` and clicks `id=login-submit-btn`. Update the HTML template IDs to match.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 18: Fix `Login With Invalid Password` UI Test
|
|
||||||
**Test Result:** FAIL — Same as Task 16
|
|
||||||
**File:** `tests/robot/ui/login.robot` and `src/server/web/templates/login.html`
|
|
||||||
**Instructions:**
|
|
||||||
Fix the element ID mismatches in `login.html` as described in Task 16. Also verify that the error message element `id=login-error` exists in the template and is shown when login fails.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 19: Fix `Login Rate Limit UI` UI Test
|
### Task 19: Fix `Login Rate Limit UI` UI Test
|
||||||
**Test Result:** FAIL — Same as Task 16
|
**Test Result:** FAIL — Same as Task 16
|
||||||
**File:** `tests/robot/ui/login.robot` and `src/server/web/templates/login.html`
|
**File:** `tests/robot/ui/login.robot` and `src/server/web/templates/login.html`
|
||||||
|
|||||||
676
output.xml
Normal file
676
output.xml
Normal file
@@ -0,0 +1,676 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<robot generator="Robot 7.4.2 (Python 3.13.5 on linux)" generated="2026-06-26T18:51:25.066443" rpa="false" schemaversion="5">
|
||||||
|
<suite id="s1" name="Download" source="/home/lukas/Volume/repo/Aniworld/tests/robot/api/download.robot">
|
||||||
|
<test id="s1-t1" name="Retry Failed Item" line="106">
|
||||||
|
<kw name="Run Keywords" owner="BuiltIn" type="SETUP">
|
||||||
|
<kw name="Create Anonymous Session" owner="common">
|
||||||
|
<kw name="Create Session" owner="RequestsLibrary">
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>${BASE_URL}</arg>
|
||||||
|
<doc>Create Session: create a HTTP session to a server</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.279086" elapsed="0.000113"/>
|
||||||
|
</kw>
|
||||||
|
<doc>Create an unauthenticated HTTP session.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.278813" elapsed="0.000462"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Setup Master Password" owner="common">
|
||||||
|
<kw name="Create Dictionary" owner="BuiltIn">
|
||||||
|
<var>${payload}</var>
|
||||||
|
<arg>master_password=${SETUP_PASSWORD}</arg>
|
||||||
|
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
|
||||||
|
<arg>name=AniworldTest</arg>
|
||||||
|
<arg>data_dir=data</arg>
|
||||||
|
<arg>scheduler_enabled=False</arg>
|
||||||
|
<arg>logging_level=INFO</arg>
|
||||||
|
<arg>backup_enabled=False</arg>
|
||||||
|
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.279734" elapsed="0.000277"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/setup</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=any</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.280120" elapsed="0.000109"/>
|
||||||
|
</kw>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' == '429'">
|
||||||
|
<kw name="Sleep" owner="BuiltIn">
|
||||||
|
<arg>6s</arg>
|
||||||
|
<doc>Pauses the test executed for the given time.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.280454" elapsed="0.000184"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/setup</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=any</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.280743" elapsed="0.000092"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.280322" elapsed="0.000556"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.280300" elapsed="0.000616"/>
|
||||||
|
</if>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' == '400'">
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${json}</var>
|
||||||
|
<arg>${resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.281100" elapsed="0.000059"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Get Value From Json" owner="JSONLibrary">
|
||||||
|
<var>${detail}</var>
|
||||||
|
<arg>${json}</arg>
|
||||||
|
<arg>$.detail</arg>
|
||||||
|
<doc>Get Value From JSON using JSONPath</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.281236" elapsed="0.000072"/>
|
||||||
|
</kw>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
|
||||||
|
<return>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.281434" elapsed="0.000045"/>
|
||||||
|
</return>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.281371" elapsed="0.000141"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.281358" elapsed="0.000186"/>
|
||||||
|
</if>
|
||||||
|
<kw name="Fail" owner="BuiltIn">
|
||||||
|
<arg>Setup failed with 400: ${detail}</arg>
|
||||||
|
<doc>Fails the test with the given message and optionally alters its tags.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.281607" elapsed="0.000164"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.280977" elapsed="0.000829"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.280963" elapsed="0.000868"/>
|
||||||
|
</if>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' == '201'">
|
||||||
|
<kw name="Should Be Equal As Integers" owner="BuiltIn">
|
||||||
|
<arg>${resp.status_code}</arg>
|
||||||
|
<arg>201</arg>
|
||||||
|
<doc>Fails if objects are unequal after converting them to integers.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.281977" elapsed="0.000147"/>
|
||||||
|
</kw>
|
||||||
|
<return>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.282293" elapsed="0.000056"/>
|
||||||
|
</return>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.281874" elapsed="0.000502"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.281864" elapsed="0.000535"/>
|
||||||
|
</if>
|
||||||
|
<kw name="Fail" owner="BuiltIn">
|
||||||
|
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
|
||||||
|
<doc>Fails the test with the given message and optionally alters its tags.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.282461" elapsed="0.000131"/>
|
||||||
|
</kw>
|
||||||
|
<doc>Configure the master password via the setup endpoint.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.279498" elapsed="0.003136"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Create Authenticated Session" owner="common">
|
||||||
|
<kw name="Create Anonymous Session" owner="common">
|
||||||
|
<kw name="Create Session" owner="RequestsLibrary">
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>${BASE_URL}</arg>
|
||||||
|
<doc>Create Session: create a HTTP session to a server</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.283228" elapsed="0.000081"/>
|
||||||
|
</kw>
|
||||||
|
<doc>Create an unauthenticated HTTP session.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.283025" elapsed="0.000326"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Is Auth Configured" owner="common">
|
||||||
|
<kw name="GET On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/status</arg>
|
||||||
|
<arg>expected_status=200</arg>
|
||||||
|
<doc>Sends a GET request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.283594" elapsed="0.000071"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${json}</var>
|
||||||
|
<arg>${resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.283751" elapsed="0.000058"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Get Value From Json" owner="JSONLibrary">
|
||||||
|
<var>${configured}</var>
|
||||||
|
<arg>${json}</arg>
|
||||||
|
<arg>$.configured</arg>
|
||||||
|
<doc>Get Value From JSON using JSONPath</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.283891" elapsed="0.000071"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Set Variable" owner="BuiltIn">
|
||||||
|
<var>${configured_val}</var>
|
||||||
|
<arg>${configured}[0]</arg>
|
||||||
|
<doc>Returns the given values which can then be assigned to a variables.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.284039" elapsed="0.000196"/>
|
||||||
|
</kw>
|
||||||
|
<return>
|
||||||
|
<value>${configured_val}</value>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.284301" elapsed="0.000070"/>
|
||||||
|
</return>
|
||||||
|
<var>${configured}</var>
|
||||||
|
<doc>Check if the master password has already been configured.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.283447" elapsed="0.000981"/>
|
||||||
|
</kw>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="not ${configured}">
|
||||||
|
<kw name="Setup Master Password" owner="common">
|
||||||
|
<kw name="Create Dictionary" owner="BuiltIn">
|
||||||
|
<var>${payload}</var>
|
||||||
|
<arg>master_password=${SETUP_PASSWORD}</arg>
|
||||||
|
<arg>anime_directory=/tmp/aniworld_test_anime</arg>
|
||||||
|
<arg>name=AniworldTest</arg>
|
||||||
|
<arg>data_dir=data</arg>
|
||||||
|
<arg>scheduler_enabled=False</arg>
|
||||||
|
<arg>logging_level=INFO</arg>
|
||||||
|
<arg>backup_enabled=False</arg>
|
||||||
|
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.284971" elapsed="0.000181"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/setup</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=any</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.285244" elapsed="0.000088"/>
|
||||||
|
</kw>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' == '429'">
|
||||||
|
<kw name="Sleep" owner="BuiltIn">
|
||||||
|
<arg>6s</arg>
|
||||||
|
<doc>Pauses the test executed for the given time.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.285498" elapsed="0.000169"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/setup</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=any</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.285758" elapsed="0.000084"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.285398" elapsed="0.000480"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.285385" elapsed="0.000662"/>
|
||||||
|
</if>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' == '400'">
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${json}</var>
|
||||||
|
<arg>${resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.286209" elapsed="0.000058"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Get Value From Json" owner="JSONLibrary">
|
||||||
|
<var>${detail}</var>
|
||||||
|
<arg>${json}</arg>
|
||||||
|
<arg>$.detail</arg>
|
||||||
|
<doc>Get Value From JSON using JSONPath</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.286341" elapsed="0.000066"/>
|
||||||
|
</kw>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${detail}[0]' == 'Master password already configured'">
|
||||||
|
<return>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.286515" elapsed="0.000035"/>
|
||||||
|
</return>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.286462" elapsed="0.000113"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.286451" elapsed="0.000148"/>
|
||||||
|
</if>
|
||||||
|
<kw name="Fail" owner="BuiltIn">
|
||||||
|
<arg>Setup failed with 400: ${detail}</arg>
|
||||||
|
<doc>Fails the test with the given message and optionally alters its tags.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.286656" elapsed="0.000141"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.286109" elapsed="0.000720"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.286097" elapsed="0.000757"/>
|
||||||
|
</if>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' == '201'">
|
||||||
|
<kw name="Should Be Equal As Integers" owner="BuiltIn">
|
||||||
|
<arg>${resp.status_code}</arg>
|
||||||
|
<arg>201</arg>
|
||||||
|
<doc>Fails if objects are unequal after converting them to integers.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.286985" elapsed="0.000135"/>
|
||||||
|
</kw>
|
||||||
|
<return>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.287163" elapsed="0.000043"/>
|
||||||
|
</return>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.286894" elapsed="0.000339"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.286884" elapsed="0.000372"/>
|
||||||
|
</if>
|
||||||
|
<kw name="Fail" owner="BuiltIn">
|
||||||
|
<arg>Unexpected status ${resp.status_code} from /api/auth/setup</arg>
|
||||||
|
<doc>Fails the test with the given message and optionally alters its tags.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.287320" elapsed="0.000148"/>
|
||||||
|
</kw>
|
||||||
|
<doc>Configure the master password via the setup endpoint.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.284776" elapsed="0.002730"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Login And Get Token" owner="common">
|
||||||
|
<kw name="Create Dictionary" owner="BuiltIn">
|
||||||
|
<var>${payload}</var>
|
||||||
|
<arg>password=${SETUP_PASSWORD}</arg>
|
||||||
|
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.287874" elapsed="0.000137"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/login</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=any</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.288088" elapsed="0.000099"/>
|
||||||
|
</kw>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' == '429'">
|
||||||
|
<kw name="Sleep" owner="BuiltIn">
|
||||||
|
<arg>6s</arg>
|
||||||
|
<doc>Pauses the test executed for the given time.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.288342" elapsed="0.000146"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/login</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=any</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.288562" elapsed="0.000074"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.288251" elapsed="0.000419"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.288238" elapsed="0.000466"/>
|
||||||
|
</if>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' != '200'">
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${json}</var>
|
||||||
|
<arg>${resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.288839" elapsed="0.000057"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Get Value From Json" owner="JSONLibrary">
|
||||||
|
<var>${detail}</var>
|
||||||
|
<arg>${json}</arg>
|
||||||
|
<arg>$.detail</arg>
|
||||||
|
<doc>Get Value From JSON using JSONPath</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.288969" elapsed="0.000065"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Set Variable" owner="BuiltIn">
|
||||||
|
<var>${detail_val}</var>
|
||||||
|
<arg>${detail}[0]</arg>
|
||||||
|
<doc>Returns the given values which can then be assigned to a variables.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.289106" elapsed="0.000131"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Fail" owner="BuiltIn">
|
||||||
|
<arg>Login failed with ${resp.status_code}: ${detail_val}</arg>
|
||||||
|
<doc>Fails the test with the given message and optionally alters its tags.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.289309" elapsed="0.000147"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.288746" elapsed="0.000740"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.288736" elapsed="0.000778"/>
|
||||||
|
</if>
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${json}</var>
|
||||||
|
<arg>${resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.289572" elapsed="0.000056"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Get Value From Json" owner="JSONLibrary">
|
||||||
|
<var>${token}</var>
|
||||||
|
<arg>${json}</arg>
|
||||||
|
<arg>$.access_token</arg>
|
||||||
|
<doc>Get Value From JSON using JSONPath</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.289703" elapsed="0.000069"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Set Variable" owner="BuiltIn">
|
||||||
|
<var>${token_str}</var>
|
||||||
|
<arg>${token}[0]</arg>
|
||||||
|
<doc>Returns the given values which can then be assigned to a variables.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.289842" elapsed="0.000119"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Set Suite Variable" owner="BuiltIn">
|
||||||
|
<arg>${TOKEN}</arg>
|
||||||
|
<arg>${token_str}</arg>
|
||||||
|
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.290038" elapsed="0.000129"/>
|
||||||
|
</kw>
|
||||||
|
<return>
|
||||||
|
<value>${token_str}</value>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.290205" elapsed="0.000040"/>
|
||||||
|
</return>
|
||||||
|
<var>${token}</var>
|
||||||
|
<doc>Log in with the master password and return the JWT access token.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.287666" elapsed="0.002619"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Create Session" owner="RequestsLibrary">
|
||||||
|
<arg>auth</arg>
|
||||||
|
<arg>${BASE_URL}</arg>
|
||||||
|
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
|
||||||
|
<doc>Create Session: create a HTTP session to a server</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.290359" elapsed="0.000093"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.284518" elapsed="0.005967"/>
|
||||||
|
</branch>
|
||||||
|
<branch type="ELSE IF" condition="'${TOKEN}' == '${EMPTY}'">
|
||||||
|
<kw name="Login And Get Token" owner="common">
|
||||||
|
<kw name="Create Dictionary" owner="BuiltIn">
|
||||||
|
<var>${payload}</var>
|
||||||
|
<arg>password=${SETUP_PASSWORD}</arg>
|
||||||
|
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.290864" elapsed="0.000145"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/login</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=any</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.291085" elapsed="0.000075"/>
|
||||||
|
</kw>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' == '429'">
|
||||||
|
<kw name="Sleep" owner="BuiltIn">
|
||||||
|
<arg>6s</arg>
|
||||||
|
<doc>Pauses the test executed for the given time.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.291310" elapsed="0.000150"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>anon</arg>
|
||||||
|
<arg>/api/auth/login</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=any</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.291540" elapsed="0.000080"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.291223" elapsed="0.000431"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.291210" elapsed="0.000471"/>
|
||||||
|
</if>
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="'${resp.status_code}' != '200'">
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${json}</var>
|
||||||
|
<arg>${resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.291932" elapsed="0.000061"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Get Value From Json" owner="JSONLibrary">
|
||||||
|
<var>${detail}</var>
|
||||||
|
<arg>${json}</arg>
|
||||||
|
<arg>$.detail</arg>
|
||||||
|
<doc>Get Value From JSON using JSONPath</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.292068" elapsed="0.000067"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Set Variable" owner="BuiltIn">
|
||||||
|
<var>${detail_val}</var>
|
||||||
|
<arg>${detail}[0]</arg>
|
||||||
|
<doc>Returns the given values which can then be assigned to a variables.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.292209" elapsed="0.000132"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Fail" owner="BuiltIn">
|
||||||
|
<arg>Login failed with ${resp.status_code}: ${detail_val}</arg>
|
||||||
|
<doc>Fails the test with the given message and optionally alters its tags.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.292413" elapsed="0.000126"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.291830" elapsed="0.000740"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.291814" elapsed="0.000784"/>
|
||||||
|
</if>
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${json}</var>
|
||||||
|
<arg>${resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.292656" elapsed="0.000061"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Get Value From Json" owner="JSONLibrary">
|
||||||
|
<var>${token}</var>
|
||||||
|
<arg>${json}</arg>
|
||||||
|
<arg>$.access_token</arg>
|
||||||
|
<doc>Get Value From JSON using JSONPath</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.292787" elapsed="0.000083"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Set Variable" owner="BuiltIn">
|
||||||
|
<var>${token_str}</var>
|
||||||
|
<arg>${token}[0]</arg>
|
||||||
|
<doc>Returns the given values which can then be assigned to a variables.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.292940" elapsed="0.000122"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Set Suite Variable" owner="BuiltIn">
|
||||||
|
<arg>${TOKEN}</arg>
|
||||||
|
<arg>${token_str}</arg>
|
||||||
|
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.293145" elapsed="0.000156"/>
|
||||||
|
</kw>
|
||||||
|
<return>
|
||||||
|
<value>${token_str}</value>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.293341" elapsed="0.000043"/>
|
||||||
|
</return>
|
||||||
|
<var>${token}</var>
|
||||||
|
<doc>Log in with the master password and return the JWT access token.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.290703" elapsed="0.002718"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Create Session" owner="RequestsLibrary">
|
||||||
|
<arg>auth</arg>
|
||||||
|
<arg>${BASE_URL}</arg>
|
||||||
|
<arg>headers={'Authorization': 'Bearer ${token}'}</arg>
|
||||||
|
<doc>Create Session: create a HTTP session to a server</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.293492" elapsed="0.000092"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.290513" elapsed="0.003103"/>
|
||||||
|
</branch>
|
||||||
|
<branch type="ELSE">
|
||||||
|
<kw name="Create Session" owner="RequestsLibrary">
|
||||||
|
<arg>auth</arg>
|
||||||
|
<arg>${BASE_URL}</arg>
|
||||||
|
<arg>headers={'Authorization': 'Bearer ${TOKEN}'}</arg>
|
||||||
|
<doc>Create Session: create a HTTP session to a server</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.293775" elapsed="0.000083"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.293643" elapsed="0.000248"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.284499" elapsed="0.009416"/>
|
||||||
|
</if>
|
||||||
|
<doc>Create an authenticated HTTP session. Performs setup if needed, then logs in.
|
||||||
|
Skips setup/login if already authenticated (suite-level setup done).</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.282791" elapsed="0.011148"/>
|
||||||
|
</kw>
|
||||||
|
<arg>Create Anonymous Session</arg>
|
||||||
|
<arg>AND</arg>
|
||||||
|
<arg>Setup Master Password</arg>
|
||||||
|
<arg>AND</arg>
|
||||||
|
<arg>Create Authenticated Session</arg>
|
||||||
|
<doc>Executes all the given keywords in a sequence.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.278288" elapsed="0.015676"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Create List" owner="BuiltIn">
|
||||||
|
<var>${episodes}</var>
|
||||||
|
<arg>{'season': 1, 'episode': 1, 'title': 'Episode 1'}</arg>
|
||||||
|
<doc>Returns a list containing given items.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.294055" elapsed="0.000155"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Create Dictionary" owner="BuiltIn">
|
||||||
|
<var>${payload}</var>
|
||||||
|
<arg>serie_id=retry-test</arg>
|
||||||
|
<arg>serie_folder=Retry Test</arg>
|
||||||
|
<arg>serie_name=Retry Test</arg>
|
||||||
|
<arg>episodes=${episodes}</arg>
|
||||||
|
<arg>priority=NORMAL</arg>
|
||||||
|
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.294292" elapsed="0.000152"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Add To Queue" owner="api_keywords">
|
||||||
|
<kw name="POST API" owner="api_keywords">
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="$payload is ${NONE}">
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>${session}</arg>
|
||||||
|
<arg>${endpoint}</arg>
|
||||||
|
<arg>expected_status=${expected_status}</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.295095" elapsed="0.000078"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.294991" elapsed="0.000219"/>
|
||||||
|
</branch>
|
||||||
|
<branch type="ELSE">
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>${session}</arg>
|
||||||
|
<arg>${endpoint}</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=${expected_status}</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.295350" elapsed="0.000078"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.295238" elapsed="0.000228"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.294974" elapsed="0.000517"/>
|
||||||
|
</if>
|
||||||
|
<return>
|
||||||
|
<value>${resp}</value>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.295515" elapsed="0.000039"/>
|
||||||
|
</return>
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>/api/queue/add</arg>
|
||||||
|
<arg>${payload}</arg>
|
||||||
|
<arg>201</arg>
|
||||||
|
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.294816" elapsed="0.000771"/>
|
||||||
|
</kw>
|
||||||
|
<return>
|
||||||
|
<value>${resp}</value>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.295621" elapsed="0.000033"/>
|
||||||
|
</return>
|
||||||
|
<var>${add_resp}</var>
|
||||||
|
<arg>${payload}</arg>
|
||||||
|
<doc>POST /api/queue/add with the given payload.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.294563" elapsed="0.001125"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${json}</var>
|
||||||
|
<arg>${add_resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.295766" elapsed="0.000063"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Get Value From Json" owner="JSONLibrary">
|
||||||
|
<var>${ids}</var>
|
||||||
|
<arg>${json}</arg>
|
||||||
|
<arg>$.item_ids</arg>
|
||||||
|
<doc>Get Value From JSON using JSONPath</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.295907" elapsed="0.000068"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Set Variable" owner="BuiltIn">
|
||||||
|
<var>${item_id}</var>
|
||||||
|
<arg>${ids}[0]</arg>
|
||||||
|
<doc>Returns the given values which can then be assigned to a variables.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.296056" elapsed="0.000156"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Create Dictionary" owner="BuiltIn">
|
||||||
|
<var>${retry_payload}</var>
|
||||||
|
<arg>item_ids=${item_id}</arg>
|
||||||
|
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.296296" elapsed="0.000135"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="POST API" owner="api_keywords">
|
||||||
|
<if>
|
||||||
|
<branch type="IF" condition="$payload is ${NONE}">
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>${session}</arg>
|
||||||
|
<arg>${endpoint}</arg>
|
||||||
|
<arg>expected_status=${expected_status}</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.296840" elapsed="0.000071"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.296743" elapsed="0.000202"/>
|
||||||
|
</branch>
|
||||||
|
<branch type="ELSE">
|
||||||
|
<kw name="POST On Session" owner="RequestsLibrary">
|
||||||
|
<var>${resp}</var>
|
||||||
|
<arg>${session}</arg>
|
||||||
|
<arg>${endpoint}</arg>
|
||||||
|
<arg>json=${payload}</arg>
|
||||||
|
<arg>expected_status=${expected_status}</arg>
|
||||||
|
<doc>Sends a POST request on a previously created HTTP Session.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.297060" elapsed="0.000078"/>
|
||||||
|
</kw>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.296973" elapsed="0.000284"/>
|
||||||
|
</branch>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.296729" elapsed="0.000564"/>
|
||||||
|
</if>
|
||||||
|
<return>
|
||||||
|
<value>${resp}</value>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.297320" elapsed="0.000040"/>
|
||||||
|
</return>
|
||||||
|
<var>${retry_resp}</var>
|
||||||
|
<arg>/api/queue/retry</arg>
|
||||||
|
<arg>${retry_payload}</arg>
|
||||||
|
<doc>Perform an authenticated POST request with optional JSON payload.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.296561" elapsed="0.000834"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Response Should Have Status" owner="common">
|
||||||
|
<kw name="Should Be Equal As Integers" owner="BuiltIn">
|
||||||
|
<arg>${response.status_code}</arg>
|
||||||
|
<arg>${expected_status}</arg>
|
||||||
|
<doc>Fails if objects are unequal after converting them to integers.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.297651" elapsed="0.000274"/>
|
||||||
|
</kw>
|
||||||
|
<arg>${retry_resp}</arg>
|
||||||
|
<arg>200</arg>
|
||||||
|
<doc>Assert that the response status code matches the expected value.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.297494" elapsed="0.000518"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Convert String To Json" owner="JSONLibrary">
|
||||||
|
<var>${retry_json}</var>
|
||||||
|
<arg>${retry_resp.text}</arg>
|
||||||
|
<doc>Convert String to JSON object</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.298167" elapsed="0.000148"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Dictionary Should Contain Key" owner="Collections">
|
||||||
|
<arg>${retry_json}</arg>
|
||||||
|
<arg>retried_count</arg>
|
||||||
|
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.298434" elapsed="0.000119"/>
|
||||||
|
</kw>
|
||||||
|
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
|
||||||
|
<doc>Removes all the session objects</doc>
|
||||||
|
<status status="NOT RUN" start="2026-06-26T18:51:25.298789" elapsed="0.000093"/>
|
||||||
|
</kw>
|
||||||
|
<msg time="2026-06-26T18:51:25.302305" level="INFO">Starting Browser process /home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js using at 127.0.0.1:35183</msg>
|
||||||
|
<doc>Retry a failed download item.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.277224" elapsed="0.021705"/>
|
||||||
|
</test>
|
||||||
|
<doc>Download queue API tests for Aniworld.
|
||||||
|
Covers status, add, start/stop/pause/resume, clear, retry, and remove.</doc>
|
||||||
|
<status status="PASS" start="2026-06-26T18:51:25.067278" elapsed="0.673101"/>
|
||||||
|
</suite>
|
||||||
|
<statistics>
|
||||||
|
<total>
|
||||||
|
<stat pass="1" fail="0" skip="0">All Tests</stat>
|
||||||
|
</total>
|
||||||
|
<tag>
|
||||||
|
</tag>
|
||||||
|
<suite>
|
||||||
|
<stat name="Download" id="s1" pass="1" fail="0" skip="0">Download</stat>
|
||||||
|
</suite>
|
||||||
|
</statistics>
|
||||||
|
<errors>
|
||||||
|
</errors>
|
||||||
|
</robot>
|
||||||
9
playwright-log.txt
Normal file
9
playwright-log.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{"level":"info","time":"2026-06-26T16:51:25.695Z","seq":1,"component":"browser-library","msg":"Listening on 127.0.0.1:35183"}
|
||||||
|
{"level":"error","time":"2026-06-26T16:51:25.731Z","seq":2,"component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T16:51:25.738Z","seq":3,"suite_id":"s1","suite_name":"Download","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T16:51:25.739Z","seq":4,"suite_id":"s1","suite_name":"Download","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"error","time":"2026-06-26T16:51:25.741Z","seq":5,"suite_id":"s1","suite_name":"Download","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T16:51:25.746Z","seq":6,"component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T16:51:25.747Z","seq":7,"component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T16:51:25.784Z","seq":8,"component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T16:51:25.784Z","seq":9,"component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}
|
||||||
2729
report.html
Normal file
2729
report.html
Normal file
File diff suppressed because one or more lines are too long
BIN
robot_output/browser/screenshot/fail-screenshot-1.png
Normal file
BIN
robot_output/browser/screenshot/fail-screenshot-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 348 KiB |
2467
robot_output/log.html
Normal file
2467
robot_output/log.html
Normal file
File diff suppressed because one or more lines are too long
1679
robot_output/output.xml
Normal file
1679
robot_output/output.xml
Normal file
File diff suppressed because it is too large
Load Diff
226
robot_output/playwright-log.txt
Normal file
226
robot_output/playwright-log.txt
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
{"level":"info","time":"2026-06-26T19:01:26.202Z","seq":1,"component":"browser-library","msg":"Listening on 127.0.0.1:40597"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.263Z","seq":2,"component":"browser-library","event_kind":"grpc","action":"newPage","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.264Z","seq":3,"component":"browser-library","msg":"No active browser, creating a new one"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.318Z","seq":4,"component":"browser-library","msg":"Setting default timeout for context context=d175c6c3-4b1d-4b0b-a765-ea73098025fc to 10000"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.319Z","seq":5,"component":"browser-library","msg":"Changed active context: context=d175c6c3-4b1d-4b0b-a765-ea73098025fc"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.361Z","seq":6,"component":"browser-library","msg":"Video path: undefined"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.361Z","seq":7,"component":"browser-library","msg":"Changed active page"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.651Z","seq":8,"component":"browser-library","event_kind":"grpc","action":"newPage","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.663Z","seq":9,"component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.664Z","seq":10,"component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.682Z","seq":11,"component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.685Z","seq":12,"component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.686Z","seq":13,"component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.689Z","seq":14,"component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.692Z","seq":15,"component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.692Z","seq":16,"component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-toggle in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.695Z","seq":17,"component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.698Z","seq":18,"component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.701Z","seq":19,"component":"browser-library","msg":"Removed page=09f7a0ce-587a-4766-8f97-62ed642a973b from context=d175c6c3-4b1d-4b0b-a765-ea73098025fc page stack"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.717Z","seq":20,"component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}
|
||||||
|
{"level":"error","time":"2026-06-26T19:01:26.719Z","seq":21,"component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.723Z","seq":22,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.723Z","seq":23,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.726Z","seq":24,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.726Z","seq":25,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.747Z","seq":26,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"newPage","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.747Z","seq":27,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"No active browser, creating a new one"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.789Z","seq":28,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Setting default timeout for context context=39202e9e-49fd-43c8-ace8-aefc1f8fc86a to 10000"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.789Z","seq":29,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Changed active context: context=39202e9e-49fd-43c8-ace8-aefc1f8fc86a"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.817Z","seq":30,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Video path: undefined"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:26.817Z","seq":31,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Changed active page"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.135Z","seq":32,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"newPage","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.138Z","seq":33,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.138Z","seq":34,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.161Z","seq":35,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.163Z","seq":36,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.163Z","seq":37,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.195Z","seq":38,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.198Z","seq":39,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:27.198Z","seq":40,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=search-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.490Z","seq":41,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.498Z","seq":42,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.498Z","seq":43,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=search-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.500Z","seq":44,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.503Z","seq":45,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.505Z","seq":46,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","msg":"Removed page=239186fc-38e8-4837-8481-220447e809d4 from context=39202e9e-49fd-43c8-ace8-aefc1f8fc86a page stack"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.521Z","seq":47,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}
|
||||||
|
{"level":"error","time":"2026-06-26T19:01:28.523Z","seq":48,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Valid Password","test_id":"s1-t2","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.525Z","seq":49,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.526Z","seq":50,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.528Z","seq":51,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.528Z","seq":52,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.548Z","seq":53,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"newPage","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.548Z","seq":54,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"No active browser, creating a new one"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.590Z","seq":55,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Setting default timeout for context context=94ca32a1-e9f6-4c9c-9638-3ded8a5ebe3f to 10000"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.590Z","seq":56,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Changed active context: context=94ca32a1-e9f6-4c9c-9638-3ded8a5ebe3f"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.620Z","seq":57,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Video path: undefined"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:28.620Z","seq":58,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Changed active page"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.051Z","seq":59,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"newPage","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.054Z","seq":60,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.055Z","seq":61,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.075Z","seq":62,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.077Z","seq":63,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.077Z","seq":64,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.111Z","seq":65,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.114Z","seq":66,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.114Z","seq":67,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.139Z","seq":68,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.142Z","seq":69,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"getText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.142Z","seq":70,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.142Z","seq":71,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Getting text content with text type ROBOT_FRAMEWORK_BROWSER_NO_SET"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.142Z","seq":72,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Getting text content without text type"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.157Z","seq":73,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Locator was not an <input>, <textarea>, or <select> element, falling back to innerText."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.159Z","seq":74,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Retrieved text for element id=login-error containing '[\"invalid credentials\"]' with text type ROBOT_FRAMEWORK_BROWSER_NO_SET"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.159Z","seq":75,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"getText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.162Z","seq":76,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.164Z","seq":77,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","msg":"Removed page=26abafb1-23cd-4e81-966f-3f12b990aaba from context=94ca32a1-e9f6-4c9c-9638-3ded8a5ebe3f page stack"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.177Z","seq":78,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}
|
||||||
|
{"level":"error","time":"2026-06-26T19:01:29.178Z","seq":79,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login With Invalid Password","test_id":"s1-t3","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.181Z","seq":80,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.181Z","seq":81,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.183Z","seq":82,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.183Z","seq":83,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.211Z","seq":84,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"newPage","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.211Z","seq":85,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"No active browser, creating a new one"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.264Z","seq":86,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Setting default timeout for context context=849d8401-0199-4e2e-a920-c2415c6541a5 to 10000"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.265Z","seq":87,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Changed active context: context=849d8401-0199-4e2e-a920-c2415c6541a5"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.298Z","seq":88,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Video path: undefined"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.298Z","seq":89,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Changed active page"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.638Z","seq":90,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"newPage","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.644Z","seq":91,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.644Z","seq":92,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.668Z","seq":93,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.673Z","seq":94,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.674Z","seq":95,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.715Z","seq":96,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.719Z","seq":97,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.720Z","seq":98,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.748Z","seq":99,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.751Z","seq":100,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.751Z","seq":101,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.760Z","seq":102,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.763Z","seq":103,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:29.763Z","seq":104,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.009Z","seq":105,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.012Z","seq":106,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.012Z","seq":107,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.040Z","seq":108,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.042Z","seq":109,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.043Z","seq":110,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.046Z","seq":111,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.049Z","seq":112,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.049Z","seq":113,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.109Z","seq":114,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.111Z","seq":115,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.111Z","seq":116,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.134Z","seq":117,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.137Z","seq":118,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.137Z","seq":119,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.142Z","seq":120,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.144Z","seq":121,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.144Z","seq":122,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.209Z","seq":123,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.211Z","seq":124,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.211Z","seq":125,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.235Z","seq":126,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.238Z","seq":127,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.238Z","seq":128,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.242Z","seq":129,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.244Z","seq":130,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.244Z","seq":131,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.309Z","seq":132,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.312Z","seq":133,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.312Z","seq":134,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.335Z","seq":135,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.338Z","seq":136,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.339Z","seq":137,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.342Z","seq":138,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.345Z","seq":139,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.345Z","seq":140,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.409Z","seq":141,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.412Z","seq":142,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.412Z","seq":143,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.436Z","seq":144,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.439Z","seq":145,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"getText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.440Z","seq":146,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-error in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.440Z","seq":147,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Getting text content with text type ROBOT_FRAMEWORK_BROWSER_NO_SET"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.440Z","seq":148,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Getting text content without text type"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.458Z","seq":149,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Locator was not an <input>, <textarea>, or <select> element, falling back to innerText."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.460Z","seq":150,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Retrieved text for element id=login-error containing '[\"Too many authentication attempts, try again later. IP lockout\"]' with text type ROBOT_FRAMEWORK_BROWSER_NO_SET"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.460Z","seq":151,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"getText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.464Z","seq":152,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.466Z","seq":153,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","msg":"Removed page=138d3846-0517-4827-82a9-837d2e9eb6ea from context=849d8401-0199-4e2e-a920-c2415c6541a5 page stack"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.486Z","seq":154,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}
|
||||||
|
{"level":"error","time":"2026-06-26T19:01:30.488Z","seq":155,"suite_id":"s1","suite_name":"Login","test_name":"Login.Login Rate Limit UI","test_id":"s1-t4","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.493Z","seq":156,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.493Z","seq":157,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.497Z","seq":158,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:01:30.497Z","seq":159,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.525Z","seq":160,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"newPage","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.525Z","seq":161,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"No active browser, creating a new one"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.577Z","seq":162,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Setting default timeout for context context=75848ec4-2e66-4e9b-9447-b534aa3a6ae2 to 10000"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.577Z","seq":163,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Changed active context: context=75848ec4-2e66-4e9b-9447-b534aa3a6ae2"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.617Z","seq":164,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Video path: undefined"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.617Z","seq":165,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Changed active page"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.964Z","seq":166,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"newPage","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.967Z","seq":167,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.967Z","seq":168,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.994Z","seq":169,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.997Z","seq":170,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getElementAttribute","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:00.997Z","seq":171,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.014Z","seq":172,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Retrieved attribute for element id=password-input containing password"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.014Z","seq":173,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getElementAttribute","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.018Z","seq":174,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.018Z","seq":175,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-toggle in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.057Z","seq":176,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.059Z","seq":177,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getElementAttribute","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.059Z","seq":178,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.063Z","seq":179,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Retrieved attribute for element id=password-input containing text"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.063Z","seq":180,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getElementAttribute","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.066Z","seq":181,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.066Z","seq":182,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-toggle in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.105Z","seq":183,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.108Z","seq":184,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getElementAttribute","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.108Z","seq":185,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.112Z","seq":186,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Retrieved attribute for element id=password-input containing password"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.112Z","seq":187,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"getElementAttribute","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.115Z","seq":188,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.117Z","seq":189,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","msg":"Removed page=ba69b8c0-5d52-4ad5-9add-718be61b8c40 from context=75848ec4-2e66-4e9b-9447-b534aa3a6ae2 page stack"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.135Z","seq":190,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}
|
||||||
|
{"level":"error","time":"2026-06-26T19:03:01.137Z","seq":191,"suite_id":"s1","suite_name":"Login","test_name":"Login.Password Visibility Toggle","test_id":"s1-t5","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.140Z","seq":192,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.140Z","seq":193,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.143Z","seq":194,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.143Z","seq":195,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.164Z","seq":196,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"newPage","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.164Z","seq":197,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"No active browser, creating a new one"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.210Z","seq":198,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"Setting default timeout for context context=6d36e1fc-c058-47b5-b5b1-757f52ea7a5f to 10000"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.210Z","seq":199,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"Changed active context: context=6d36e1fc-c058-47b5-b5b1-757f52ea7a5f"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.239Z","seq":200,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"Video path: undefined"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.239Z","seq":201,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"Changed active page"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.493Z","seq":202,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"newPage","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.496Z","seq":203,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"fillText","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.496Z","seq":204,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=password-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.518Z","seq":205,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"fillText","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.521Z","seq":206,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"click","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.521Z","seq":207,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=login-submit-btn in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.557Z","seq":208,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"click","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.560Z","seq":209,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:01.560Z","seq":210,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"Strict mode is enabled, find Locator with id=search-input in page."}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.561Z","seq":211,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"waitForElementState","status":"failed"}
|
||||||
|
{"level":"error","time":"2026-06-26T19:03:06.561Z","seq":212,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"TimeoutError2","msg":"locator.waitFor: Timeout 5000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('id=search-input') to be visible\u001b[22m\n\n at waitForElementState (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:11517:19)\n at async PlaywrightServer.waitForElementsState (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13529:26)"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.564Z","seq":213,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"takeScreenshot","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.564Z","seq":214,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","Take screenshot with options: ":{"path":"/home/lukas/Volume/repo/Aniworld/robot_output/browser/screenshot/fail-screenshot-1.png","fileType":"png","fullPage":false,"timeout":10000,"omitBackground":false}}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.765Z","seq":215,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"takeScreenshot","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.773Z","seq":216,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.775Z","seq":217,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","msg":"Removed page=bd27ef36-4fe8-4cac-aaa1-638f0fb57ee9 from context=6d36e1fc-c058-47b5-b5b1-757f52ea7a5f page stack"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.789Z","seq":218,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}
|
||||||
|
{"level":"error","time":"2026-06-26T19:03:06.792Z","seq":219,"suite_id":"s1","suite_name":"Login","test_name":"Login.Logout","test_id":"s1-t6","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.795Z","seq":220,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.795Z","seq":221,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"error","time":"2026-06-26T19:03:06.797Z","seq":222,"suite_id":"s1","suite_name":"Login","component":"browser-library","event_kind":"grpc_error","status":"failed","error_type":"Error","msg":"Error: Browser has been closed.\n at PlaywrightState.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:12594:13)\n at PlaywrightServer.getActiveBrowser (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13516:52)\n at PlaywrightServer.setTimeout (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/index.js:13734:56)\n at Object.onReceiveHalfClose (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server.js:1478:25)\n at BaseServerInterceptingCall.maybePushNextMessage (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:594:31)\n at BaseServerInterceptingCall.handleEndEvent (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:634:14)\n at ServerHttp2Stream.<anonymous> (/home/lukas/miniconda3/lib/python3.13/site-packages/Browser/wrapper/node_modules/@grpc/grpc-js/build/src/server-interceptors.js:387:18)\n at ServerHttp2Stream.emit (node:events:531:35)\n at endReadableNT (node:internal/streams/readable:1698:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:89:21)"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.800Z","seq":223,"component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.800Z","seq":224,"component":"browser-library","event_kind":"grpc","action":"getBrowserCatalog","status":"succeeded"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.831Z","seq":225,"component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"started"}
|
||||||
|
{"level":"info","time":"2026-06-26T19:03:06.831Z","seq":226,"component":"browser-library","event_kind":"grpc","action":"closeAllBrowsers","status":"succeeded"}
|
||||||
2729
robot_output/report.html
Normal file
2729
robot_output/report.html
Normal file
File diff suppressed because one or more lines are too long
@@ -186,22 +186,12 @@ class AuthService:
|
|||||||
self._failed.pop(identifier, None)
|
self._failed.pop(identifier, None)
|
||||||
|
|
||||||
def _check_locked(self, identifier: str) -> None:
|
def _check_locked(self, identifier: str) -> None:
|
||||||
import os
|
|
||||||
if os.getenv("ANIWORLD_TESTING") == "1":
|
|
||||||
return
|
|
||||||
rec = self._get_fail_record(identifier)
|
rec = self._get_fail_record(identifier)
|
||||||
lu = rec.get("locked_until")
|
lu = rec.get("locked_until")
|
||||||
if lu and datetime.now(timezone.utc) < lu:
|
if lu and datetime.now(timezone.utc) < lu:
|
||||||
raise LockedOutError(
|
raise LockedOutError(
|
||||||
"Too many failed attempts - temporarily locked out"
|
"Too many failed attempts - temporarily locked out"
|
||||||
)
|
)
|
||||||
if lu and datetime.now(timezone.utc) >= lu:
|
|
||||||
# lock expired, reset
|
|
||||||
self._failed[identifier] = {
|
|
||||||
"count": 0,
|
|
||||||
"last": None,
|
|
||||||
"locked_until": None,
|
|
||||||
}
|
|
||||||
|
|
||||||
# --- authentication ---
|
# --- authentication ---
|
||||||
def validate_master_password(
|
def validate_master_password(
|
||||||
|
|||||||
@@ -302,9 +302,8 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Form submission
|
// Form submission
|
||||||
const loginForm = document.getElementById('login-form');
|
const loginForm = document.getElementById('login-form');
|
||||||
const loginButton = document.getElementById('login-submit-btn');
|
const loginButton = document.getElementById('login-submit-btn');
|
||||||
const messageContainer = document.getElementById('message-container');
|
|
||||||
|
|
||||||
loginForm.addEventListener('submit', async (e) => {
|
loginForm.addEventListener('submit', async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|||||||
@@ -108,8 +108,13 @@ Setup Master Password
|
|||||||
... backup_enabled=False
|
... backup_enabled=False
|
||||||
${resp}= POST On Session anon /api/auth/setup json=${payload} expected_status=any
|
${resp}= POST On Session anon /api/auth/setup json=${payload} expected_status=any
|
||||||
IF '${resp.status_code}' == '429'
|
IF '${resp.status_code}' == '429'
|
||||||
# Rate limited - wait and retry once
|
# Rate limited - wait and retry
|
||||||
Sleep 6s
|
Sleep 45s
|
||||||
|
${resp}= POST On Session anon /api/auth/setup json=${payload} expected_status=any
|
||||||
|
END
|
||||||
|
IF '${resp.status_code}' == '429'
|
||||||
|
# Still rate limited - wait longer and retry again
|
||||||
|
Sleep 45s
|
||||||
${resp}= POST On Session anon /api/auth/setup json=${payload} expected_status=any
|
${resp}= POST On Session anon /api/auth/setup json=${payload} expected_status=any
|
||||||
END
|
END
|
||||||
IF '${resp.status_code}' == '400'
|
IF '${resp.status_code}' == '400'
|
||||||
|
|||||||
66
tests/robot/resources/websocket_keywords.py
Normal file
66
tests/robot/resources/websocket_keywords.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
"""WebSocket keyword library for Robot Framework tests."""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
import websockets
|
||||||
|
from robot.api import logger
|
||||||
|
|
||||||
|
|
||||||
|
class WebSocketKeywords:
|
||||||
|
"""Keywords for WebSocket testing."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._connection: Optional[websockets.WebSocketClientProtocol] = None
|
||||||
|
|
||||||
|
def connect_to_websocket(self, ws_url: str) -> str:
|
||||||
|
"""Establish a WebSocket connection and return connection info.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ws_url: Full WebSocket URL including token query param.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
String representation of the connected WebSocket.
|
||||||
|
"""
|
||||||
|
asyncio.run(self._async_connect(ws_url))
|
||||||
|
return f"Connected to {ws_url}"
|
||||||
|
|
||||||
|
async def _async_connect(self, ws_url: str) -> None:
|
||||||
|
self._connection = await websockets.connect(ws_url)
|
||||||
|
logger.info(f"WebSocket connected: {self._connection}")
|
||||||
|
|
||||||
|
def send_websocket_message(self, message: str) -> None:
|
||||||
|
"""Send a text message over the active WebSocket connection.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
message: Text message to send.
|
||||||
|
"""
|
||||||
|
if self._connection is None:
|
||||||
|
raise RuntimeError("No active WebSocket connection. Use Connect To WebSocket first.")
|
||||||
|
asyncio.run(self._connection.send(message))
|
||||||
|
logger.info(f"Sent message: {message}")
|
||||||
|
|
||||||
|
def receive_websocket_message(self, timeout: float = 5.0) -> str:
|
||||||
|
"""Receive a text message from the active WebSocket connection.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
timeout: Maximum seconds to wait for a message.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The received text message.
|
||||||
|
"""
|
||||||
|
if self._connection is None:
|
||||||
|
raise RuntimeError("No active WebSocket connection. Use Connect To WebSocket first.")
|
||||||
|
try:
|
||||||
|
message = asyncio.run(asyncio.wait_for(self._connection.recv(), timeout=timeout))
|
||||||
|
logger.info(f"Received message: {message}")
|
||||||
|
return message
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
raise TimeoutError(f"No message received within {timeout} seconds")
|
||||||
|
|
||||||
|
def close_websocket(self) -> None:
|
||||||
|
"""Close the active WebSocket connection."""
|
||||||
|
if self._connection is not None:
|
||||||
|
asyncio.run(self._connection.close())
|
||||||
|
self._connection = None
|
||||||
|
logger.info("WebSocket closed")
|
||||||
Reference in New Issue
Block a user