<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.3.2 (Python 3.9.6 on darwin)" generated="2026-04-16T22:15:04.411367" rpa="false" schemaversion="5">
<suite id="s1" name="Profit Analysis" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/invite/profit_analysis.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.499265" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-16T22:15:04.499157" elapsed="0.000125"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.499418" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-04-16T22:15:04.499329" elapsed="0.000112"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.499573" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-16T22:15:04.499488" elapsed="0.000104"/>
</kw>
<status status="PASS" start="2026-04-16T22:15:04.499451" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-16T22:15:04.499318" elapsed="0.000296"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.499878" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-16T22:15:04.499828" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.499983" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.500031" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.500075" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.500119" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.500162" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-04-16T22:15:04.499920" elapsed="0.000260"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.500532" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-04-16T22:15:04.500248" elapsed="0.000301"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.500890" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-04-16T22:15:04.500591" elapsed="0.000316"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.501205" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-04-16T22:15:04.500950" elapsed="0.000272"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.501521" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-04-16T22:15:04.501264" elapsed="0.000273"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.501849" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-04-16T22:15:04.501579" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.502190" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-04-16T22:15:04.501908" elapsed="0.000300"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.502538" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-04-16T22:15:04.502255" elapsed="0.000301"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.502888" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-04-16T22:15:04.502603" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-04-16T22:15:04.500189" elapsed="0.002732"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.502975" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.503027" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.503076" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.503141" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.503189" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.503234" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.503275" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:04.503319" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-04-16T22:15:04.502932" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-16T22:15:04.499914" elapsed="0.003479"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.503490" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-16T22:15:04.503428" elapsed="0.000080"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-16T22:15:04.503635" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=0 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-16T22:15:04.503548" elapsed="0.000165"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-16T22:15:04.499723" elapsed="0.004017"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.503815" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-16T22:15:04.503782" elapsed="0.000049"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-16T22:15:04.498811" elapsed="0.005040"/>
</kw>
<test id="s1-t1" name="获取用户收益信息" line="13">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.504491" level="INFO">&amp;{params} = { user-id=65340186169 }</msg>
<var>&amp;{params}</var>
<arg>user-id=${USER_ID}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-16T22:15:04.504359" elapsed="0.000144"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-16T22:15:04.505077" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.2.7(7051);iPhone | app-version-name=1.2.7 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7051 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=C729D1EE-AF40-4C94-8B5A-BBA1E4432D9D</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-16T22:15:04.504804" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-16T22:15:04.505350" elapsed="0.000120"/>
</kw>
<status status="PASS" start="2026-04-16T22:15:04.505137" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-16T22:15:04.505130" elapsed="0.000364"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-16T22:15:04.505509" elapsed="0.000017"/>
</return>
<msg time="2026-04-16T22:15:04.505599" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.2.7(7051);iPhone', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<arg>app_version=1.2.7</arg>
<arg>build_code=7051</arg>
<arg>token=${ACCESS_TOKEN}</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-04-16T22:15:04.504610" elapsed="0.000999"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>uid=${USER_ID}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-16T22:15:04.505674" elapsed="0.000077"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-16T22:15:05.226174" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/invite/public/user-team/profit/user?user-id=65340186169 
 path_url=/v1/invite/public/user-team/profit/user?user-id=65340186169 
 headers={'user-agent': 'BitradeX-Prod 1.2.7(7051);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7051', 'app-channel': 'ios-prod', 'app-os': 'ios', 'platform': 'USER', 'client-code': 'C729D1EE-AF40-4C94-8B5A-BBA1E4432D9D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex.mobi', 'authorization': 'Bearer eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6ImF1dGgiLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc2NDMzNzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.Yfb24htZ0T-V99afB8n0spcQLkGodZMzDp4v_GvsielgzxhbGZ3TqQ_HvX8JGPMyEfKb0a6bIv7e70d8Eiz4C2yoKaSGdBZI2q_y5S_XJs7wRstzgBCJliU7e6lJCpnd4Ivav9n1z_z4nh_p0NXfAY1WjXvkCZ3x-oBuX5NzR7U', 'uid': '65340186169'} 
 body=None 
 </msg>
<msg time="2026-04-16T22:15:05.226315" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/invite/public/user-team/profit/user?user-id=65340186169 
 status=200, reason=OK 
 headers={'Date': 'Thu, 16 Apr 2026 14:15:05 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '2722646a1957852747af7d392ff408ee', 'X-Transparent': '00-2722646a1957852747af7d392ff408ee-5eb8c394b2e4491f-01', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9ed3ccd1180e8511-HKG'} 
 body={"code":401,"msg":"登录失效，请重试","msgInfo":{"template":"Token expire."},"ts":1776348905197} 
 </msg>
<msg time="2026-04-16T22:15:05.226502" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-04-16T22:15:05.226631" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-16T22:15:04.505813" elapsed="0.720839"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-16T22:15:05.226988" elapsed="0.000448"/>
</kw>
<msg time="2026-04-16T22:15:05.227540" level="INFO">${has_code} = True</msg>
<var>${has_code}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-16T22:15:05.226841" elapsed="0.000717"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:05.228075" level="INFO">${biz_code} = </msg>
<var>${biz_code}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-16T22:15:05.227697" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${has_code}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-16T22:15:05.228591" level="INFO">${biz_code} = 401</msg>
<var>${biz_code}</var>
<arg>${response.json()['code']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-16T22:15:05.228272" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-16T22:15:05.228172" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-04-16T22:15:05.228154" elapsed="0.000493"/>
</if>
<if>
<branch type="IF" condition="${response.status_code} == 401 or '${biz_code}' == '401'">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="刷新Token并重试" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-16T22:15:05.229562" level="INFO">Token已过期，尝试使用refreshToken刷新...</msg>
<arg>Token已过期，尝试使用refreshToken刷新...</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-16T22:15:05.229505" elapsed="0.000084"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-16T22:15:05.230462" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.2.7(7050);iPhone | app-version-name=1.2.7 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7050 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=C729D1EE-AF40-4C94-8B5A-BBA1E4432D9D</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-16T22:15:05.230103" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.230844" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-04-16T22:15:05.230548" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-16T22:15:05.230538" elapsed="0.000353"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-16T22:15:05.230911" elapsed="0.000023"/>
</return>
<msg time="2026-04-16T22:15:05.231031" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.2.7(7050);iPhone', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<arg>app_version=1.2.7</arg>
<arg>build_code=7050</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-04-16T22:15:05.229691" elapsed="0.001355"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-16T22:15:05.606598" level="INFO">POST Request : url=https://app.bitradex.mobi/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6InJlZnJlc2giLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc4OTM5Mzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.h_lR7FihVcXYXAg6_Lu2glTvqqjeepxSRi9vC8f7kccJsGzZH8_ewrCC3sC2ZdiX76wQFYgYz59sDMOKCZr2aKBP880WdXWNuA2W5VLe_NGjaqPPuiOOMQEk4Ml9au3yUBZJUbuzgUoLW_g1yDRmpOHnfZvTTowpexJwO6dwJW0 
 path_url=/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6InJlZnJlc2giLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc4OTM5Mzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.h_lR7FihVcXYXAg6_Lu2glTvqqjeepxSRi9vC8f7kccJsGzZH8_ewrCC3sC2ZdiX76wQFYgYz59sDMOKCZr2aKBP880WdXWNuA2W5VLe_NGjaqPPuiOOMQEk4Ml9au3yUBZJUbuzgUoLW_g1yDRmpOHnfZvTTowpexJwO6dwJW0 
 headers={'user-agent': 'BitradeX-Prod 1.2.7(7050);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7050', 'app-channel': 'ios-prod', 'app-os': 'ios', 'platform': 'USER', 'client-code': 'C729D1EE-AF40-4C94-8B5A-BBA1E4432D9D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex.mobi', 'Content-Length': '4'} 
 body=b'"{}"' 
 </msg>
<msg time="2026-04-16T22:15:05.606851" level="INFO">POST Response : url=https://app.bitradex.mobi/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6InJlZnJlc2giLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc4OTM5Mzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.h_lR7FihVcXYXAg6_Lu2glTvqqjeepxSRi9vC8f7kccJsGzZH8_ewrCC3sC2ZdiX76wQFYgYz59sDMOKCZr2aKBP880WdXWNuA2W5VLe_NGjaqPPuiOOMQEk4Ml9au3yUBZJUbuzgUoLW_g1yDRmpOHnfZvTTowpexJwO6dwJW0 
 status=200, reason=OK 
 headers={'Date': 'Thu, 16 Apr 2026 14:15:05 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Strict-Transport-Security': 'max-age=31536000 ; includeSubDomains', 'X-Frame-Options': 'DENY', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '6fe2cbed7ff9c0314d567b78467c40c6', 'X-Transparent': '00-6fe2cbed7ff9c0314d567b78467c40c6-599d273380cbe82b-01', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9ed3ccd269628511-HKG'} 
 body={"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569} 
 </msg>
<msg time="2026-04-16T22:15:05.607010" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-04-16T22:15:05.607436" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>api_session</arg>
<arg>url=/v1/uaa/authorize/token/refresh?refreshToken=${refresh_token}</arg>
<arg>headers=${headers}</arg>
<arg>json={}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-16T22:15:05.231108" elapsed="0.376372"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 200 and ${resp.json()['code']} == 0">
<kw name="Set Variable" owner="BuiltIn">
<var>${new_access_token}</var>
<arg>${resp.json()['data']['accessToken']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.609046" elapsed="0.000031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${new_refresh_token}</var>
<arg>${resp.json()['data']['refreshToken']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.609233" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Token刷新成功！</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.609396" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ACCESS_TOKEN}</arg>
<arg>${new_access_token}</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.609566" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${REFRESH_TOKEN}</arg>
<arg>${new_refresh_token}</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.609710" elapsed="0.000018"/>
</kw>
<kw name="获取统一请求头" owner="common">
<var>${new_headers}</var>
<arg>token=${new_access_token}</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.610280" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="'${method}' == 'GET'">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${final_resp}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${new_headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.610537" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-16T22:15:05.610411" elapsed="0.000210"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${final_resp}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>json=${params}</arg>
<arg>headers=${new_headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.610760" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-16T22:15:05.610658" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-04-16T22:15:05.610382" elapsed="0.000464"/>
</if>
<return>
<value>${final_resp}</value>
<status status="NOT RUN" start="2026-04-16T22:15:05.610893" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-16T22:15:05.607746" elapsed="0.003203"/>
</branch>
<branch type="ELSE">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-16T22:15:05.611945" level="FAIL">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</msg>
<arg>Token刷新失败: ${resp.text}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-16T22:15:05.611069" elapsed="0.000984">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</kw>
<status status="FAIL" start="2026-04-16T22:15:05.610974" elapsed="0.001160">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</branch>
<status status="FAIL" start="2026-04-16T22:15:05.607679" elapsed="0.004486">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</if>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>${REFRESH_TOKEN}</arg>
<arg>params=${params}</arg>
<doc>当Token过期时，自动使用refreshToken刷新并重试请求</doc>
<status status="FAIL" start="2026-04-16T22:15:05.229241" elapsed="0.383061">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</kw>
<msg time="2026-04-16T22:15:05.612461" level="INFO">${refresh_status} = FAIL</msg>
<msg time="2026-04-16T22:15:05.612510" level="INFO">${refresh_result} = Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</msg>
<var>${refresh_status}</var>
<var>${refresh_result}</var>
<arg>刷新Token并重试</arg>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>${REFRESH_TOKEN}</arg>
<arg>params=${params}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-16T22:15:05.229021" elapsed="0.383516"/>
</kw>
<if>
<branch type="IF" condition="'${refresh_status}' == 'PASS'">
<kw name="Set Variable" owner="BuiltIn">
<var>${response}</var>
<arg>${refresh_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.612831" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-16T22:15:05.612631" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Skip" owner="BuiltIn">
<msg time="2026-04-16T22:15:05.613257" level="SKIP">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</msg>
<arg>Token已失效且refreshToken不可用: ${refresh_result}</arg>
<doc>Skips the rest of the current test.</doc>
<status status="SKIP" start="2026-04-16T22:15:05.613013" elapsed="0.000312">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</kw>
<status status="SKIP" start="2026-04-16T22:15:05.612916" elapsed="0.000466">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</branch>
<status status="SKIP" start="2026-04-16T22:15:05.612612" elapsed="0.000801">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</if>
<status status="SKIP" start="2026-04-16T22:15:05.228699" elapsed="0.384760">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</branch>
<status status="SKIP" start="2026-04-16T22:15:05.228689" elapsed="0.384801">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</if>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.613768" elapsed="0.000036"/>
</kw>
<kw name="验证响应字段值" owner="common">
<arg>${response}</arg>
<arg>code</arg>
<arg>${0}</arg>
<doc>验证响应JSON字段的值</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.614028" elapsed="0.000027"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.614335" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.614543" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>uid</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.614759" elapsed="0.000035"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>level</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.614968" elapsed="0.000023"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>totalEarnings</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.615134" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>用户 ${USER_ID} 的总收益为: ${data['totalEarnings']}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.615300" elapsed="0.000019"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.615522" elapsed="0.000031"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取用户收益信息</arg>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-04-16T22:15:05.615790" elapsed="0.000024"/>
</kw>
<doc>验证获取用户收益信息接口功能</doc>
<tag>invite</tag>
<tag>profit</tag>
<status status="SKIP" start="2026-04-16T22:15:04.503878" elapsed="1.112198">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1776348905569}</status>
</test>
<doc>用户及团队收益分析-获取用户收益信息</doc>
<status status="SKIP" start="2026-04-16T22:15:04.411910" elapsed="1.204817"/>
</suite>
<statistics>
<total>
<stat pass="0" fail="0" skip="1">All Tests</stat>
</total>
<tag>
<stat pass="0" fail="0" skip="1">invite</stat>
<stat pass="0" fail="0" skip="1">profit</stat>
</tag>
<suite>
<stat name="Profit Analysis" id="s1" pass="0" fail="0" skip="1">Profit Analysis</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
