我很失望,NameError
:
${val} = Execute Javascript return sessionStorage.isMatching
Should Be True ${val}
日志输出为:
INFO Executing JavaScript:
INFO ${val} = true
KEYWORD BuiltIn . Should Be True ${val}
TRACE Arguments: [ 'true' ]
FAIL Evaluating expression 'true' failed: NameError: name 'true' is not defined
这既不起作用:
Should Be True ${val} == true --> Evaluating expression 'true == true' failed: NameError: name 'true' is not defined
Should Be True ${val} == 'true' --> Evaluating expression 'true == 'true'' failed: NameError: name 'true' is not defined
Should Be True ${val} == "true" --> Evaluating expression 'true == "true"' failed: NameError: name 'true' is not defined
阅读完文档后,我了解到底层python不会将JS true
评估为true
。然后我尝试将布尔值转换为JS中的String:
${val} = Execute Javascript return sessionStorage.isMatching.toString()
但我再次获得NameError
。
我知道的唯一方法是看起来很糟糕(因为我显然必须将布尔值转换为布尔值):
${val} = Execute Javascript return sessionStorage.isMatching
${bool} = Convert To Boolean ${val}
Should Be True ${bool}
有没有更好的方法,在RF或JS中进行评估?
版本:
Python 2.7.8
Robotframework 3.0
答案 0 :(得分:5)
从javascript返回的是文字字符串'true'
。要在表达式中使用它,您必须引用它:
Should be true '${val}` == 'true'
您收到错误NameError: name 'true' is not defined
的原因是机器人在评估表达式之前进行了字符串替换。
换句话说,这个表达式在机器人中:
should be true ${val} == 'true'
...就像你在python中输入它一样:
if true == 'true':
...
Python看到true
,试图查找名为true
的变量的值,并且找不到任何此类变量。因此,您获得了NameError
。
您可以在BuiltIn library(强调我的)的文档中找到对此的描述:
当使用普通的$ {variable}语法在表达式中使用变量时,在计算表达式之前将替换其值。这意味着表达式中使用的值将是变量值的字符串表示形式,而不是变量值本身。对于具有可以直接求值的字符串表示的数字和其他对象,这不是问题,但对于其他对象,行为取决于字符串表示。最重要的是,必须始终引用字符串,如果它们可以包含换行符,则必须使用三重引号。