{{ i18n.template.report_title if i18n.template else 'webqa agent Test Report' }}
{{ i18n.template.test_config if i18n.template else 'Test Configuration' }}
{{ i18n.template.passed if i18n.template else 'Passed' }}: {{ passed_count + warning_count }}{% if warning_count > 0 %} {{ i18n.template.warning if i18n.template else 'Warning' }}{{ warning_count }} {{ i18n.template.warning_tooltip if i18n.template else 'test cases have warnings' }}{% endif %}
{{ i18n.template.failed if i18n.template else 'Failed' }}: {{ failed_count }}
{{ i18n.template.exception if i18n.template else 'Exception' }}: {{ exception_count }}
{{ i18n.template.total if i18n.template else 'Total' }}: {{ total_count }}
{% for case in test_cases %} {% if loop.first and case.config %} {% if case.config.target_url %}
{{ i18n.template.target_url if i18n.template else 'Target URL' }}
{{ case.config.target_url }}
{% endif %} {% if case.config.llm_model %}
{{ i18n.template.model_used if i18n.template else 'Model Used' }}
{{ i18n.template.main_model if i18n.template else 'Main Model' }}: {{ case.config.llm_model }}
{% endif %} {% if case.config.browser_config %}
{{ i18n.template.browser_config if i18n.template else 'Browser Config' }}
{% if case.config.browser_config.viewport %}
{{ i18n.template.window_size if i18n.template else 'Window Size' }}: {{ case.config.browser_config.viewport.width }} × {{ case.config.browser_config.viewport.height }}
{% endif %} {% if case.config.browser_config.language %}
{{ i18n.template.browser_language if i18n.template else 'Browser Language' }}: {{ case.config.browser_config.language }}
{% endif %} {% if case.config.browser_config.headless is defined %}
{{ i18n.template.headless_mode if i18n.template else 'Headless Mode' }}: {{ (i18n.template.yes if i18n.template else 'Yes') if case.config.browser_config.headless else (i18n.template.no if i18n.template else 'No') }}
{% endif %}
{% endif %} {% if case.config.ignore_rules %}
{{ i18n.template.ignore_rules if i18n.template else 'Ignore Rules' }}
{% if case.config.ignore_rules.console %}
{{ i18n.template.console_errors if i18n.template else 'Console Errors' }}:
    {% for rule in case.config.ignore_rules.console %}
  • {{ rule.pattern }} ({{ rule.match_type }})
  • {% endfor %}
{% endif %} {% if case.config.ignore_rules.network %}
{{ i18n.template.network_requests if i18n.template else 'Network Requests' }}:
    {% for rule in case.config.ignore_rules.network %}
  • {{ rule.pattern }} ({{ rule.type }})
  • {% endfor %}
{% endif %}
{% endif %} {% if case.config.env %}
{{ i18n.template.environment if i18n.template else 'Environment' }}
{{ case.config.env }}
{% endif %} {% endif %} {% endfor %}
{% for summary in case_summaries %}
{{ i18n.template.case if i18n.template else 'Case' }} {{ summary.index }}: {{ summary.name }} {% if summary.status == "passed" %} {{ i18n.template.passed if i18n.template else 'Passed' }} {% elif summary.status == "warning" %} {{ i18n.template.passed if i18n.template else 'Passed' }} {{ i18n.template.warning if i18n.template else 'Warning' }} {{ i18n.template.this_case_has_warning if i18n.template else 'This test case has warnings' }} {% else %} {{ i18n.template.failed if i18n.template else 'Failed' }} {% endif %}
{% endfor %}
{% for summary in case_summaries %}
{{ i18n.template.case if i18n.template else 'Case' }} {{ summary.index }}: {{ summary.name }} {% if summary.status == "passed" %} {{ i18n.template.passed if i18n.template else 'Passed' }} {% elif summary.status == "warning" %} {{ i18n.template.passed if i18n.template else 'Passed' }} {{ i18n.template.this_case_has_warning if i18n.template else 'This test case has warnings' }} {% else %} {{ i18n.template.failed if i18n.template else 'Failed' }} {% endif %}
{% endfor %}
👈 {{ 'Swipe left and right to view different panels' if language == 'en-US' else '左右滑动查看不同面板' }} 👉
{% for case in test_cases %} {% set case_index = loop.index0 %}
{% for step in case.steps %}
{{ i18n.template.step if i18n.template else 'Step' }} {{ step.id }} {% if step.status == "passed" %} {{ i18n.template.passed if i18n.template else 'Passed' }} {% elif step.status == "warning" %} {{ i18n.template.warning if i18n.template else 'Warning' }} {% else %} {{ i18n.template.failed if i18n.template else 'Failed' }} {% endif %}
{{ step.description }}
{{ step.timestamp }}
{% endfor %}
{% for step in case.steps %} {% set step_index = loop.index0 %}
{% if step.screenshots %} {% for screenshot in step.screenshots %} {% set screenshot_name = screenshot.label if screenshot.label else "Screenshot" %}
{% if 'marker' in screenshot_name %} Screenshot Marker {% elif 'assertion_state' in screenshot_name or 'assert' in screenshot_name %} Screenshot Assert {% elif 'action_' in screenshot_name %} {% if '_' in screenshot_name %} {% set action_type = screenshot_name.split('_')[2] if screenshot_name.split('_')|length > 2 else '' %} Screenshot Action: {{ action_type }} {% else %} Screenshot Action {% endif %} {% else %} Screenshot {{ loop.index }} {% endif %}
{# 懒加载优化:只在图片进入可视区域时才加载 #} screenshot
{% endfor %} {% else %}
{{ i18n.template.no_screenshots if i18n.template else 'No screenshots' }}
{% endif %}
{% endfor %}
{% for step in case.steps %} {% set step_index = loop.index0 %}
{{ i18n.template.action if i18n.template else 'Action' }}
{% if step.actions %} {% for action in step.actions %} {% set action_index = loop.index0 %}
{{ loop.index }}. {{ action.description }}
{% if action.success %}✓ {{ 'Success' if language == 'en-US' else '成功' }}{% else %}✗ {{ 'Failed' if language == 'en-US' else '失败' }}{% endif %}
{% if action.details %}
{{ action.details }}
{% endif %}
{% endfor %} {% endif %}
模型输出
{% if step.modelIO %}
{{ step.modelIO|render_modelio|safe }}
{% else %}
{{ 'No model data in this step' if language == 'en-US' else '此步骤无模型数据' }}
{% endif %}
{% endfor %}
{{ 'Page Results' if language == 'en-US' else '页面结果' }}
{% if case.messages %}
{{ 'Console Errors' if language == 'en-US' else '控制台错误' }}
{{ case.messages.console_error_message|length }}
{% if case.messages.console_error_message %} {% for error in case.messages.console_error_message %}
{{ error.msg }}
{% if error.location %}
at {{ error.location }}
{% endif %}
{% endfor %} {% else %}
{{ i18n.template.no_console_logs if i18n.template else 'No console logs' }}
{% endif %}
{{ 'Network Requests' if language == 'en-US' else '网络请求' }}
{{ case.messages.network_message.responses|length + case.messages.network_message.failed_requests|length }}
{% if case.messages.network_message.failed_requests %}
{% for request in case.messages.network_message.failed_requests %} {% endfor %}
{{ i18n.template.failed if i18n.template else 'Failed' }} {{ i18n.template.method if i18n.template else 'Method' }} {{ i18n.template.url if i18n.template else 'URL' }} {{ 'Error' if language == 'en-US' else '错误' }}
{{ i18n.template.failed if i18n.template else 'Failed' }} {{ request.method }} {{ request.url }} {{ request.error }}
{% if request.url %}

Request URL:

{{ request.url }}
{% endif %} {% if request.payload %}

Request Payload:

{{ request.payload|tojson(indent=2)|decode_unicode }}
{% endif %} {% if request.error %}

Error:

{{ request.error }}
{% endif %}
{% endif %} {% if case.messages.network_message.responses %}
{% for response in case.messages.network_message.responses %} {% endfor %}
{{ i18n.template.status if i18n.template else 'Status' }} {{ i18n.template.method if i18n.template else 'Method' }} {{ i18n.template.type if i18n.template else 'Type' }} {{ i18n.template.url if i18n.template else 'URL' }}
{{ response.status }} {{ response.method }} {{ response.content_type }} {{ response.url }}
{% if response.url %}

Request url:

{{ response.url }}
{% endif %} {% if response.payload %}

Request Payload:

{{ response.payload|tojson(indent=2)|decode_unicode }}
{% endif %} {% if response.headers %}

Response Headers:

{{ response.headers|tojson(indent=2)|decode_unicode }}
{% endif %} {% if response.body and not response.is_sse %}

Response Body:

{{ response.body|tojson(indent=2)|decode_unicode }}
{% endif %} {% if response.is_sse and response.sse_messages %}

SSE Messages:

{% for message in response.sse_messages %}
{% set decoded_data = message.data|decode_unicode %}
                                                                        {%- for key, value in decoded_data.items() -%}
                                                                        "{{ key }}": {% if key == "answer" %}"{{ value }}"{% else %}{{ value|tojson }}{% endif %}{% if not loop.last %},
                                                                        {% endif %}
                                                                        {%- endfor -%}
                                                                    
{% endfor %}
{% endif %}
{% endif %} {% if not case.messages.network_message.responses and not case.messages.network_message.failed_requests %}
{{ i18n.template.no_network_activity if i18n.template else 'No network activity' }}
{% endif %}
{% else %}
{{ 'No page results data' if language == 'en-US' else '无页面结果数据' }}
{% endif %}
{% endfor %}