如果字典中存在键,则运行关键字(机器人框架)

Posted

技术标签:

【中文标题】如果字典中存在键,则运行关键字(机器人框架)【英文标题】: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 跳过关键字。

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

【问题讨论】:

【参考方案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”方法起作用,因为我正在处理的实际表单比我发布的示例更复杂,并且包含更多元素(下拉菜单、复选框、按钮等)以上。

以上是关于如果字典中存在键,则运行关键字(机器人框架)的主要内容,如果未能解决你的问题,请参考以下文章

setdefault() python

如果键存在则删除字典项[重复]

导入资源 - 文件不存在(机器人框架)

在 Robot 框架中评估多个 If 条件

如果键不存在,则字典返回默认值[重复]

如果机器人框架有关键字来处理异常?