Jsonpath 常用解析规则总结

前言:编写UI自动化测试脚本的时候常常需要通过Xpath去定位元素的位置或者JsonPath解析response的结果,这里介绍一下常用的通过Xpath的方式抓去元素的方式以及jsonpath的常用解析规则。

JsonPath可在Central Maven存储库中找到。 Maven用户将其添加到您的POM:


  1. <dependency>

  2.     <groupId>com.jayway.jsonpath</groupId>

  3.     <artifactId>json-path</artifactId>

  4.     <version>2.2.0</version>

  5. </dependency>

JsonPath表达式总是以与XPath表达式结合使用XML文档相同的方式引用JSON结构。

JsonPath中的“根成员对象”始终称为$,无论是对象还是数组。

JsonPath表达式可以使用点表示法

$.store.book [0].title

或括号表示法

$['store']['book'][0]['title']

操作符

Operator Description
$ 查询根结点,启动所有路径的表达式。
@ 当前节点可以通过该符号进行过滤。
* 通配符,必要时可用在任何地方的名称或者数字。
.. 深层扫描,必要时可在任何地方使用名称。
.<name> 点,表示子节点
['<name>' (, '<name>')] 括号表示子项
[<number> (, <number>)] 数组索引或者索引
[start:end] 数组切片操作
[?(<expression>)] 过滤表达式,表达式的值为一个布尔值

函数

函数可以在路径的尾部使用,函数的输出是路径表达式的输出,该函数的输出是由函数本身决定的。

函数

描述 输出
min() 提供数字数组的最小值 Double
max() 提供数字数组的最大值 Double
avg() 提供数字数组的平均值 Double
stddev() 提供数字数组的标准偏差值 Double
length() 提供数组的长度 Integer

过滤器运算符

过滤器是用于筛选数组的表达式。一个典型的过滤器是[?(@.age>18)],其中@表示正在处理的当前项目。可以使用逻辑运算符&&和||创建更复杂的过滤器。字符串文字必须用单引号或者双引号括起来eg:[?(@.color=='blue')] or [?(@.color == "Blue")]

操作符 描述
== left等于right(注意1不等于'1')
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
=~ 匹配正则表达式[?(@.name =~ /foo.*?/i)]
in 左边存在于右边 [?(@.size in ['S', 'M'])]
nin 左边不存在于右边
size (数组或字符串)长度
empty (数组或字符串)为空

后面举例Json解析和HTML解析。

JSON

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}
JsonPath 点击测试链接 结果
$.store.book[*].author 获取json中store下book下的所有author值
$..author 获取所有json中所有author的值
$.store.* 所有的东西,书籍和自行车
$.store..price 获取json中store下所有price的值
$..book[2] 获取json中book数组的第3个值
$..book[-2] 倒数的第二本书
$..book[0,1] 前两本书
$..book[:2] 从索引0(包括)到索引2(排除)的所有图书
$..book[1:2] 从索引1(包括)到索引2(排除)的所有图书
$..book[-2:] 获取json中book数组的最后两个值
$..book[2:] 获取json中book数组的第3个到最后一个的区间值
$..book[?(@.isbn)] 获取json中book数组中包含isbn的所有值
$.store.book[?(@.price < 10)] 获取json中book数组中price<10的所有值
$..book[?(@.price <= $['expensive'])] 获取json中book数组中price<=expensive的所有值
$..book[?(@.author =~ /.*REES/i)] 获取json中book数组中的作者以REES结尾的所有值(REES不区分大小写)
$..* 逐层列出json中的所有值,层级由外到内
$..book.length() 获取json中book数组的长度

HTML

现在很多UI元素属性因为框架原因很多属性都是框架随机生成的UUID,所以自动化在页面抓取元素的时候不能准确的定位到指定的位置,对于这种情况,我们可以通过下面的表达式进行模糊匹配(这里主要介绍WebdriverIO)

<ul id="menu">
    <li><a class = "title-3948uuio" href="/">Home</a></li>
    <li><a class = "u23242-title" href="/">Developer Guide</a></li>
    <li><a class = "API" href="/">API</a></li>
    >#shadowroot 
     <li><a href="/">Contribute</a></li>
    
</ul>

上一篇:python第二天


下一篇:Java描述 LeetCode,123. Best Time to Buy and Sell Stock III(买卖股票的时机III)