2016-01-26 87 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''。所以我應該知道 - 這一次沒有想到。謝謝。 –