Robotframework:如何评估从Javascript调用返回的布尔值

时间:2016-01-26 13:34:47

标签: javascript robotframework

我很失望,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

1 个答案:

答案 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}语法在表达式中使用变量时,在计算表达式之前将替换其值。这意味着表达式中使用的值将是变量值的字符串表示形式,而不是变量值本身。对于具有可以直接求值的字符串表示的数字和其他对象,这不是问题,但对于其他对象,行为取决于字符串表示。最重要的是,必须始终引用字符串,如果它们可以包含换行符,则必须使用三重引号。