我正在编辑自定义关键字中的变量,我在条件满足时有条件地运行。起初我以为参数没有被返回所以我创建了一个全局关键字并在代码的这一部分内进行了修改,当返回main并记录该变量时,它仍然具有我为该全局变量声明的值。是否存在阻止在运行Run Keyword If时修改变量的错误?
....
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}
您正在描述两个不同的问题 - 它们不是两个问题,只是两种方法来共享您遇到问题的状态。
让我来解决“全局”变量${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”消失,而全球的一个没有变化。
顺便提一下,这个列表是python,它是基于Robot的语言,以及它或多或少遵循的原则。
所以在您的代码中几乎完全相同 - 变量${WORKAROUND}
在case或keyword中定义,并且您在Get cell value
中定义了一个具有相同名称的新变量。因此,无论您在关键字中对它做什么,都不会反映到外部范围中的原始对象。
值得庆幸的是,有一个简单的解决方法(在Robot Framework中) - 在关键字中使用Set Test Variable
来覆盖外部作用域中的变量。在这种情况下,${WORKAROUND}
的所有后续使用都将具有更改的值。还有类似的关键字Set Suite Variable
和Set Global Variable
,它们将变量放在更高(和最高)的范围内。
现在是第二种情况 - 将变量作为参数传递,并在~conform~关键字中更改它,希望它在调用范围内更改。
我打算写一些很长的东西,就像第一部分传递值和传递引用一样乏味,而名字 - >对象绑定,但是 - 不,我会 a)离开这里 - https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/,它解释了加上范围比我的方式更好,并且 b)直截了当 - 这里的问题与局部变量的范围相同。
在这段代码中:
Get cell value
[Arguments] ${temp_values_cell} ${table_locator} ${i} ${j}
${temp_values_cell} = Get table cell ${table_locator} ${i} ${j}
,您声明您的关键字将采用参数,您将使用名称“temp_values_cell”引用该参数。
但是在下一行中,您将该名称重新绑定为新值 - 内存中的新位置;对于您的关键字,现在只有变量“temp_values_cell”保存Get table cell
的结果。它现在与关键字调用中使用的原始变量没有任何共同之处。
对于外面的世界 - 没有任何改变;您传递给关键字的原始变量不受影响,不会更改。
并且 - Set Test Variable
在这里不会帮助(为什么 - 以后运动:)。
正统的方法是从关键字返回一个值,然后使用它。您在示例代码中执行的操作 - 返回值,但不指定。