【Web自动化测试】
一只雪球球 2024-08-29 11:03:02 阅读 86
怎么理解自动化测试?
自动化测试的核心就是测试。将页面操作完成的代码完成以后,根据断言判断前端页面的提示信息是否符合预期,也要检查数据库中的数据是否变化。比如,新增一个帖子类型,预期前端页面提示“操作成功”,数据库也会新增一条记录。
前言
1.selenium自动化测试的三板斧:定位元素、交互元素、进行断言
2.八大定位策略:id、name、css、xpath、class_name、tag_name、link_text、partial_link_text
3.准备工作:下载python和pycharm,在终端输入命令:pip install webdriver-helper
4.什么是web自动化测试:使用自动化工具模拟用户与网页进行交互,用来验证网页的功能、性能、用户界面是否符合预期。
5.什么样的项目适合自动化测试:需求变动不频繁、项目周期长、需要回归测试
6.自动化脚本的编写步骤:导包->获取浏览器对象和url->查找并关闭元素->关闭浏览器
一.selenium-元素定位
1.元素定位:通过元素信息或元素层级结构来定位。
2.提问:什么是元素层级结构
html页面是由标签构成的,标签结构是:
<标签名 属性名1=“属性值1”属性名2=“属性值2” >文本</标签名>
3.为什么使用元素定位?
因为要使用web自动化操作元素,要先定位元素
4.定位元素时依赖什么?
①元素属性:id、name、class_name(元素的class属性)
②元素标签名称:tag_name(标签名称<标签名...>)
③超链接文本:link_text、partial_link_text
④元素路径:xpath
⑤选择器:css
5.为什么常用的定位方法是xpath和css?
因为id、name、class依赖于元素的属性,如果元素没有这些属性就定位不了,tag_name只能找页面唯一的元素,link_text和partial_link_name只能定位超链接。
1.id定位
说明:元素有id属性且必须唯一
方法:driver.find_element(By.ID,'id')
ps:url中的路径’/‘是浏览器路径,’\‘是本地路径。
<code>from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://baidu.com')
sleep(3)
driver.quit()
username = driver.find_element(By.ID,'user')
2.name定位
说明:元素有name属性,可以重复。
方法:driver.find_element(By.NAME,'name')
#导包
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
#获取浏览器对象
driver = webdriver.chrome()
#获取url
url = ('http://baidu.com')
#通过name定位元素且输入数据
name = driver.find_element(By.NAME,'name').send_keys('admin')
password = driver.find_element(By.NAME,'password').send_keys('123')
#暂停3秒后关闭浏览器窗口
sleep(3)
driver.quit()
3.class_name定位
说明:是对class属性进行定位(html页面通过class属性来定义样式)
方法:driver.find_element(By.CLASS_NAME,'属性名')
#获取浏览器对象和网址
driver = webdriver.Chrome()
driver.get('http://localhost:8080/#/login')
#在输入框中输入用户名和密码
name = driver.find_element(By.CLASS_NAME,'el-input__inner').send_keys('admin')
sleep(6)
driver.quit()
4.tag_name定位(了解)
说明:对标签名称进行定位,标签名就是尖括号紧挨着的单词或字母。如果页面中有多个相同标签,默认返回第一个。
方法:driver.find_element(By.TAG_NAME,'标签名')
5.link_text和partial_link_text
说明:只能定义超链接标签,link_text是精准匹配。partial_link_text是精准或模糊匹配,当进行模糊匹配时,最好使用能代表唯一性的词,如果有多个值返回第一个。
方法:driver.find_element(By.LINK_TEXT,'链接文本')
6.XPath定位
说明:基于元素路径定位
方法:driver.find_element(By.XPATH,'路径')
定位策略:
①路径
绝对路径:以/开头
相对路径:以//开头,后面跟元素名称
②路径+属性
//input[@id='id值 ']
③路径+逻辑
//input[@id = ' ' and @属性 = ' 属性值']
④路径+层级
//*[@id = '父级id属性值 ' ]/input
input后面的内容可以删去
注:
一般更建议使用标签名而不是*,这样效率会快
无论是绝对路径还是相对路径,/后面都要跟标签名或*
能使用相对路径不使用绝对路径
⑤扩展
//*[text()='xxx'],定位文本内容为xxx的元素,一般是p标签、a标签
//*[contains(@属性,'属性值')],定位属性值中包含xxx的元素,contains是关键字不可修改
//*[starts-with(@属性,'属性值')],定位属性值中开头是xxx的元素,start-with是关键字不可修改
7.css定位
说明:css是一种语言,描述html页面的显示样式。使用css选择器来进行定位。
方法:driver.find_element(By.CSS_SELECTOR,' ')
常用策略:
①id选择:#id
②class选择器:.class
③属性选择器:[属性名='属性值']
④元素选择器:element
⑤层级选择器:p>input和p input(>必须是连续父子级,空格中间可以跨父级)
⑥扩展
input[type^='xx'],定位到以xx开头的元素
input[type$='xx'],定位到以xx结尾的元素
input[type*='xx'],定位到包含xx的元素
二.selenium-API操作
1.元素操作
1.为什么要学习元素操作?是为了模拟用户输入、删除、点击操作。
2.常用方法:
click() 单击元素
send_keys(value) 模拟输入
clear() 清除文本(可以用在“重新输入”这个要求中,也就是先清空再输入)
driver.maximize_window() 最大化浏览器窗口
driver.set_window_size(w,h) 设置窗口的大小,单位是像素
driver.set_window_position(x,y) 设置窗口的位置
driver.back() 后退
driver.forward() 前进
driver.refresh() 刷新
driver.title 获取当前页面title信息
driver.current_url 获取当前页面的url信息
driver.close() 关闭当前主窗口
driver.quit() 关闭driver对象启动的所有窗口
<code>#导包
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
def main():
#获取浏览器对象和url
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#将浏览器最大化
driver.maximize_window()
sleep(2)
#设置固定大小(300,200)
driver.set_window_size(300,200)
sleep(2)
#移动窗口:320,150
driver.set_window_position(320,150)
sleep(2)
#重新让浏览器最大化
driver.maximize_window()
sleep(2)
#后退
driver.back()
sleep(2)
#前进
driver.forward()
sleep(2)
#关闭驱动对象
driver.quit()
if __name__ == "__main__":
main()
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
def main():
driver = webdriver.Chrome() #获取浏览器对象和url
driver.get("http://www.baidu.com")
driver.find_element(By.NAME,'wd').send_keys('蛋白质') #为了实现刷新操作,先在搜索框输入文本
sleep(3)
driver.refresh() #刷新
sleep(3)
title = driver.title #获取当前网页的title
print("当前页面的title是:",title)
url = driver.current_url #获取当前网页的url
print("当前网页的url是:",url)
driver.find_element(By.XPATH,'//*[@id="s-hotsearch-wrapper"]/div/a[1]/div').click() #为了实现关闭当前主窗口操作,先打开一个新网页code>
sleep(3)
driver.close() #只关闭当前主窗口(默认启动的页面)
sleep(3)
driver.quit() #quit关闭的是由driver启动的所有窗口
if __name__ == "__main__":
main()
2.元素信息获取
①为什么要获取页面元素信息:为了验证当前页面或元素的准确性
②常用方法
text 获取元素文本
size 获取元素大小
get_attribute() 获取元素属性值,括号里要带属性名
is_displayed 判断元素是否可见
is_selected 判断元素是否可见
is_enabled 判断元素是否可用
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
def main():
#获取浏览器页面和url
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#获取搜索框的大小
size = driver.find_element(By.CSS_SELECTOR,'#kw').size
print("搜索框大小为:",size)
#获取超文本链接的内容
text = driver.find_element(By.XPATH,'//*[@id="hotsearch-content-wrapper"]/li[1]/a/span[2]').textcode>
print("超文本链接内容为:",text)
#获取超文本链接的属性
url = driver.find_element(By.XPATH,'//*[@id="s-top-left"]/a[1]').get_attribute("href")code>
print("超文本链接的属性值:",url)
#判断元素是否可见
display = driver.find_element(By.XPATH,'//*[@id="u"]/a[1]').is_displayed()code>
print("是否可见:",display)
#判断搜索按钮是否可用
enable = driver.find_element(By.XPATH,'//*[@id="su"]').is_enabled()code>
print("搜索按钮是否可用:",enable)
#判断用户协议是否被选中
driver.find_element(By.XPATH,'//*[@id="s-top-loginbtn"]').click()code>
sleep(3)
select = driver.find_element(By.XPATH,'//*[@id="s-top-loginbtn"]').is_selected()code>
print("用户协议是否被选中:",select)
if __name__ == "__main__":
main()
3.鼠标和键盘操作
①为什么使用模拟鼠标?为了满足html的鼠标效果。selenium框架中将对鼠标的操作方法都封装在ActionChains类中。
②常用方法
action = ActionChains(driver)
perform() 执行
action.context_click().perform() 模拟右键
action.double_click().perform() 模拟双击
action.move_to_element().perform() 模拟悬停
action.drag_and_drop(source,target).perform() 模拟拖拽
<code>from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
def main():
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
sleep(3)
#下面是模拟鼠标的操作
action = ActionChains(driver)
#在搜索框模拟右键,预期:出现粘贴选项
input = driver.find_element(By.ID,'kw')
action.context_click(input).perform()
sleep(2)
#在搜索框输入文本并模拟双击,预期:文本被选中
text = driver.find_element(By.ID,'kw').send_keys('三伏天')
sleep(2)
action.double_click(input).perform()
sleep(3)
#移动到相机图片上模拟悬停,预期:出现“按图片搜索”
button = driver.find_element(By.XPATH,'//*[@id="form"]/span[1]/span[1]')code>
action.move_to_element(button).perform()
sleep(2)
driver.quit()
if __name__ == "__main__":
main()
①为什么使用键盘?因为可以模拟键盘上一些按键或者组合键的输入。selenium框架把键盘的方法都封装在keys中。
②常用方法:
send_keys有三个作用:输入、发送、上传
send_keys(Keys.BACK_SPACE) 删除
send_keys(Keys.SPACE) 空格
send_keys(Keys.TAB) 制表键
send_keys(Keys.ENTER) 回车
send_keys(Keys.ESCAPE) 回退
send_keys(Keys.CONTROL,'a') 全选 ctrl+A
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
def main():
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
sleep(2)
#在搜索框输入“hello”,暂停两秒后删除o
word = driver.find_element(By.ID,'kw')
word.send_keys("hello")
sleep(2)
word.send_keys(Keys.BACKSPACE)
sleep(2)
#全选操作
word.send_keys(Keys.CONTROL,'a')
sleep(2)
#剪切
word.send_keys(Keys.CONTROL,'x')
sleep(2)
#粘贴
word.send_keys(Keys.CONTROL,'v')
sleep(2)
driver.quit()
if __name__ == "__main__":
main()
3.元素等待
①什么是元素等待?
第一次没找到元素的时候,元素等待时长被激活。如果在指定时间内可以找到就继续执行代码,如果找不到,就报元素未找到异常。
②为什么设置元素等待?
为了防止抛出异常
③分类
隐式等待:
定位元素时,如果能直接找到就不会触发等待,如果到达指定最大时长还没找到就会触发等待,抛出元素不存在异常。
方法:driver.implicitly_wait(30) 一般设置等待时长为30s
注:
针对所有元素生效
为前置必写代码(1.获取浏览器对象,2.最大化浏览器 3.隐式等待)
显式等待:
抛出的是超时异常,用到WebDriverWait包
方法:
WebDriverWait(driver, timeout=10, poll_frequency = 0.5).until(lambda x : x.find_element(By.ID,' '))
timeout是超出时间
poll_frequency是访问频率,默认0.5秒
x是driver
一整个返回的是一个元素
注:对单个元素生效
4.窗口操作
4.1下拉框
说明:实例化select时,必须得是select标签元素。调用Selectl类下面的方法时,是通过索引、value属性值、显示文本去控制的,而不需要click事件。
方法:
select_by_index() 通过下标定位
select_by_value() 通过属性值定位
select_by_visible_text() 通过显示文本定位
步骤:
s = Select(element) 实例化
s.select_by_index()
或者 Select(driver.find_element(By.XPATH,' ')).select_by_index()
4.2弹出框
说明:对话框类型有alert警告框、confirm确认框、prompt提示框。如果不对对话框进行处理,就无法进行后续的操作。
步骤:
1.切换到对话框:driver.switch_to.alert
2.处理对话框
alert.text 获取文本
alert.accept 同意
alert.dismiss 取消
4.3滚动条
说明:在web自动化测试中,有一些场景比如需要拉到最底某些功能才可以用。selenium没有直接提供滚动条组件方法,而是使用js语句控制滚动条。
操作:
js = "window.scrollTo(0,10000)" 设置滚动条操作语句,0是左边距(水平滚动),10000是上边距(垂直滚动)
driver.excute_scripts(js)
rame
from selenium.webdriver.support.ui import Select
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
def main():
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.springtour.com/")
sleep(3)
#设置滚动条
js = "window.scrollTo(0,10000)"
driver.execute_script(js)
sleep(3)
driver.quit()
if __name__ == "__main__":
main()
4.4frame表单切换(重点)
说明:frame是html中的一个框架,主要在当前页面中的某一区域显示另一页面元素。比如,一个网页中有三部分内容:注册页面、注册A页面、注册B页面。想通过自动化输入注册信息,发现卡在注册页面,A和B注册页面的信息输入不了。这是因为在源码中,注册页面可以直接找到user、id等元素,而A和B页面都没有userA和userB,怎么会定位的到呢?所以需要表单切换。
为什么要进行表单切换?因为当前页面没有frame表单元素信息,不切换找不到元素。
方法及步骤:
driver.switch_to.frame("id/name/element") 切换表单
driver.switch_to.default_content() 回主目录(不回主目录找不到表单信息)
4.5窗口切换(重点)
说明:想在跳转后的页面进行操作
方法及步骤:
handle = driver.current_window_handle 获取当前主窗口句柄
handles = driver.current_window_handles 获取所有页面的句柄
for h in handles:
if h != handle
driver.switch_to.window(h) 切换窗口
<code>from selenium.webdriver.support.ui import Select
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
def main():
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
#目标:打开百度首页,点击“新闻”跳转到新闻页面,在新闻页面进行登录操作
driver.get("https://www.baidu.com")
sleep(3)
#获得当前页面(driver启动的页面)的句柄
handle = driver.current_window_handle
print("当前窗口的句柄是:",handle)
#点击“新闻”跳转页面
driver.find_element(By.XPATH,'//*[@id="s-top-left"]/a[1]').click()code>
sleep(3)
# 获取所有页面句柄
handles = driver.window_handles
print("所有窗口的句柄是:", handles)
#遍历句柄,判断不是driver启动页面的句柄后,才可以进行登录操作
for h in handles:
if h != handle:
# 在跳转后的新闻页面点击“登录”按钮
driver.switch_to.window(h)
driver.find_element(By.XPATH, '//*[@id="passLog"]').click()code>
sleep(3)
driver.quit()
if __name__ == "__main__":
main()
4.6窗口截图
应用场景:失败截图,让错误更直观
方法:
driver.get_screenshot_as_file(imagepath)
imagepath是存储路径:./s.png 是保存在当前目录,../s.png是保存在上一级目录
driver.ger_screenshot_as_file("./%s.png"%(time.strftime("%Y_%m_%d %H_%M_%S")))
strftime是将时间转为字符串函数
<code>import time
from selenium.webdriver.support.ui import Select
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
def main():
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
sleep(3)
driver.get_screenshot_as_file("./%s.png"%(time.strftime("%Y_%m_%d %H_%M_%S")))
sleep(3)
driver.quit()
if __name__ == "__main__":
main()
4.6验证码
说明:随机生成的信息防止恶意请求,增加安全性。
方式:通过cookie(推荐)
提问:
什么是cookie?有什么作用?可以在哪里使用?
cookie是服务器生成的,用来在登录状态下标识一次对话的状态。浏览器自动记录cookie,在下一条请求时自动附加cookie信息。
通过cookie登录的方法及步骤:
driver.add_cookie({'name' : ' ','value':' cookie值'}) 需要提前获取cookie值
cookie = driver.get_cookies
print(cookie ) 打印所有的cookie信息
import time
from selenium.webdriver.support.ui import Select
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
def main():
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
sleep(3)
#使用cookie登录百度
driver.add_cookie({'name':'BDUSS','value':'lzMWNETTNaS1BMd1daZFlvflQ0dmhRamdBaXhvNlV2VzAwcDRPaDktTWxxTHBtRUFBQUFBJCQAAAAAAQAAAAEAAACWyROIamllaGh3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUbk2YlG5NmWU'})
sleep(2)
cookie = driver.get_cookies()
print(cookie)
driver.refresh()
sleep(3)
driver.quit()
if __name__ == "__main__":
main()
三.UnitTest框架
1.提问:什么是UnitTest框架?为什么使用这个框架?
UnitTest是python自带的单元测试框架。这个框架可以批量执行多个用例、有丰富的断言、自动生成报告。
2.核心要素有哪些:
testcase测试用例、testsuite测试套件、texttestrunner以文本形式运行测试用例、testloader批量执行测试用例,搜索指定文件夹内指定字母开头的文件、fixure固定装置,一个初始化时使用,一个结束时使用。
1.核心要素
①TestCase
步骤:
导包:import unittest
定义测试类:新建的测试类必须继承unittest.Testcase
定义测试方法:测试方法名以test开头
<code>#导包
import unittest
#编写求和函数
def add(x,y):
return x + y
#定义测试类
class Test01(unittest.TestCase):
#定义测试方法,以test开头
def test_add01(self):
result = add(1,1)
print("结果为:",result)
def test_add02(self):
result = add(2,1)
print("结果为:",result)
②TestSuite
步骤:
导包: import unittest
实例化:suite = unittest.TestSuite()
添加用例:
①suite.addTest(类名('方法名')) 添加指定类中的指定方法
②suite.addTest(unittest.makeSuite(类名)) 添加指定类中所有test开头的方法
执行:
runner = unittest.TextTestRunner()
runner.run(suite)
③TextTestRunner
作用:运行测试套件
步骤:
runner = unittest.TextTestRunner
runner.run(suite)
④TestLoader
操作步骤:
导包:import unittest
调用TestLoader():suite=unittest.TestLoader().discover("指定文件路径","指定字母开头的文件.py")
执行测试套件:unittest.TextTestRunner().run(suite)
TestSuite和TestLoader的对比:
相同点:都是测试套件
不同点:
①TestSuite:
②TestLoader:
⑤Fixure
说明:Fixure是两个函数,一个初始化函数def setup(),一个是结束函数def teardown()。可以同时使用也可以单独使用。
级别:
①函数级别:def setUp()/def tearDown()
特性:几个测试函数就执行几次
②类级别:def setUpclass()/def tearDownClass(),要添加索引@classmethod
特性:测试类执行之前执行一次,setupclass执行之后执行一次teardownclass
③模块级别:def setUpModule()/def teaDownModule()
特性:模块运行之前执行一次 setupmodule,运行之后执行一次teardownmodule
<code>import unittest
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setupclass执行")
@classmethod
def tearDownClass(cls):
print("teardownclass执行")
def setUp(self):
print("执行")
def test01(self):
print("test01执行")
def test02(self):
print("test02执行")
def tearDown(self):
print("结束")
2.断言
说明:判断执行结果是否符合预期结果
常用方法:
self.assertTrue(ex) 判断ex是否为真
self.assertIn(ex1,ex2) 判断ex2是否包含ex1
self.assertEqual(ex1,ex2) 判断两个字符串是否相等
<code>import unittest
class Test(unittest.TestCase):
def test01(self):
#断言是否为true
flag = True
self.assertTrue(flag)
#断言是否相等
self.assertEqual("hello","hello")
#断言后面字符串是否包含前一个字符串
self.assertIn("hello","hello,myallsf")
3.参数化
说明:什么是参数化?为什么要参数化?参数化的应用场景?
答:参数化就是根据需求动态获取数据的过程。参数化可以解决代码冗余的问题。可以应用在业务逻辑相同但测试数据不同的场景。
应用:
安装插件:pip install parameterized
导包:from parameterized import parameterized
修饰测试函数:@parameterized.expand([数据])
数据格式:
单个参数,类型为列表
多个参数,类型为列表嵌套元组
import unittest
from parameterized import parameterized
class Test(unittest.TestCase):
#写法1
@parameterized.expand(["1","2","3"])
def test_add_one(self,num):
print("num:",num)
#写法2
@parameterized.expand([(1,2,3),(4,5,6),(7,8,9)])
def test_add_more(self, a,b,result):
print("{}+{}={}:".format(a,b,result))
#写法3
def get_data(self):
return ([(1,2,3),(4,5,6),(7,8,9)])
@parameterized.expand(get_data())
def test_add_more(self,a,b,result):
print("{}+{}={}:".format(a,b,result))
4.跳过
说明:用于未完成或者条件不满足的测试用例和测试函数
方法:
@unittest.skip("说明"):适用于未完成的情况
@unittest.skipIf(条件,原因):适用于不满足测试条件的情况
import unittest
version = 30
class Test01(unittest.TestCase):
@unittest.skip("test01功能暂未完全实现")
def test01(self):
pass
@unittest.skipIf(version > 25,"如果版本大于25就跳过次用例")
def test02(self):
print("test02执行")
5.html报告
ps:文件流就是打开指定写入的文件
说明:测试用例执行完后,执行结果以html形式生成
步骤:
①导包:from xx.HTMLTestRunner.py import HTMLTestRunner
②定义测试套件:suite = unittest.defaultTestLoader.discover(测试用例存放路径,"以字母开头的测试用例.py")
③定义报告存放路径:report_dir = "../xx/{}.html".format(time.srtftime("%Y_%m_%d %H_%M_%S"))
④获取报告文件流:
with open(report_dir,"wb") as f:
HTMLTestRunner(stream=f,verbosity=2,title="",description="").run(suite)
四.PO模式
说明:Page Object模式是将测试代码和业务代码进行分离。
这样数据还是不好管理,应该封装成数据层:
创建data包->pip install pandas和pip install xlrd==2.0.1 ->使用excel来存放数据
五.数据驱动
说明:
1.什么是数据驱动?
通过测试数据控制用例的执行,直接影响测试结果
最好是po模式+参数化
2.为什么要数据驱动?
将维护重点放在测试数据上,而不是测试脚本代码
3.数据驱动常用格式
json、xml、txt、excel、csv
1.json介绍
说明:
是一种纯文本格式,后缀.json
是一种轻量级数据交换格式
由键值对组成
花括号包含键值对,中括号包含数组,键值对直接用逗号分隔,键与值用冒号分隔
2 json格式转换
<code>'''将字典转换为json格式'''
#导包
import json
#定义字典
dic = {"name":"张三","age":12}
print("转换之前的数据类型:",type(dic))
#调用dumps()方法进行转换
dic2 = json.dumps(dic)
print("转换之后的数据类型:",type(dic2))
print(dic2)
print("--------------------------------")
'''将字符串转换为json格式'''
#定义字符串
str = '{"name":"张三","age":12}'
print("转换之前的数据类型:",type(str))
#调用loads()方法进行转换
str2 = json.loads(str)
print("转换之后的数据类型:",type(str2))
3.json读与写
读
写(这里文件名取错了,应该是test02_json_write)
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。