【问题标题】:How to write If statement and For loop programatically with Robot Framework API如何使用 Robot Framework API 以编程方式编写 If 语句和 For 循环
【发布时间】:2021-03-19 21:00:41
【问题描述】:

我一直在探索 Robot 框架,并遇到了我正在尝试使用的这个示例。这个例子效果很好,除了我想尝试添加一个 for 循环和 if 语句。我什至还没有开始 if 语句,因为我被 for 循环困住了。请我帮忙建议如何构造一个 for 循环和 if 语句。

这是在脚本末尾添加一个for循环的基本尝试:

test.keywords.create('For', args=['1','IN','10'], type='for')
error - TypeError: __init__() got an unexpected keyword argument 'flavor'

下面的代码只是显示我正在尝试添加基本的 for 循环,但编译时出现上述错误

from robot.api import TestSuite

suite = TestSuite('Activate Skynet')
suite.imports.library('OperatingSystem')
test = suite.tests.create('Should Activate Skynet', tags=['smoke'])
test.keywords.create('Set Environment Variable', args=['SKYNET', 'activated'], type='setup')
test.keywords.create('Environment V`enter code here`ariable Should Be Set', args=['SKYNET'])
test.keywords.create('For', args=['1','IN','10'], type='for')

起源 - https://robot-framework.readthedocs.io/en/2.8.1/autodoc/robot.running.html

test.keywords.create('Create List', args=['a', 'b', 'c'], assign=['@{list}'])
for_kw = ForLoop(['${l}'], ['@{list}'], flavor='IN')
for_kw.keywords.create('log', args=['${l}'])
test.keywords.create()
test.keywords.append(for_kw)

【问题讨论】:

    标签: python loops robotframework


    【解决方案1】:

    更新:有了 Robot Framework,这已经改变并且变得更容易了。

    发布说明:Running and result models have been changed

    • TestSuiteTestCaseKeyword 对象曾经具有包含其中使用的关键字的关键字属性。这个名字有误导性 现在他们也有 FOR 和 IF 对象。与TestCaseKeyword 属性已重命名为 bodyTestSuite 它 被完全删除。关键字属性仍然存在,但它是 只读且已弃用。
    • 新的body 没有create() 用于创建关键字的方法,就像旧的关键字一样,而是它有单独的 create_keyword()create_for()create_if() 方法。这个 意味着像test.keywords.create() 这样的旧用法需要更改 到test.body.create_keyword()

    例如,查看其他答案:How to write FOR loop and IF statement programmatically with Robot Framework 4.0?


    在 Robot Framework 4.0 之前:

    IF声明

    if 语句应该是带有您需要的参数的 Run Keyword If 关键字。它与其他关键字一样是关键字,因此您应该在其 args 列表中列出所有其他内容。

    • 条件。
    • True 分支的关键字名称。
    • 如果有的话,将任何argsTrue 分支的关键字分开。单独列出。

    • ELSE IF 关键字(如果需要)。
    • ELSE IF 条件。
    • ELSE IF 分支的关键字名称。
    • 如果有的话,将任何argsELSE IF 分支的关键字分开。单独列出。

    • ELSE 关键字。
    • ELSE 分支的关键字名称。
    • 如果有的话,将任何argsELSE 分支的关键字分开。单独列出。
    from robot.api import TestSuite
    
    suite = TestSuite('Activate Skynet')
    test = suite.tests.create('Should Activate Skynet', tags=['smoke'])
    
    test.keywords.create('Run Keyword If', args=[True, 'Log To Console', 'Condition was TRUE', 'ELSE', 'Log To Console', 'Condition was FALSE'])
    test.keywords.create('Run Keyword If', args=[False, 'Log To Console', 'Condition was TRUE', 'ELSE', 'Log To Console', 'Condition was FALSE'])
    
    suite.run()
    

    这是它在日志中的样子:


    FOR循环

    至于for 循环。它是基于robot.running.model.Keyword 类的robot.running.model.ForLoop 类实现的特殊关键字。这是构造函数:

    它有一个flavor 参数,就是要说的循环类型。所以是ININ RANGEIN ZIP等。

    现在您实例化一个robot.running.model.Keyword,尽管您可以将其类型设置为for,但它不会有flavor 属性。因此,当您执行代码时,它会抛出您看到的错误。这是因为ForRunner 会尝试访问flavor 属性。

      File "/usr/local/lib/python3.7/site-packages/robot/running/steprunner.py", line 52, in run_step
        runner = ForRunner(context, self._templated, step.flavor)
    AttributeError: 'Keyword' object has no attribute 'flavor'
    

    所以你必须使用ForLoop 类。另外我使用的是 Robot Framework 3.1.2,所以在我的情况下错误可能会有所不同,但方法应该是相同的。

    它应该是这样的:

    from robot.running.model import ForLoop
    
    for_kw = ForLoop(['${i}'], ['10'], flavor='IN RANGE')
    test.keywords.append(for_kw)
    

    不,这仍然会失败并出现错误:

    FOR 循环不包含关键字。

    所以你必须像这样填充它:

    for_kw.keywords.create('No Operation')
    

    完整的例子:

    from robot.api import TestSuite
    from robot.running.model import ForLoop
    
    suite = TestSuite('Activate Skynet')
    test = suite.tests.create('Should Activate Skynet', tags=['smoke'])
    test.keywords.create('Log Many', args=['SKYNET', 'activated'], type='setup')
    test.keywords.create('Log', args=['SKYNET'])
    
    for_kw = ForLoop(['${i}'], ['10'], flavor='IN RANGE')
    for_kw.keywords.create('No Operation')
    test.keywords.append(for_kw)
    suite.run()
    

    如果你运行它只会产生一个输出 XML,你必须手动运行 rebot 以获得一个日志和报告 HTML 文件。

    【讨论】:

    • 谢谢 Bence,非常感谢……它运行良好。我将尝试 if then else 语句,除非我知道 run 关键字 if 并且我假设我必须通过使用 if 语句的构造函数来走您指出的路线,因为 run.keyword.create 只能接受 1 个 args 参数并且不知道如何照顾其他人。我还用代码更新了我的帖子以遍历列表
    • 谢谢@Bence Kaulics,我已经像魅力一样测试和回答了作品,我已经投票并接受了。赞赏
    • @Wizard Robot Framework 4.0 已发布,我的回答中描述的大部分内容都发生了变化。我已经更新了。
    • 感谢您的更新。我确实收到了弃用错误,.body 解决了这个问题,目前正在探索 for 和 if。希望它们包括一段时间,但我试图用这些做一些复杂的例子,比如嵌套的 if 和一个 for 循环,它读取列表中的 x 变量,直到捕获所有 x 并使用 if 语句针对条件验证每个 x。一旦我弄清楚,我会分享。如果您已经有示例,请分享。谢谢
    • 还查看库以查找是否有任何改进可以将变量从 python 脚本获取到 testsuite 和变量值,例如从 testsuite 到 python 的列表
    猜你喜欢
    • 2021-06-16
    • 2021-06-17
    • 2018-06-06
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2018-03-16
    • 2014-07-14
    相关资源
    最近更新 更多