机器人框架运行关键字是否未在其余代码中更新变量?

时间:2019-03-06 19:01:43

标签: robotframework

我正在用自定义关键字编辑一个变量,该变量在满足条件时有条件地运行。起初我以为没有返回参数,所以我创建了一个全局关键字并在代码的这一部分进行了修改,当返回main并记录该变量时,它仍然具有我为该全局变量声明的值。 是否有一个错误可以阻止在运行Run Key If时修改变量?

Log

....
FOR  ${i}  IN RANGE  -1  -4  -1
     ${temp_names_cell} =  Get table cell  ${table_locator}  ${i}  1
     Loop columns  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}
     log  ${WORKAROUND}
     Set to dictionary  ${test}  ${temp_names_cell}  ${WORKAROUND}  #${temp_values_cell}
log dictionary  ${test}
END

Loop columns
    [Arguments]  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}
    ${column_name} =  Set variable
    FOR  ${j}  IN RANGE  1  ${column_count}+1  1
        ${column_name} =  get table cell  ${table_locator}  1  ${j}
        ${column_name} =  Replace string  ${column_name}  \n  ${SPACE}
        Run keyword if  "${column_name}" == "Short Term Backlog"   Get cell value  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
        log  ${temp_values_cell}
    END
    [Return]  ${i}  ${temp_values_cell}  ${column_count}  ${table_locator}

Get cell value
    [Arguments]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}
    ${temp_values_cell} =  Get table cell  ${table_locator}  ${i}  ${j}
    ${WORKAROUND} =  Get table cell  ${table_locator}  ${i}  ${j}
    [Return]  ${temp_values_cell}  ${table_locator}  ${i}  ${j}

1 个答案:

答案 0 :(得分:1)

您要描述两个独立的问题-它们不是2个问题,而只是两种共享遇到问题的状态的方法。

让我来解决“全局”变量-${WORKAROUND}的使用,以便从关键字中传递信息(因为这很容易;)

您看到的行为是由于变量作用域。考虑下面的伪代码:

a = 5
print(a)  # 5

def keyword():
    a = 10
    print(a)

keyword()  # 10
print(a)   # 5?

那么为什么最后一个print()输出5?
因为在作用域中它是变量的值。 keyword()中发生的事情是(默认)隔离的;您创建一个巧合的变量,也称为“ a”,并为其分配一个值。在这一刻,您将从外部作用域中屏蔽变量“ a”-该变量在程序中仍然存在,但在keyword()内部不再可用。 keyword()完成后,其“ a”消失,而全局的a不变。
顺便说一下,该清单是python,它是Robot Framework语言的基础,并且它所遵循的原理也差不多。

代码中发生的情况几乎相同-变量${WORKAROUND}是在大小写或关键字中定义的,而您在{{1内定义了具有相同名称的新变量 }}。因此,您对关键字所做的任何操作都不会反映到外部作用域中的原始内容。

很幸运,有一个简单的解决方法(在Robot Framework中)-在关键字内部使用Set Test Variable,以覆盖外部作用域中的变量。在此情况下,Get cell value的所有后续用法将具有更改的值。还有类似的关键字${WORKAROUND}Set Suite Variable,它们将变量置于更高(和最高)的范围内。


现在,第二种情况-将变量作为参数传递,并在〜method〜关键字中进行更改,希望在调用范围内将其更改。

我打算写很长的东西,就像第一部分那样无聊,用于传递值与按引用传递,以及名称->对象绑定,但是-不,我会
a)留在这里-https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/,它解释说加范围比我本来要好,并且
b)直截了当-这里的问题与局部变量的作用域相同。

在此代码中:

Set Global Variable

,您声明关键字将带有一个参数,并将使用名称“ temp_values_cell”进行引用。
但是在接下来的一行中,您将该名称重新绑定到一个新值-内存中的新位置;对于您的关键字,现在只有变量“ temp_values_cell”保存了Get cell value [Arguments] ${temp_values_cell} ${table_locator} ${i} ${j} ${temp_values_cell} = Get table cell ${table_locator} ${i} ${j} 的结果。现在,它与关键字调用中使用的原始变量没有任何共同之处。
对于外部世界-一切都没有改变;您传递给关键字的原始变量不会受到影响,也不会更改。

而且-Get table cell在这里无济于事(为什么-稍后再做:)。

正统的方法是从关键字返回值并使用它。在示例代码中执行的操作-返回值,但不分配。