2017-02-01 25 views
0

Не могли бы вы посоветовать, как использовать JsonPath в Robot Framework? Он должен поддерживает запрос многоуровневого следующим образом:Как использовать полностью функциональный JsonPath в RobotFramework?

$.items[?(@.status.name="closed")].name 

Я ищу способ сделать следующую работу:

*** Variables *** 
${json}   {"items":[{"name":"item1","status":{"id":1,"name":"opened"}},{"name":"item2","status":{"id":2,"name":"closed"}}]} 
${json_path} $.items[?(@.status.name="closed")].name 
*** Test Cases *** 
Get closed item 
    ${names}= Get Json Items ${json} ${json_path} 
    Should be equal ${names[0]} item2 

как этот коснуться

+0

что '$ .items'? Он не похож на переменную робота. –

+0

есть. это не. он является частью запроса jsonpath, указывающего на массив элементов в корне json – bp3

+0

, пожалуйста, покажите пример теста робота, который вы создаете, и используя один из этих объектов. –

ответ

1

Это RF код делает то, что вам нужно но ТОЛЬКО для предоставленной json-структуры. С моей точки зрения, вы должны сыграть с Get Json Value и подготовить ключевые слова, которые вам нужны. Кстати, очевидно, что такая обработка json/string в RF немного сложна, поэтому я бы предпочел написать небольшую библиотеку Python с ключевыми словами, которые вам нужны.

*** Settings *** 
Library   Collections 
Library   HttpLibrary.HTTP 

*** Variables *** 
${json}   {"items":[{"name":"item1","status":{"id":1,"name":"opened"}},{"name":"item2","status":{"id":2,"name":"closed"}}]} 
${name} ${EMPTY} 
${result} ${EMPTY} 

*** Test Cases *** 
Get Closed Item 
    ${name} Get Name By Status ${json} closed 
    Should Be Equal As Strings ${name} item2 
    ${name} Get Name By Status ${json} opened 
    Should Be Equal As Strings ${name} item1 

*** Keywords *** 
Get Name By Status 
    [Arguments] ${json} ${status} 
    [Return] ${result} 
    ${json} Parse Json ${json} 
    :FOR ${item} IN @{json["items"]} 
    \ ${item} Stringify Json ${item} 
    \ ${name} Get Json Value ${item} /name 
    \ ${name} Parse Json ${name} 
    \ ${status_name} Get Json Value ${item} /status/name 
    \ ${status_name} Parse Json ${status_name} 
    \ ${result} Set Variable If '${status_name}' == '${status}' ${name} ${result} 

Редактировать: на основе нижеследующего комментария я хотел бы получить такой код на основе python.

JsonpathLibrary.py:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import json 
import jsonpath 

class JsonpathLibrary(object): 

    def get_items_by_path(self, json_string, json_path): 
     json_object = json.loads(json_string) 
     match_object = jsonpath.jsonpath(json_object, json_path) 
     match_string = json.dumps(match_object[0]) 
     return match_string 

РФ Код:

*** Settings *** 
Library   JsonpathLibrary.py 

*** Variables *** 
${json}   {"items":[{"name":"item1","status":{"id":1,"name":"opened"}},{"name":"item2","status":{"id":2,"name":"closed"}}]} 
${json_path} $.items[?(@.status.name=="closed")].name 

*** Test Cases *** 
Some Descriptive Name Here 
    ${name} Get Items By Path ${json} ${json_path} 
    Should Be Equal As Strings ${name} "item2" 
+0

спасибо за ответ, но это не то, что мне нужно. структура может измениться (ее об интеграции тестирования), и такое решение не подходит. поэтому мне нужно использовать jsonpath/objectpath – bp3

+0

ОК, я попытался сделать это с помощью jsonpath python. 'pip install jsonpath' –

+0

спасибо! это работает! я сделал что-то подобное, но моя ошибка была - я использовал jsonpath_rw вместо jsonpath (google lied to me) - и jsonpath_rw не поддерживал «?» («Конструкции, которые мне нужны!» – bp3

 Смежные вопросы

  • Нет связанных вопросов^_^