2016-01-26 54 views
2

我很不解,这个失败与NameErrorRobotframework:如何评价从Javascript返回布尔值调用

${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 as true。然后我试图布尔转换为字符串在JS:

${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

回答

4

,可以通过JavaScript得到什么是字面上的'true'。要在表达式中使用它,你必须引用它:

Should be true '${val}` == 'true' 

你的错误NameError: name 'true' is not defined是由于这样的事实,机器人做字符串替换计算表达式之前的原因。

换句话说,在机器人这个表达式:

should be true ${val} == 'true' 

...是一样的,如果你曾在蟒蛇键入此:

if true == 'true': 
    ... 

Python看到true,尝试查找一个名为true的变量的值,并且doens没有找到任何这样的变量。因此,你得到了NameError

你可以找到这个文件中的BuiltIn library(重点煤矿)的说明:

当一个变量在使用普通$表达{变量}语法使用,它的值是前替换表达式被评估。这意味着表达式中使用的值将是变量值的字符串表示形式,而不是变量值本身。对于数字和其他具有可直接评估的字符串表示形式的对象,这不是问题,但对于其他对象,行为依赖于字符串表示形式。最重要的是,字符串必须总是被引用,如果它们可以包含换行符,则它们必须被三重引用。

+0

_robot在评估表达式_之前进行了字符串替换,这是一个非常不错的功能。而且我有很多行,比如'Run Keyword If'$ {exp}'=='None''。所以我应该知道 - 这一次没有想到。谢谢。 –