2012-05-24 3 views
0

Я использую селен Selenese для выполнения некоторых функциональных тестов. Мне нужно разобрать содержимое Json в теле. Вот JSON:Selenium test, parse Json string from variable

{"access_token":"ab89978b- 
    74a1-41a6-81e7-7b520ea9d29f","token_type":"bearer","refresh_token":"38a3a34b-09c9-452e- 
    b05b-6903770a877f","expires_in":1799,"scope":"read"} 

Я использую следующий Selenese команду:

<tr> 
<td>store</td> 
<td> 
    javascript{ 
     var jsonstr = '${body}' 
     var obj=JSON.parse(jsonstr); 
     var token=obj.access_token; 
    } 
</td> 
<td>token</td> 
</tr> 

Но я получаю следующее сообщение об ошибке:

Command execution failure. Please search the user group at https://groups.google.com/forum/#!forum/selenium-users for error details from the log window. The error message is: missing ; before statement

Кто-нибудь знает, как разбор содержание переменной в селене, содержащей строку Json?

+1

Если JSON точно вы отправили его, то это неверно. Разрыв строки после '' ab89978b-'недействителен. См. Http://jsonlint.com/. Хотя ошибка указывает на то, что вам не хватает'; 'где-то. Может быть, после' '$ {body} ''? –

+0

нет json действителен, просто скопируйте и вставьте его, когда имеете дело с отступом, чтобы отправить код, поэтому я так сказал –

+0

ошибка вводит в заблуждение, что-то еще не так, я приближаюсь к этому правильно? –

ответ

0

Вы должны использовать storeEval вместо магазина

<tr> 
    <td>store</td> 
    <td>{&quot;access_token&quot;: &quot;ab89978b-74a1-41a6-81e7-7b520ea9d29f&quot;, &quot;token_type&quot;: &quot;bearer&quot;, &quot;refresh_token&quot;: &quot;38a3a34b-09c9-452e-b05b-6903770a877f&quot;, &quot;expires_in&quot;: 1799, &quot;scope&quot;: &quot;read&quot;}</td> 
    <td>json</td> 
</tr> 
<tr> 
    <td>echo</td> 
    <td>${json}</td> 
    <td></td> 
</tr> 
<tr> 
    <td>storeEval</td> 
    <td>var x = '${json}'; var obj=JSON.parse(x); obj.access_token;</td> 
    <td>bam</td> 
</tr> 
<tr> 
    <td>echo</td> 
    <td>${bam}</td> 
    <td></td> 
</tr> 
0

Я боролся немного с этим вопросом Поэтому я решил добавить свое собственное решение, которое основывается на решении предложенного здесь и могу помочь тем, пытаясь получить сам объект JSON из:

<tr> 
    <td>open</td> 
    <td>/YOURURL/</td> 
    <td></td> 
</tr> 
<tr> 
    <td>storeText</td> 
    <td>css=pre:contains("ELEMENTATTRIBUTEYOUWANTTOGRAB")</td> 
    <td>json</td> 
</tr> 
<tr> 
    <td>echo</td> 
    <td>${json}</td> 
    <td></td> 
</tr> 
<tr> 
    <td>storeEval</td> 
    <td>var x = '${json}'; var obj=JSON.parse(x); obj.ELEMENTATTRIBUTEYOUWANTTOGRAB;</td> 
    <td>AC</td> 
</tr> 
<tr> 
    <td>echo</td> 
    <td>${AC}</td> 
    <td></td> 
</tr> 

Селен IDE & браузеры не показывают HTML обертку, что на самом деле существует: это делает его трудно понять, в коде .... даже если правый щелчок показать источник как объект JSON {ABCD...} фактический источник имеет объект, предварительно заключенный в элемент <pre> </pre>. Здесь мы используем эту информацию для выбора элемента, загрузки его в объект JSON и извлечения из него желаемого атрибута.