【问题标题】:Run Keyword If key exists in dictionary (Robot Framework)如果字典中存在键,则运行关键字(机器人框架)
【发布时间】:2020-05-03 14:49:47
【问题描述】:

我目前正在使用 Robot Framework 对表单进行自动化测试。为了提供表单数据,我使用了这样的字典:

*** Variables ***
&{TestCase1}    key1=a    key2=b    key3=c    key4=d
&{TestCase2}    key2=x    key3=y

我想要做的是,如果匹配键存在于该测试用例的字典中,则填充某些字段,以便可选字段留空。我尝试运行以下关键字:

*** Keywords ***
Fill Form
    [Arguments]    &{TestCase}
    Run Keyword If    &{TestCase}[key1]    Input Text    id=field1    &{TestCase}[key1]
    Run Keyword If    &{TestCase}[key2]    Input Text    id=field2    &{TestCase}[key2]
    Run Keyword If    &{TestCase}[key3]    Input Text    id=field3    &{TestCase}[key3]
    Run Keyword If    &{TestCase}[key4]    Input Text    id=field4    &{TestCase}[key4]

...但无济于事。我收到此错误:

FAIL: Dictionary &{TestCase} has no key 'key1'.

...这在某种程度上是有道理的,因为它没有,但这就是重点。我希望这会使条件评估为 False 并使 RF 跳过关键字。

任何人都可以解释为什么它不能以这种方式工作,以及是否有其他方法可以做到这一点?非常感谢任何帮助!

【问题讨论】:

    标签: python selenium automated-tests robotframework


    【解决方案1】:

    您需要检查键是否存在,而不是值。在 python 中这看起来像if 'key1' in TestCase,所以在机器人语法中它看起来像这样:

    Run keyword if  'key1' in $TestCase  Input Text  ...
    

    这是一个完整的例子。运行时,它应该添加“key1 在日志中符合预期”但not“bogus 意外在日志中”

    *** Variables ***
    &{TestCase1}    key1=a    key2=b    key3=c    key4=d
    &{TestCase2}    key2=x    key3=y
    
    *** Test Cases ***
    Example
        Run keyword if  'key1'  in $TestCase1  log  key1 is in the log as expected
        Run keyword if  'bogus' in $TestCase1  log  bogus is unexpectedly in the log
    

    【讨论】:

    • 感谢您的回复。我试图以多种方式正确地使用语法,但 RF 似乎无法识别其中任何一种中的 in 关键字。
    • @tomheffels: in 不是机器人语法,它是 python 语法。只要您完全按照我在答案中所做的那样编写它,它就会起作用。我已更新我的答案以包含完整的工作测试。
    • 现在知道了,谢谢!我使用了 & 而不是 $,仍然对变量/参数的语法感到有些困惑
    【解决方案2】:

    正如@Swapnil 和@Bryan 所强调的,有几种方法可以实现这一点。下面的示例使用键/字段 ID 组合的映射,然后使用提供键值对的测试用例。填充脚本只是执行一个 for 循环,并不关心字段的数量。 Input Text 关键字由自定义关键字模拟,用于记录到控制台。

    *** Settings ***
    Library    Collections    
    
    *** Variables ***
    &{mapping}
        ...    key1=field1    key2=field2
        ...    key3=field3    key4=field4
    
    *** Test Cases ***
    Test Case 1
        &{testcase}    Create Dictionary
        ...    key1=value1   key3=value3
        ...       
        Log to Console    \n    #For Formatting purpose
        Fill Form    ${testcase}    ${mapping}
    
    Test Case 2
        &{testcase}    Create Dictionary
        ...    key1=value1    key3=value3   
        ...    key2=value2
    
        Log to Console    \n    #For Formatting purpose
        Fill Form    ${testcase}    ${mapping}
    
    *** Keywords ***
    Fill Form
        [Arguments]    ${fields}    ${mapping}
        ${keys}    Get Dictionary Keys    ${fields}    
    
        FOR    ${key}    IN    @{keys}
            Input Text    id=${mapping}[${key}]    ${fields}[${key}]
        END 
    
    Input Text
        [Arguments]    ${locator}    ${value}
        Log To Console   Test Name: "${TEST NAME}" Locator: [${locator}] Value: "${value}"
    

    将产生以下结果:

    ==============================================================================
    Test Case 1                                                           
    
    Test Name: "Test Case 1" Locator: [id=field1] Value: "value1"
    Test Name: "Test Case 1" Locator: [id=field3] Value: "value3"
    | PASS |
    ------------------------------------------------------------------------------
    Test Case 2                                                           
    
    Test Name: "Test Case 2" Locator: [id=field1] Value: "value1"
    Test Name: "Test Case 2" Locator: [id=field2] Value: "value2"
    Test Name: "Test Case 2" Locator: [id=field3] Value: "value3"
    | PASS |
    ------------------------------------------------------------------------------
    

    【讨论】:

    • 很好的解决方案,谢谢!但是,我确实需要让这个“Run Keyword If”方法起作用,因为我正在处理的实际表单比我发布的示例更复杂,并且包含更多元素(下拉菜单、复选框、按钮等)以上。
    猜你喜欢
    • 2016-12-17
    • 2020-11-06
    • 2015-11-07
    • 2013-11-08
    • 2020-09-25
    • 1970-01-01
    • 2015-10-14
    • 2019-06-11
    • 2017-12-19
    相关资源
    最近更新 更多