数据查找匹配定位相关用法整理

本贴最后更新于 1019 天前,其中的信息可能已经东海扬尘

目前为止学习到的一些数据查找匹配方法有很多相似点,可能容易混淆,所以写了这篇文章,梳理巩固相关知识,方便后续查阅。同时期待同行们的指正和补充。

一、JsonPath

作用

JsonPath 是一种信息抽取类库,用来解析多层嵌套的json数据格式。在接口测试等业务中,需要从返回的json数据中筛选或提取某个字段进行断言等操作(本文仅使用python语言实现)

用法

首先需要安装JsonPath模块:pip install jsonpath

官方文档:http://goessner.net/articles/JsonPath


import jsonpath 	#首先导入jsonpath模块

#假设存在response这样一串json数据
response ={
    "teacher":{
        "name":"李小二",
        "sex":"男",
        "age":30,
        "height":185.5,
        "teacher":"递归搜索测试" },
    "class_one":{
        "students":[
            {
                "name":"张一",
                "sex":"男",
                "age":18,
                "height":170.5 },
            {
                "name":"张二",
                "sex":"女",
                "age":20,
                "height":160.5}]}}

# 提取出来的是list,提取根节点下的teacher字段的值
res1 = jsonpath.jsonpath(response,"$.teacher")
print(res1)
res2 = jsonpath.jsonpath(response,"$[teacher]")
print(res2)

# 提取指定的值
res3 = jsonpath.jsonpath(response,"$.teacher.name")
print(res3)
res4 = jsonpath.jsonpath(response,"$[teacher][name]")
print(res4)

# 递归提取,获取能匹配的所有字段,返回list
res5 = jsonpath.jsonpath(response,"$..name")
print(res5)

# 条件筛选
res6 = jsonpath.jsonpath(response,"$..[?(@.age>18)]")
print(res6)

补充:筛选匹配规则可以在代码中写死,也可以在excel等文件中新建字段保存,代码中需要时则读取引入

二、Xpath

作用

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力(从上至下查找)。

在web自动化中可以作为万能的定位方式:可通过文本内容定位,可跟进元素的多个组合特征条件筛选定位,可根据元素的层级定位等

用法

1.绝对路径

image.png

从html开始,以斜杠 / 开头,每一个元素层级关系都会罗列出来(和用户看到的页面元素顺序不同)
同级的元素位置从数字1开始,如 div[1]

可使用右键copy完整的xpath路径查看,比如 /html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input

但是web自动化工作中一般不使用这种方式,因为太过于依赖当前页面结构,一旦页面结构发生变动,之前写的路径可能就失效了。

2.相对路径

与绝对路径的表达相比,是以双斜杠 // 开头,在xml树中从上至下查找任意位置双斜杠后的元素

通过标签名筛选:
//标签名 如: //a

通过标签名+属性筛选:
//标签名[@属性=值] 如: //input[@name="wd"]

通过标签名+文本内容筛选:
//标签名[text()=值] 如: //p[text()="已签到"]

通过contains()匹配部分属性值或者部分文本内容:
//标签名[contains(@属性/text(),要包含的值)]

如:

//input[contains(@class,"s_btn")]
//a[contains(text(),"123")]

逻辑运算:and or
//标签名[@属性=值 and @属性=值 and @属性=值]
//标签名[text()=值 and @属性=值]
//标签名[contains(@属性/text(),要包含的值) and @属性=值]

(1)从上到下的层级定位

//表达式1//表达式2 --- 第二个//,是在第一个//表达式1找到的元素的子孙后代当中去定位。
//表达式1/表达式2 --- 第二个/,是在第一个//表达式1找到的元素的儿子当中去定位。

//div[@id="u1"]//a

//div[@id="u1"]/a

(2)轴定位

可以用于定位会改变的元素

通过子孙元素,找父元素、祖先元素。
通过兄弟姐妹元素,找元素。

image.png

使用语法:
已知的元素/轴名称::标签名称[@属性=值]
例:

//div//table//td//preceding::td

//span[contains(text(),"发布时间")]/parent::div/preceding-sibling::h6

3.与JsonPath对比

image.png

三、正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

在python中需要先安装 re 模块 pip install re

在Notepad等文本编辑器中也可以直接使用正则表达式对文本进行匹配查找,批量修改等操作

符号含义:

image.png

可参考百度百科:https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin

在python中的用法:

https://www.runoob.com/python/python-reg-expressions.html

3 操作
raylee 在 2021-07-10 18:17:47 更新了该帖
raylee 在 2021-07-10 18:11:27 更新了该帖
raylee 在 2021-07-10 18:08:19 更新了该帖
1 回帖
请输入回帖内容 ...
  • raylee
        def get_sql_replace_keys(self,check_db):
            """
            正则获取需要替换的key,list
            :param check_db:
            :return:
                   :type=list
                   需要替换的字段list
                   [mobile_phone1,mobile_phone2]
            """
            re_str = "#(\w.+?)#"
            key_list = re.findall(re_str,check_db)
            return key_list