QTP实践总结
QTP实践总结
查询数据库修改freq
1.Testcasetable创建查询select * from testcasetable order by fseq desc
2.设计表-选项-修改自动递增数值
新建Action 需要修改Script.mts(D:\NewSoftShop\NewSoftShop\Action0)文件,把文件中新增的Action注释,重打开脚本
一、获取某个表格中指定位置的字符并累加输出:
(1)、对象转换:
tobj(i).object.children(0).innertext;将QTP对象转换为COM对象
(2)、累加输出:
str1= str1& tobj(i).object.children(0).innertext & ";" & tobj(i).object.children(1).innertext & "||"
完整方法:
Set obj=Description.Create()
obj("html tag").Value="TR"
Set tobj=Browser("NearMe市场后台 - 新排行榜管理").Page("NearMe市场后台 - 新排行榜管理").Frame("main_2").WebElement("html id:=table1","html tag:=table","class:=tb tb2","index:=1").ChildObjects(obj)
Msgbox tobj.count
For i=1 to tobj.count-2
str1= str1& tobj(i).object.children(0).innertext & ";" & tobj(i).object.children(1).innertext & "||"
Next
Msgbox str1
二、选择时间输入框当使用Set执行无效是需使用Object转换后再通过“Value=”输入时间:
Browser("NearMe市场后台 - 新排行榜管理").Page("NearMe市场后台 - 新排行榜管理_4").Frame("main_2").WebEdit("name:=starttime","html tag:=INPUT","type:=text").Object.Value="2015-01-08 15:36:55"
Browser("NearMe市场后台 - 新排行榜管理").Page("NearMe市场后台 - 新排行榜管理_4").Frame("main_2").WebEdit("name:=endtime","html tag:=INPUT","type:=text").Object.Value= "2015-01-09 15:36:55"
获取系统当前时间:now
比较时间:Cdate(Result)>=Cdate("2012-05-01 09:01:00") and Cdate(Result)<=Cdate("2014-06-05 22:59:59")
三、获取某个位置输入后得到的值,使用描述性编程描述对象后通过Object转换得到value值:
ID=Browser("NearMe市场后台 - 新排行榜管理").Page("NearMe市场后台 - 新排行榜管理").Frame("main").WebElement("html tag:=input","html id:=content").Object.value
Msgbox ID
四、获取一个html tag下的子对象:
如获取“TR”下tag为“strong”的值可使用方法:
tobj=Browser("…").Page("…").Frame("…").WebElement("…").ChildObjects(obj)
tobj(0).object.getElementsByTagName("STRONG")(0).innertext
五、Object、parentElement、GetElementsbyTagName,可同名子对象查找父对象:
说明:先使用描述性编程描述所要操作的子对象,通过Object将QTP对象转化为html 对象,再使用parentElement方法查找子对象查找上一层父对象,如果所查找位置未得到想要的结果继续查找上一层加一层(. parentElement),查找到对应结果后使用GetElementsbyTagName(“”)对应的html tag名称,如果有多个,添加(index),获取需要的值(.innertext)
Set Button=Browser("").Page("").Frame("").Link("html tag:=A","innertext:=添加","index:=0")
Msgbox Button.Object.parentElement.parentElement.GetElementsbyTagName("TD")(0).title
Button.Click
补充:如果出现获取不到时在Object后增加Document,
示例:
Button.Object.Document.parentElement.parentElement.GetElementsbyTagName("TD")(0).title
六、Trim(string…)使用方法,去除所获取字符串的前后空格
七、去除获取字符串中的字符,使用Replace(string,”需取代字符”,”替换字符”)(如:省略号)
SetButton=Browser("…").Page("…").Frame("main_6").WebElement("htmltag:=FONT","innertext:=…","index:=0") str=Button.Object.parentElement.parentElement.parentElement.GetElementsByTagName("TD")(2).innertext
Tname=Replace(str,"…","")
使用Left 或者Right获取前几个字符
TdName=Left(text,2)
TdName=Right(text,2)
删除段落前空格:
vbCrLf
vbTab
八、选择日期
方式一:
Browser("…").WebEdit(“html tag:=INPUT”,”html id:=startDate”).set “2015-12-02”
方式二:
Browser("…").WebEdit(“html tag:=INPUT”,”html id:=startDate”).Object.value= “2015-12-02”
Browser("Browser_2").Page("预算追加").WebEdit("html id:=txtPStartDate","html tag:=INPUT","html type:=text","html name:=WebEdit").Object.value="2014-10-09"
九、添加图片
Browser("…").Page("…").Frame("…").WebFile("pic_old").Click
Browser("…").Dialog("…").WinEdit("文件名(N):").Set "D:\NewSoftShop\resource\JPG\300x170.jpg"
Browser("…").Dialog("…").WinButton("打开(O)").Click
十、同行控件查找
转换为html方式的脚步无法对点击后或产生对话框的空间进行操作(如”删除”按钮),因为vbs脚本为单线程,弹出对话框后会停止脚本运行
十一、当前页面中的隐藏页面,使用描述性变成时需要先转换为Object,再逐层获得所需的值:
如:
Browser("").Page("").Frame("main").WebElement("html tag:=DIV","html id:=add").Object.style.display
十二、页面隐藏形式界面的检查方法
如:
Str= Browser("…").Page("..").Frame("main").WebElement("html tag:=DIV","html id:=addDiv").Object.style.display
Msgbox Str
If instr(Str,"none")<=0 Then
insertDataBasenew "fseq", fseq,"pass"&time
Else
insertDataBasenew "fseq", fseq,"fail"&time
End If
页面隐藏时display值为none;页面显示时display值为block
十三、翻页查找判断
循环方式实现:
'翻页查询使用循环判断
'找到对象所在页面
Function FindElement(Mname)
Browser("…").Page("..").Link("管理员").Click
Browser("…").Page("…").Link("管理员管理").Click
Mystate="false"
If Browser("…").Page("…").webelement("html tag:=DIV","class:=pg").Exist(2)Then
Strs=Browser("…").Page("…").webelement("html tag:=DIV","class:=pg").GetROProperty("innertext")
str=Split(Strs," ")
Num=str(1)
Mnum=int(int(Num-1)/10)+1
else
Mnum=1
End If
For i=1 to Mnum
If Browser("…").Page("…").Link("text:=" &Mname,"html tag:=A" ).Exist (2) Then
Mystate="true"
Exit for
else
If Mnum>i Then
j=i+1
Browser("…").Page("…").Link("html tag:=A","text:="&j).click
End If
End If
Next
FindElement=Mystate
End Function
'找到对象所在页面
Function FindElement(Mname)
'Browser("NearMe市场后台 - 搜索词运营管理").Page("NearMe市场后台 - 搜索词运营管理").Link("搜索词运营管理").Click
Mystate="false"
If Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 临时活动").WebElement("html tag:=DIV","class:=pg").Exist(2)Then
Strs=Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 临时活动").WebElement("html tag:=DIV","class:=pg").GetROProperty("innertext")
str=Split(Strs," ")
Num=str(1)
Mnum=int(int(Num-1)/10)+1
else
Mnum=1
End If
For i=1 to Mnum
If Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 临时活动").WebElement("innertext:="&Mname,"html tag:=TD" ).Exist (2) Then
Mystate="true"
Exit for
else
If Mnum>i Then
j=i+1
Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 临时活动").Link("html tag:=A","text:="&j).click
End If
End If
Next
FindElement=Mystate
End Function
递归方式实现:
'翻页查询使用递归循环
Function funloop()
Set BrowserObject=Browser("…").Page("…").Frame("main").WebElement("html tag:=table","html id:=table1")
If BrowserObject.WebElement("html tag:=DIV","class:=pg").Exist(2) Then
Str=BrowserObject.WebElement("html tag:=DIV","class:=pg").GetROProperty("innertext")
Msgbox Str
Onum=split(Str," ")
Msgbox Onum(1)
Num=int(Abs(int(Onum(1))-1)/10)+1
Msgbox Num
Else
Num=1
End If
Set trs=BrowserObject.Object.GetElementsByTagName("tr")
Knum=BrowserObject.WebElement("html tag:=DIV","class:=pg").Object.GetElementsByTagName("strong")(0).innertext
Msgbox trs.length
For trindex=1 to trs.length-2
Strs=trs(trindex).innertext
Msgbox Strs
If instr(Strs," QTP测试")>0 Then
res=true
Exit For
End If
Next
if(res=True) then
msgbox fseq & ":pass"
elseif instr(Num,Knum)>0 then
msgbox fseq & ":fail"
else
Browser("…").Page("…").Frame("data-rule-gt_2").WebEdit("name:=custompage","html tag:=INPUT").Object.value=Knum+1
Set WshShell =CreateObject("WScript.shell")
WshShell.Sendkeys "{ENTER}"
Msgbox "翻页"
funloop()
End If
End Function
‘最新提炼方法(查找对象所在界面)
'找到对象所在页面
Function FindElement(Mname,TdName)
Mystate="false"
If Browser(BrowserName).Page(PageName).webelement("html tag:=DIV","class:=pg").Exist(2)Then
Strs=Browser(BrowserName).Page(PageName).webelement("html tag:=DIV","class:=pg").GetROProperty("innertext")
str=Split(Strs," ")
Num=str(1)
Mnum=int(int(Num-1)/10)+1
else
Mnum=1
End If
For i=1 to Mnum
If Browser(BrowserName).Page(PageName).WebElement("innertext:="&Mname,"html tag:="&TdName,"index:=0" ).Exist (2) Then
Mystate="true"
Exit for
else
If Mnum>i Then
j=i+1
Browser(BrowserName).Page(PageName).Link("html tag:=A","text:="&j).click
End If
End If
Next
FindElement=Mystate
End Function
十四、随机选取下拉列表中元素
实现方式:
itemscount = WebList.GetROProperty ("items count") '获得下拉框选项个数
Rn=RandomNumber (0,itemscount-1) 'QTP特有的随机函数
WebList.Select Rn '用序号来选择
示例:
'随机获取下拉列表中元素
Set BrowserObject1=Browser("…").Page("…").Frame("main_5").WebList("select")
itemscount = BrowserObject1.GetROProperty ("items count") '获得下拉框选项个数
Rn=RandomNumber (0,itemscount-1) 'QTP特有的随机函数
BrowserObject1.Select Rn '用序号来选择
十五、随机获取下拉列表中元素后获取对应元素的属性值
- 直接定位需要获取元素位置
Set ObjSelect=Browser("NearMe市场后台 - 活动中心").Page("NearMe市场后台 - 活动中心").Frame("main_5").WebElement("html tag:=select","html id:=remain")
- 找到所要获取元素的属性值,唯一的属性
selection= int(replace(ObjSelect.GetROProperty("selected item index"),"#",""))
- 获取所需元素值
ObjSelect.Object.options(selection).text
十六、Function获取某个位置的值时需要设置返回值才能获取到对应文本
示例:获取表格中某行某列的值
'获取某行某列资源名称
Function GetTdName(IdTag,ID,IdIndex,TrIndex,TdIndex)
Set BrowserObject=Browser("…").Page("…").WebElement("html tag:="&IdTag,"html id:="&ID,"index:="&IdIndex)
Set Trs=BrowserObject.Object.GetElementsByTagName("TR")
GetTdName=Trs(TrIndex).GetElementsByTagName("TD")(TdIndex).innertext
End Function
十七、获取有数字和文本字符串后如果需要对获取的数字进行运行要先使用Cint转换为整形
示例:
Num1=Cint(Replace(Replace( TdName1(1).GetRoProperty("innertext"),"取消","")," ",""))
转换后Num1为整形,此时可进行运算
十八、实现双击使用 FireEvent "ondblclick"
示例:
Set BrowserObject=Browser("NearMe市场后台 - 运营点组合").Page("NearMe市场后台 - 运营点组合").WebElement("html id:=conbination","html tag:=table")
Set Trs2=BrowserObject.Object.GetElementsByTagName("TR")
Trs2(2).GetElementsByTagName("TD")(0).FireEvent "ondblclick"
十九、html 标签A 带有href属性才能被QTP识别,否则需转换为html 对象,QTP才能
示例:
Set BrowserObject=Browser("NearMe市场后台 - 运营点组合").Page("NearMe市场后台 - 首页").WebElement("html tag:=table","html id:=table1")
Set Trs=BrowserObject.Object.GetElementsByTagName("TR")
For i=1 to Trs.length-1
If instr(Trs(i).outerhtml,TdName)>0 Then
Trs(i).GetElementsByTagName("A")(1).Click
Exit For
End If
Next
二十、杀毒软件阻止QTP点击跳转等操作
处理办法:退出杀毒软件
二十一、QTP中出现复制粘贴脚本失败、直接脚本失败,可能原因是脚本出现乱码
处理办法:在对应Action下打开Script.mts文件,将@@及其后乱码删除,重新保存即可完成修改
示例:ZJB_Manage后台,Login模块出现此问题
二十二、QTP获取class属性值是使用classname
示例:
Browser("…").Page("…").WebElement("…").WebElement("…").Object.Classname
二十三、获取列表中某行某列资源
'获取某一行某一列的元素
Function GetElementByPosition(ID,TrIndex,TdIndex)
Dim Oname
Set BrowserObject=Browser("..").Page("..").WebTable("html id:="&ID)
Set trs= BrowserObject.Object.getElementsByTagName("tr")
Set tds= trs(TrIndex)
Oname= trim(trs(trindex).children(TdIndex).innertext)
GetElementByPosition=Oname
End Function
二十四、精确点击某行按钮
'点击编辑、删除等按钮
Function ClickButton(Tag,ID,TdName, ButtonTag, PropertyName,ButtonName)
Set obj=Description.Create()
obj("html tag").value="TR"
Set tobj=Browser("…").Page("…").WebElement("html tag:="&Tag,"html id:="&ID).ChildObjects(obj)
For i=0 to tobj.count-1
TrName=tobj(i).GetRoProperty("innertext")
If instr(TrName,TdName)>0 Then
Set aobj=Description.Create()
aobj("html tag").value=ButtonTag
aobj(PropertyName).value=ButtonName
Set taobj=tobj(i).ChildObjects(aobj)
taobj(0).Click
Exit For
End If
Next
End Function
'点击缺少href属性的编辑、下架等无弹出框按钮
Function ClickButton(Tag,ID,IDIndex,TdName,ButtonTag,ButtonIndex)
Set BrowserObject=Browser(BrowserName).Page(PageName).WebElement("html tag:="&Tag,"html id:="&ID,"index:="&IDIndex)
Set Trs=BrowserObject.Object.GetElementsByTagName("TR")
For i=1 to Trs.length-1
If instr(Trs(i).outerhtml,TdName)>0 Then
Trs(i).GetElementsByTagName(ButtonTag)(ButtonIndex).Click
Exit For
End If
Next
End Function
'点击缺少href属性的删除等有弹出框按钮
Function ClickDel(Tag,ID,IDIndex,TdName,ButtonName,ButtonTag)
Set BrowserObject=Browser(BrowserName).Page(PageName).WebElement("html tag:="&Tag,"html id:="&ID,"index:="&IDIndex)
Set Trs=BrowserObject.Object.GetElementsByTagName("TR")
For i=1 to Trs.length-1
If instr(Trs(i).outerhtml,TdName)>0 Then
IndexNum=i
Browser(BrowserName).Page(PageName).WebElement("innertext:="&ButtonName,"html tag:="&ButtonTag,"index:="&IndexNum-1).Click
Exit For
End If
Next
End Function
二十五、通过一个元素获取同行的某列的元素
示例:
'通过一个元素获取同行另一元素
Function GetElementByAnotherElement(Tag,Ename,TdIndex,Index)
Dim Oname
Set BrowserObject=Browser("…").Page("…").WebElement("html tag:="&Tag,"innertext:="&Ename,"index:="&Index)
Set tr= BrowserObject.Object.parentElement
Oname= trim(tr.children(TdIndex).innertext)
GetElementByAnotherElement=Oname
End Function
二十六、点击列表中上移下移操作
示例:
'上移下移
Function ClickSpecialButton(Kname,Tname)
Set objs=Description.Create()
objs("html tag").value="TR"
Set tobjs=Browser("…").Page("…").Frame("main").WebElement("html tag:=table","html id:=table2").Object.GetElementsByTagName("TR")
For x=0 to tobjs.length-1
If instr(tobjs(x).innertext,Kname)>0 Then
Set obj=Description.Create()
obj("html tag").value="A"
Set tobj=tobjs(x).GetElementsByTagName("A")
For i=0 to tobj.length-1
If (instr(tobj(i).title,Tname)>0) Then
tobj(i).Click
Exit For
End If
Next
Exit For
End If
Next
End Function
二十七、如何获取下拉列表中的所有值
Dim stcount2,stnum2,rel2,stobj2
set stobj2=Browser(“XXX系统”).Page(“XXX平台”).Frame(“mainFrame_2″).WebList(“repositorySytleID”).Object
stcount2=stobj2.options.length
For x=0 to stcount2-1
stnum2=GetList(stcount2-1)
rel2=stobj2.options.item(stnum2).text
Next
Function
GetList(i)
Randomize
GetList=RandomNumber(x,i)
End
Function
二十八、对比时间大小
If
Cdate(Result)>=Cdate("2012-05-01 09:01:00") and
Cdate(Result)<=Cdate("2014-06-05 22:59:59") Then
insertDataBasenew "fseq", fseq,"pass" & time
else
insertDataBasenew "fseq",
fseq,"fail" & time
End If
二十九、获取表格TR和TD数量
Set
BrowserPage1=Browser("游戏中心后台管理").Page("游戏中心后台管理")
Set
BrowserPageObject1=BrowserPage1.WebElement("html tag:=table","html
id:=gc_026_002")
Set
Tr1=BrowserPageObject1.Object.GetElementsByTagName("TR")
Tr1Index=Cint(Tr1.length)
Set
Td1= Tr1(Tr1Index).GetElementsByTagName(“TD”)
Td1Index=Cint(Td1.length)
三十、网页刷新办法Refresh
Browser("NearMe市场后台 - 活动中心").Refresh
设置:IE浏览器——工具——管理加载项——BHOManager 开启
三十一、Function之间传递参数
Dim
st
st=””
Function sti
st=1
st=st+1
End
Function
Function
sti2
msgbox st
End
Function
sti2
sti
三十二、使用Do
While
Do
While instr(now,Td_TimeN)>0
ClickButton
"table","tblMsgs",Td_TimeN,"A","innertext","删除"
If
Browser("后台管理").Dialog("来自网页的消息").Exist(2)
Then
Browser("后台管理").Dialog("来自网页的消息").WinButton("确定").Click
Else
Exit
Do
End
If
Loop
三十三、检查链接
在QTP中,对于网页链接的测试可以使用Link对象,例如下面的脚本用于对链接的地址进行检查:
‘ 对链接的地址进行检查
Browser("Welcome: Mercury
Tours").Page("Welcome: Mercury Tours"
).Link("REGISTER").CheckProperty ("url"
,http://newtours.demoaut.com/mercuryregister.php)
其中使用了CheckProperty方法,用于对比Link对象的URL属性是否等于指定的地址。也可以使用Link对象的
Object属性中的href属性来进行比较,例如下面的代码所示:
href = Browser("Welcome: Mercury
Tours").Page("Welcome: Mercury Tours
").Link("REGISTER").Object.href
‘ 如果地址不正确,则报告错误
If NOT href
="http://newtours.demoaut.com/mercuryregister.asp" Then
Reporter.ReportEvent micFail,"Link
Error",href
ExitAction
End If
三十四、初始化执行用例
在For循环中添加
err.clear
三十五、网页执行时某个Action用例不执行
Action名称不能包含与VB启动脚本有相同的关键字(RUN)
三十六、获取下拉列表中某个指定元素(数组中的第几项)
'获取LIST表中的一个选项
Function
getValueFromList(Lid,Index)
Set BrowserObject =
Browser(BrowserName).Page(PageName).WebList("html
id:="&Lid).Object
scount =
BrowserObject.options.length
getValueFromList =
BrowserObject.options.item(Index).text
End
Function
三十七、最大化浏览器-----BrowserOperates
longhwnd,1
QTP实践总结的更多相关文章
- 自动化测试调查问卷送《QTP自动化测试最佳实践》
自动化测试调查问卷送<QTP自动化测试最佳实践> http://automationqa.com/forum.php?mod=viewthread&tid=2308&fro ...
- ABAP单元测试最佳实践
本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...
- QTP脚本--应用参数化来测试某个输入框
以前一直觉得自己没有写代码的资质,太急于求成,以为一天就能写好几个功能,几千行代码,于是就没耐心了,没心情学下去了....但是最近发现其实写代码是一个漫长的过程,都是在修修改改中成长起来的.于是今天试 ...
- QTP脚本不能录制怎么办?
QTP是基于VBS脚本语言的,大部分VBS脚本都能在QTP上运行,只是在一些细节上略有不同,比如说VBS上停止用sleep,QTP上用wait.QTP的强大之处在于对程序窗口的操作,有很多针对窗体的属 ...
- 杨学明老师推出全新课程--《敏捷开发&IPD和敏捷开发结合的实践》
课时:13小时(2天) 敏捷开发&IPD和敏捷开发结合的实践 讲 师:杨学明 [课程背景] 集成产品开发(IPD).集成能力成熟度模型(CMMI).敏捷开发(Agile Developmen ...
- loadrunner和QTP视频教程汇总
小布老师视频: 测试工具概述,兼LoadRunner介绍 -1-4 http://www.boobooke.com/v/bbk1046 http://www.boobooke.com/v/bbk104 ...
- 黑盒测试实践--Day6 11.30
黑盒测试实践--Day6 11.30 今天完成任务情况: 应用设计的场景用例,完成测试用例的编写 完成测试用例在自动化测试工具QTP上的测试 分析测试结果得到缺陷报告 小靳 软件测试 今天主要钻研了q ...
- 黑盒测试实践--Day5 11.29
黑盒测试实践--Day5 11.29 今天完成任务情况: 分析系统需求,完成场景用例设计 小组负责测试的同学学习安装自动测试工具--QTP,并在线学习操作 小黄 今天的任务是完成场景测试用例的设计.在 ...
- 黑盒测试实践--Day3 11.27
黑盒测试实践--Day3 今天完成任务情况: 收到小组紧急通知,作业要求更新了.组长召集大家在下午课后去开个短会,会议信息如下: 时间:11.27 晚上5:30 地点:东九楼501 会议内容: 学习了 ...
随机推荐
- hdoj 2544 最短路(最短路+Dijkstrea算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路分析:该问题给定一个无向图,要求求从起始点到终点的最短路径长度:可以使用dijkstra算法 ...
- hdoj 1532 Drainage Ditches(最大网络流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路分析:问题为最大网络流问题,给定一个有向图,需要求解该有向图的最大网络流,使用Edmonds ...
- JAVA面试中的几个重要基础问题
1.java是否会出现内存溢出?如何解决? 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.为了解决Java中内存溢出问题,我们首先必 ...
- ajenti试用感受
ajenti试用感受_展现技术动态_百度空间 ajenti试用感受 今天看开源中国介绍一款名为"服务器管理系统"的开源软件发布了,名为ajenti,页面感觉不错,对机器的采集信 ...
- [置顶] 使用mongofiles操作GridFS
使用mongofiles操作GridFS GridFS描述: GridFS,看起来像一种文件系统,其实是一种数据库用法.主要用来在数据库中存储二进制大文件.可以统一用数据库处理数据,而无需借助外部的文 ...
- HDU 4725 The Shortest Path in Nya Graph-【SPFA最短路】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:有N个点和N层..一层有X个点(0<=X<=N).两邻两层间有一条路花费C.还有M ...
- python基础补充
关于模块导入方式: import random print random.choice(range(10)) 和 from random import choice print choice(ra ...
- js 模板引擎 jade使用语法
Jade是一款高性能简洁易懂的模板引擎,Jade是Haml的Javascript实现,在服务端(NodeJS)及客户端均有支持. 功能 · 客户端支持 · 超强的可读性 · 灵活易用的缩进 · 块扩展 ...
- Spring源码地址和相关介绍的网址
Spring源码地址下载: https://github.com/spring-projects/spring-framework/tags >多图详解Spring框架的设计理念与设计模式:ht ...
- What is Webhook ( Introduction to Webhook )
A webhook in web development is a method of augmenting or altering the behavior of a web page, or we ...