预期类似列表的值,得到字符串

Sam*_*osh 2 selenium robotframework

我编写了一个称为子关键字的关键字。现在 sub 关键字返回两个值,我试图将它们存储在分配给 main 关键字的数组中。当我登录控制台返回的值时,它给出一条错误消息,指出 - Expected list-like value, got string

我尝试过以下解决方法(失败):

1. Attempt1:
@{Items1}    Run keyword if    '${INACTIVEStateCount}'!='0'    INACTIVE OTOID selector    ${StateCount}
Log To console  Values are ${Items1}

2. Attempt2:
@{Items1}    Run keyword if    '${INACTIVEStateCount}'!='0'    INACTIVE OTOID selector    ${StateCount}
${Items2}   Create List    @{Items1}
Log To console  Values are ${Items2}

Main keyword:

@{Items1}    Run keyword if    '${INACTIVEStateCount}'!='0'    INACTIVE OTOID selector    ${StateCount}
${Items2}    Create List    @{Items1}
Log To console    Values are ${Items2}

SubKeyword:

INACTIVE OTOID selector
    [Documentation]    Used to select Inactive OTOIDs
    [Arguments]    ${StateCount}    ${LocatorWaitTime}=${defaultWait time}
    :FOR    ${INDEX}    IN RANGE    1    ${StateCount}
    \    ${Check}=    Run keyword and return status    Page should contain element     xpath=//*@id='lookupFiberDetailsResult']/table/tbody/tr[${INDEX}]/td[4][text()='INACTIVE']
    \    ${OTO_IDStatus}    Run keyword if    '${Check}'=='True'    Get Text             xpath=//*[@id='lookupFiberDetailsResult']/table/tbody/tr[${INDEX}]/td[4][text()='INACTIVE']
    \    Log to Console    Loop${INDEX} - OTOID:${OTO_IDStatus}
    \    ${OTO_ID}    Run keyword if    '${OTO_IDStatus}'!='None'   Get Text         xpath=//*[@id='lookupFiberDetailsResult']/table/tbody/tr[${INDEX}]/td[2]               
    \    ${LineIdentifier}    Run keyword if    '${OTO_IDStatus}'!='None'  Get Text    xpath=//*[@id='lookupFiberDetailsResult']/table/tbody/tr[${INDEX}]/td[1]             
    \    Run keyword if    '${OTO_IDStatus}'!='None'    Log to Console                  OTOID is: ${OTO_ID}
    \    Run keyword if    '${OTO_IDStatus}'!='None'    Log to Console                  OTOID is: ${LineIdentifier}
    \    Run Keyword If    '${OTO_IDStatus}'!='None'    [Return]    ${OTO_ID}
    \    Run Keyword If    '${OTO_IDStatus}'!='None'    [Return]    ${LineIdentifier}
    \    Exit For Loop if  '${OTO_IDStatus}'!='None'
Run Code Online (Sandbox Code Playgroud)

我打算实现的目标:我使子关键字返回两个值:OTOID 和 LineIdentifier 并将其存储在数组中。然后分别使用这两个值以供进一步使用。

实际:当我登录控制台存储在数组中的值时,我收到一条错误消息:预期类似列表的值,得到字符串

Sam*_*eem 5

问题是您试图将 sub 关键字的返回值存储为数组/列表,但从中返回字符串。

*** Keywords ***
Main keyword
    ${OTO_ID}    ${LineIdentifier}    Run keyword if    '${INACTIVEStateCount}'!='0'    INACTIVE OTOID selector    ${StateCount}

INACTIVE OTOID selector
    Return From Keyword If    '${OTO_IDStatus}'!='None'   ${OTO_ID}  ${LineIdentifier}
Run Code Online (Sandbox Code Playgroud)

这将返回值${OTO_ID}${LineIdentifier}作为单独变量而不是数组。

请注意,我忽略了 sub 关键字中的其他步骤,只是为了使答案更简单。

需要更换的线路:

Run Keyword If    '${OTO_IDStatus}'!='None'    [Return]    ${OTO_ID} 
Run Keyword If    '${OTO_IDStatus}'!='None'    [Return]    ${LineIdentifier}
Run Code Online (Sandbox Code Playgroud)

更新: 如果您想严格返回列表值,请使用以下代码

*** Keywords ***
Main keyword
    ${Identifiers}    Run keyword if    '${INACTIVEStateCount}'!='0'    INACTIVE OTOID selector    ${StateCount}

INACTIVE OTOID selector
    ${Identifiers}    Create List
    .
    <Your FOR loop here>
    .
    \ Run Keyword If    '${OTO_IDStatus}'!='None'   Append to List  ${identifiers}    ${OTO_ID}    ${LineIdentifier}
    Exit For Loop If  '${OTO_IDStatus}'!='None'

    Return From Keyword If    '${OTO_IDStatus}'!='None'    ${Identifiers}
Run Code Online (Sandbox Code Playgroud)

参考:机器人用户指南